精华内容
下载资源
问答
  • C语言设计并行处理
    2021-05-21 17:54:31

    要编写一个好的游戏,必需使用到并行机制。并行机制要涉及到一个重要的语句,那就是While语句。你可能不禁会问:那不就是循环吗?对,并行机制就是要利用循环,即游戏循环(Game Loop)。实际上,所有程序并行的本质就是循环,连Windows也不例外。Windows号称多任务操作系统,实际上,在一个时间内CPU只能执行一条指令。所谓多任务,不过是并行的假象而已。在一个循环中分别执行各程序的一条语句,由于执行完该循环速度极快,于是看起来好象是多个任务同时工作一样。还有...,哎,不用费口舌了。相信你对并行有了一个初步应像,这就可以了,让我们继续。

    不是有一种for循环吗,为什么不用它呢?对,for循环也可以。只要可以构成死循环的语句都可以。死循环呀,听起来有点可怕。其实解决死循环简单的很,用break语句,再不行用goto语句,一切死循环都轻松搞定。现在就让我们来练一下兵:

    main()

    { int key;

    while(1)

    {if(kbhit())

    {key=getch();

    if(key==0){getch();continue;}

    if(key==27)break;

    if(key==13)printf("\n");/*支持回车*/

    if(key==8&&wherex()>0)

    {gotoxy(wherex()-1,wherey());/*支持退格*/

    putch(' ');

    }

    printf("%c",key);/*输出字符*/

    }

    }

    }

    上面就是一个典型的文本编辑器界面,现在让我们来修改一下该程序,在屏幕右上角做一个计时器和一个计算击键次数的计数器,该计时器与计数器与文本编辑互不干扰,达到并行的效果。

    main()

    { int key,x,y,n=0;

    clrscr();

    while(1)

    {if(kbhit())

    {key=getch();

    if(key==0){getch();continue;}

    if(key==27)break;

    if(key==13)printf("\n");/*支持回车*/

    if(key==8&&wherex()>0)

    {gotoxy(wherex()-1,wherey());/*支持退格*/

    putch(' ');

    gotoxy(wherex()-1,wherey());

    continue;

    }

    printf("%c",key);/*输出字符*/

    n++;/*计数*/

    }

    x=wherex();y=wherey();

    gotoxy(55,1);

    printf(" %d sec,keydown times %d ",clock()/18,n);/*记时,显示*/

    gotoxy(x,y);

    }

    }

    现在我们实现了简单的并行机制。然而,该循环有个缺点:太耗CPU,如果不按下任何键,CPU也会不停地刷新计数与记时器。于是我们引入了周期的概念,使一个周期只执行一次语句,这样即节省CPU,使用要求执行速度不同的并行语句也容易控制。程序入下:

    /*并行结构*/

    #define delay_time 4; /*定义的周期长度*/

    main()

    { long now_time=0,old_time,time_count=0;

    char done=0; /*使用done标志使每一个周期只执行一次指令*/

    clrscr();

    old_time=clock();

    while(!kbhit())

    {now_time=clock();

    if(now_time-old_time{if(!done)

    {puts("计算!"); /*该语句可替换为自己需要并行的语句块*/

    done=1;

    }

    }

    else

    {old_time=now_time;done=0;}

    }

    }

    如果上面的puts语句换成两个沿对角线移动小球的语句,不就可以实现两个小球同时运动了吗?在程序中动态地调整delay_time的值,还可以确定小球移动的快慢。这只是一个提示,只要遵循该结构,还可以实现好多有趣的效果,读者可以自己去研究。

    更多相关内容
  • C语言并行程序编程(一)

    万次阅读 2019-03-09 22:16:35
    这里先简单书写一个并行版的hello world 作为入门,后续的文章再更新相关的概念。 #include <stdio.h> #include <stdlib.h> #include <omp.h> void Hello(void); int main(int argc,char* ...

    这里先简单书写一个并行版的hello world 作为入门,后续的文章再更新相关的概念。

    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    void Hello(void);
    
    int main(int argc,char* argv[])
    {
        int thread_count = strtol(argv[1],NULL,10);
        //获取线程数
    #   pragma omp parallel num_threads(thread_count)
        Hello();
        return 0;
    }
    
    void Hello(void)
    {
        int my_rank = omp_get_thread_num();
        //获取线程编号
        int thread_count = omp_get_num_threads();
        //获取线程数
    
        printf("Hello World from thread %d of %d\n",my_rank,thread_count);
    }

    接着运行一下,先看一下结果

    在源文件的文件夹下打开终端输入: gcc -g -Wall -fopenmp -o test test.c

    得到一个文件名为test的文件,接着输入:./test 4,得到运行结果

    下面我先来解释一下编译命令的作用:

    -g:允许使用调试器 ; -Wall:显示警告;-fopenmp:防止老版本的gcc不包含OpenMP的支持;

    -o <outfile>: 便以后的可执行文件的文件名为outfile;./:用来给出可执行文件的路径;4代表开启的线程数。

    接着我来解释一下源代码,可能会牵扯到一些术语,我会在后面的文章中作更详细的解释,在这里就不作过多的赘述了。

    strtol函数:获取线程数,包含在<stdlib.h>中。其原型为:

    long strtol(const char* number p  /* in */,
                char** end p         /* out */,
                int   base           /* in */
    );

    参数一是一个字符串,在这个例子中为命令行参数;参数二因为没有用到,所以传递了一个空指针;参数三是字符串所代表的数的基数,代码中的10代表十进制

    在C/C++中,预处理指令以#pragma,在OpenMP中,常常以#pragma omp开始

    parallel指令用来表明之后的结构化代码块(基本块)应该被多个线程并行执行。

    将num_threads子句加入到parallel指令中,就允许程序员指定执行后代码块的线程数。

    在Hello函数中,我们分别获取了线程的编号和线程数,它们的原型如下:

    int my_rank = omp_get_thread_num(void);         //获取线程编号
    int thread_count = omp_get_num_threads(void);   //获取线程数

    相关概念我会在后面的文章中一一解释,欢迎大家一起来学习,QQ交流群:892747839

     

    展开全文
  • 串行求圆周率,后用openMP改为并行代码,用OpenMP并行化求pi的代码,用的是公式法求pi
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include "stdio.h"#include "string.h"#include "windows.h"char reg_name[30]="",reg_pwd[10]="";char on_name[30],on_pwd[10];void regist(){system("pause");...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    #include "stdio.h"

    #include "string.h"

    #include "windows.h"

    char reg_name[30]="",reg_pwd[10]="";

    char on_name[30],on_pwd[10];

    void regist()

    {

    system("pause");

    system("cls");

    printf("\n\n\t\t\t欢迎使用红包注册系统\n\n");

    while(1)

    {

    printf("\t\t请输入用户名[不能大于10个字符]:");

    scanf("%s",reg_name);

    if(strlen(reg_name)<=10)

    {

    while(1)

    {

    printf("\n\t\t请输入密码[密码长度为八位]:");

    scanf("%s",reg_pwd);

    if(strlen(reg_pwd)==8)

    {

    printf("\n\n\t\t注册成功,您的用户名是%s,密码是%s\n\n",reg_name,reg_pwd);

    break;

    }

    else

    {

    printf("\n\t\t密码的长度为%d,请重新输入\n",strlen(reg_pwd));

    }

    }

    break;

    }

    else

    {

    printf("\n\t\t用户名的长度为%d,请重新输入\n\n",strlen(reg_name));

    }

    }

    }

    int judge()

    {

    if(strcmp(reg_name,"")==0&&strcmp(reg_pwd,"")==0)

    {

    printf("\n\n\t\t您尚未注册,请先注册!\n\n");

    return 0;

    }

    else

    {

    return 1;

    }

    }

    void dl()

    {

    int i;

    system("pause");

    system("cls");

    printf("\n\n\t\t\t欢迎使用红包登录系统\n\n");

    for(i=1; i<=3; i++)

    {

    printf("\t\t请输入用户名:");

    scanf("%s",on_name);

    printf("\n\t\t请输入密 码:");

    scanf("%s",on_pwd);

    if(strcmp(reg_name,on_name)==0&&strcmp(reg_pwd,on_pwd)==0)

    {

    printf("\n\n\t\t登录成功,欢迎使用红包系统\n\n");

    break;

    }

    else

    {

    printf("\n\n\t\t登录失败,请重新登录,您还有%d次机会\n\n",3-i);

    }

    }

    }

    void main()

    {

    int id;

    while(1)

    {

    system("pause");

    system("cls");

    printf("\n\n\t\t\t红包管理系统\n\n");

    printf("\t\t\t1:注册\n");

    printf("\t\t\t2:登录\n");

    printf("\t\t\t0:退出\n\n");

    printf("\t\t请选择功能编号:");

    scanf("%d",&id);

    switch(id)

    {

    case 1:

    regist();

    break;

    case 2:

    if(judge()==1)

    {

    dl();

    }

    break;

    case 0:

    exit(1);

    break;

    default:

    printf("\n\t\t您输入的功能编号有误,请重新输入!\n");

    }

    }

    }

    void start()

    {

    system("color A");

    while(1)

    {

    float a[25];

    float total;

    printf("\t\t\t欢迎使用红包分发系统\n\n\n");

    printf("请输入红包的总额:\n");

    scanf("%f",&total);

    int num;

    printf("请输入红包的个数:(1~20之间)\n");

    scanf("%d",&num);

    float min=0.01;

    int i=0,j;

    float t;

    float MAX=0;

    float safe_total=0;

    float sum=0;

    srand(time(NULL));

    for(i=1;i

    {

    t=total/(num-i+1);

    safe_total=t*2;

    a[i]=(rand()%(int)(safe_total*100)+(int)min*100)/100.0+min;

    total-=a[i];

    sum+=a[i];

    printf("\t\t第%d个红包有%0.2f元\n",i,a[i]);

    if(a[i]>MAX)

    {

    MAX=a[i];

    j=i;

    }

    }

    a[i]=total;

    printf("\t\t第%d个红包有%0.2f元\n\n\n\n",i,a[i]);

    if(total>MAX)

    {

    printf("\t\t第%d个同学是运气王,抢到了0.2f元的金额\n\n\n",num,total);

    }

    else

    {

    printf("\t\t第%d个同学是运气王,抢到了%0.2f元的金额\n\n\n",j,MAX);

    }

    system("pause");

    system("cls");

    }

    return 0;

    }

    展开全文
  • 并行化C语言并行化CUDA C/C++ 数据集:MNIST数据集 主要语言:C语言 整体介绍:MNIST数据集是手写数字的图像和标签数据集;改代码本事是通过KNN数据分类算法,将MNIST手写数据集进行分类,并得出分类的准确率和...
  • 针对不同的排序算法,选择C语言来实现它们各自的源代码。
  • 假设我们有4 台计算机,并行计算设计如下: 我们这里通过fourinone 提供的各种并行计算模式去设计,第一次使用可以参考分布式计算 上手demo 指南,开发包下载地址:/p/fourinone/ 程序实现: PiWorker:是一个π计算...

    关于圆周率大家再熟悉不过了:

    我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926 到3.1415927 之间…

    计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu 看会不会出问题…

    另外一些人也想看看这个无限延伸的神秘数字背后是否有规律,能发现一些宇宙的秘密…

    提起圆周率,不能不提及Fabrice Bellard,他被认为是一位计算机天才,在业界有着重要的

    影响。1996 年他编写了一个简洁但是完整的 C 编译器和一个 Java 虚拟机 Harissa。Fabrice

    Bellard 发明的TinyCC 是GNU/Linux 环境下最小的ANSI C 语言编译器,是目前号称编译速度

    最快的C 编译器。Fabrice Bellard 杰作众多且涉及广泛,1998 年编写了一个简洁的OpenGL

    实现TinyGL ,2003 年开发了 Emacs 克隆QEmacs,2005 年还设计了一个廉价的数字电视系

    统。

    Fabrice Bellard 使用一台普通的台式电脑,完成了冲击由超级计

    算机保持的圆周率运算记录的壮举,他使用台式机将圆周率计

    算到了小数点后2.7 万亿位,超过了由目前排名世界第47 位的

    T2K Open 超级计算机于去年8 月份创造的小数点后2.5 万亿位

    的记录。

    Bellard 使用的电脑是一台基于2.93GHz Core i7 处理器的电脑,

    这部电脑的内存容量是6GB,硬盘则使用的是五块RAID-0 配置

    的1.5TB 容量的希捷7200.11,系统运行64 位Red Hat Fedora 10

    操作系统,文件系统则使用Linux 的ext4.

    这次计算出来的圆周率数据占去了1137GB 的硬盘容量,Bellard 花了103 天的时间计算出了

    这样的结果。

    计算圆周率的方法有很多种:

    微积分割圆法求:

    或者利用便于计算机计算的丘德诺夫斯基公式法求:

    不过这些计算方法都比较复杂,难以让读者理解和使用并行计算来求,所幸数学上的泰勒级

    数是个好东西,它将微积分的东西改成用无限级数来表示,这样很容易进行并行计算分解:

    π =4* ∑(-1)^n+1/(2n-1) 或者写为: π =4*( 1-1/3+1/5-1/7+…)

    也可以得到:π n =π n-1+(-1)^n+1/(2n-1),也就是可以通过迭代前面的π值去求当前π值

    我们根据上面公式先写个单机程序来求:

    public class PiTest

    {

    public static void main(String[] args)

    {

    double pi=0.0;

    for(double i=1.0;i<1000000001d;i++){

    pi += Math.pow(-1,i+1)/(2*i-1);

    }

    System.out.println(4*pi);

    }

    }

    运行以上程序,并对照pi 的标准值:3.141592653589793238462643383279…

    如果i<10000,得到pi = 3.1416926635905345 (从红色部分以后不精确了)

    如果i<1000000 ,得到pi = 3.1415936535907742 (从红色部分以后不精确了)

    如果i<1000000000 ,得到pi = 3.1415926525880504 (从红色部分以后不精确了)

    ……

    可以看到,当迭代的轮数越大,求出的π值越精确。

    由于是无限累加,我们可以很容易改成并行程序求解,比如i=4n,可以分成4 段并行求解,

    再将4 部分和合并起来得到最终π值。假设我们有4 台计算机,并行计算设计如下:

    我们这里通过fourinone 提供的各种并行计算模式去设计,第一次使用可以参考分布式计算

    上手demo 指南,开发包下载地址:/p/fourinone/

    程序实现:

    PiWorker:是一个π计算工人实现,我们可以看到它通过命令行输入一个计算π值的起始值

    和结束值,我们同时启动4 个PiWorker 实例,启动时指定不同的起始结束参数。

    PiCtor:是一个π计算包工头实现,它的实现很简单,获取到线上工人后,通过doTaskBatch

    进行阶段计算,等待每个工人计算完成后,将各工人返回的π计算结果合并累加。

    运行步骤:

    1、启动ParkSer

    展开全文
  • 基于软件流水技术的深度卷积神经网络并行化研究.docx
  • 在Linux中用C语言进行OpenMP并行程序设计 ················································································...
  • C语言实现并行求和算法

    千次阅读 2014-12-02 14:17:36
     C语言中不允许动态数组类型。例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明,这是错误的。 这里使用malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型...
  • kmeans算法并行化

    2014-04-11 22:53:08
    本代码是全局kmeans算法在异构架构下的实现,使用cuda c语言编写。(声明,改代码是一位大牛所写,希望对你有用)
  • C语言模块程序设计

    千次阅读 2017-09-07 22:29:29
    C语言模块程序设计 模块划分 C语言模块程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;  (2) 某模块提供给其它模块调用的...
  • 分析,产生可并行化的语句块分区;再次,按照提出的并行代码生成方法得到目标代码;最后,基于Visual Studio2010 构建目标代码仿真验证环境。实验结果表明,该工具可以较为理想地实现串行代码自动并行化,与手工编写的代码....
  • 得益于过去数十年间计算能力的提升,深度学习,计算机视觉,生物医疗等众多领域都得到了飞速发展,但与此同时,各行业对计算能力的要求也越来越高,单一的串行计算已经难以满足计算需求,而并行计算无...
  • 基于LSTM的时间序列预测算法的并行化计算机研究.docx
  • 基Spark的社区发现算法并行化的研究及应用.docx
  • 并行:四种C+OpenMP计算π的并行程序

    千次阅读 2019-04-23 15:26:14
    四种C+OpenMP计算π的并行程序VS2017中OpenMP配置计算π的串行程序计算π的并行程序并行域并行化共享任务结构并行化private字句和critical制导语句并行化并行规约并行化四种并行程序整合在一个project里 VS2017中...
  • 面向循环并行化的软件重构方法之计算机研究与实现.docx
  • )矩阵的计算是并行计算里的一个很重要的问题。矩阵是一种网格的数据,是一组同类型数值的集合,矩阵的出现,使得代数系统更完善,对各种实际问题的求解产生了巨大的作用。但是其庞大的计算量往往令人生畏,稍微大...
  • 对该算法的并行化是很简单的,假设对一个长为n的输入序列使用n个处理器进行排序,只需使每个处理器负责完成对其中一个元素的定位,然后将所有的定位信息集中到主进程钟,由主进程负责完成所有元素的最终排位。
  • 我的编译环境:gcc (GCC) 5.4.0、Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60GHz 12核24线程 以下实验中给出了一个for循环并行化的例子,仅描述for循环并行化的基本用法(即#pragma omp parallel for预处理器指示符)...
  • C语言中,如果函数使用的变量或内存均为栈变量,则函数可以充分保证线程的并行执行,但栈变量的生命周期却很短,无法广泛适用于并行编程的指导建议! 如果你想每个线程使用的变量或存储区域,在内存分配上类似栈,...
  • 基于openMP并行化c语言实现的利用递归折叠的方法实现头尾相加递归调用实现高效的并行数组累加计算
  • 高斯消元法的并行实现,vs2015,pthread。同时结合了SSE和AVX,AVX X64下运行。
  • C语言写的图像处理程序,包括读入8位图像,对图像进行直方图均衡,灰度线性变化和灰度线性拉伸。
  • C语言快速排序算法

    2015-10-15 09:49:03
    mpi 对快速排序的并行化实现方法——C语言快速排序算法
  • 《新概念51单片机C语言教程:入门、提高、开发、拓展全攻略》可作为大学本、专科单片机课程教材,适合于51单片机的初学者和使用51单片机从事项目开发的技术人员,也可供从事自动控制、智能仪器仪表、电力电子、机电...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,934
精华内容 13,173
关键字:

c语言并行化