预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共18页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

并行计算简介和多核CPU编程DemoHYPERLINK"mailto:HouSisong@263.net"HouSisong@GMail.com2007.01.16 tag:多线程,并行计算,OpenMP,多核编程,工作线程池 (2008.01.19更新鉴于读者反映代码阅读困难,重新改写了文章和实现,使文章更易读) (2007.09.04更新把用事件控制的线程启动更新为临界区的实现) 2006年是双核的普及年,双核处理器出货量开始超过单核处理器出货量;2006年的11月份Intel开始供货4核;AMD今年也将发布4核,并计划今年下半年发布8核;按照Intel一个文档所说:"假定22纳米处理时帧上有一枚13毫米大小的处理器,其上有40亿个晶体管、48MB高速缓存,功耗为100W。利用如此数量的晶体管,我们可设计拥有12个较大内核、48个(多核)中型内核、或144个小型内核(许多个内核)的处理器。"而且Intel已经开发完成了一款80核心处理器原型,速度达到每秒一万亿次浮点运算。 随着个人多核CPU的普及,充分利用多核CPU的性能优势摆在了众多开发人员的面前;以前的CPU升级,很多时候软件性能都能够自动地获得相应提升,而面对多核CPU,免费的午餐没有了,开发人员必须手工的完成软件的并行化,以从爆炸性增长的CPU性能中获益;(ps:我想,以后的CPU很可能会集成一些专门用途的核(很可能设计成比较通用的模式),比如GPU的核、图象处理的核、向量运算的核、加解密编解码的核、FFT计算的核、物理计算的核、神经网络计算的核等等:D) 先来看一下单个CPU上的并行计算:单CPU上常见的并行计算:多级流水线(提高CPU频率的利器)、超标量执行(多条流水线并同时发送多条指令)、乱序执行(指令重排)、单指令流多数据流SIMD、超长指令字处理器(依赖于编译器分析)等 并行计算简介并行平台的通信模型:共享数据(POSIX、windows线程、OpenMP)、消息交换(MPI、PVM)并行算法模型:数据并行模型、任务依赖图模型、工作池模型、管理者-工作者模型、消费者模型对于并行计算一个任务可能涉及到的问题:任务分解、任务依赖关系、任务粒度分配、并发度、任务交互并行算法性能的常见度量值:并行开销、加速比、效率(加速比/CPU数)、成本(并行运行时间*CPU数) A:一个简单的计算Demo演示中主要完成的工作在Sum0函数(工作本身没有什么意义,主要是消耗一些时间来代表需要做的工作:),然后分别用OpenMP工具(vc和icc编译器支持)和一个自己手工写的线程工具来并行化该函数,来看看多核优化后的效果;我测试用的编译器是vc2005;CPU是双核的AMD64x24200+(2.37G);内存2G双通道DDR2677MHz; 原始代码如下: #include<stdio.h>#include<stdlib.h>#include<time.h>#include<math.h>//一个简单的耗时任务doubleSum0(double*data,longdata_count);intmain(){longdata_count=200000;double*data=newdouble[data_count];longi;//初始化测试数据for(i=0;i<data_count;++i)data[i]=(double)(rand()*(1.0/RAND_MAX));constlongtest_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次doublesumresult=0;doubleruntime=(double)clock();for(i=0;i<test_count;++i){sumresult+=Sum0(data,data_count);}runtime=((double)clock()-runtime)/CLOCKS_PER_SEC;printf("<Sum0>");printf("最后结果=%10.4f",sumresult);printf("执行时间(秒)=%f",runtime);delete[]data;return0;}doubleSum0(double*data,longdata_count){doubleresult=0;for(longi=0;i<data_count;++i){data[i]=(double)sin(cos(data[i]));result+=data[i];}returnresult;} 在我的电脑上运行输出如下: <Sum0>最后结果=55590743.4039执行时间(秒)=6.156000 B:使用OpenMP来优化(并行化)Sum0函数 OpenMP是基于编译器命令的并行编程标准,