《多核编程之挑战与应对.ppt》由会员分享,可在线阅读,更多相关《多核编程之挑战与应对.ppt(27页珍藏版)》请在三一办公上搜索。
1、多核编程之挑战与应对,报 告 人:孔 晓 华学号:S3060601442007年 12月 29日,主要内容:,什么是多核多核技术带给软件开发的挑战如何对应多核编程革命分块的程序设计思维并行设计的方法 合适的编程语言选择旧程序如何应对多核环境?,什么是多核,简单的讲,多内核是指在一枚处理器中集成两个或多个完整的计算引擎(内核)。多核处理器是多枚芯片(也称为“硅核”),能够直接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将它的每个执行内核作为独立的逻辑处理器。通过在多个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。,什么是多核,单核与多核的区别单核处理器:通过提高主
2、频来提升效率,随之提高的还有处理器的功耗和成本。多核处理器:通过多核结构的并行计算提高效率,功耗小,但是单个任务的处理速度不会提升。,多核的好处,首先,由于是多个执行内核可以同时进行运算,因此可以显著提升计算能力,而每个内核的主频可以比以前低,因而总体功耗增加不太大。其次,与多CPU相比,多核处理器采用与单CPU相同的硬件机构,用户在提升计算能力的同时无需进行任何硬件上的改变,这对用户来说非常方便。正是由于多核的这些优点,所以,多核很快被用户接受,并得以普及。,多核带来的挑战,毫无疑问,多核给我们提供了更经济的计算能力。但是,这种能力能否善加利用还要取决于软件。如果不针对多核进行软件开发,不仅
3、多核提供的强大计算能力得不到利用,相反还有可能不如单核CPU好用。“从某种程度上说,对于软件开发者而言,CPU主频提升就像是免费的午餐,此前所有的程序很自然地会从主频的提升中受益,而如今多核出现了,这种免费的午餐没有了。我们必须针对多核重新进行软件设计。”,多核带来的挑战,多核对于不用应用领域的软件影响并不相同:第一类是传统的科学计算机用户,他们的软件大部分是高性能计算专家写的,也多是并行的,他们对MPI(Multi Point Interface,多点接口)、OpenMP等并行编程模型也已经掌握。第二类是一般意义上提到的服务器,如银行以及搜狐、Google这样的互联网公司,它们主要的业务特征
4、是并发的访问。这些应用具有天然的并行性,如多用户的访问本身就是并行的。第三类是移动用户和桌面用户,他们是面临挑战最大的群体。这些用户的原有大部分程序都是串行的,如大部分串行程序是用Visual Basic语言编写。,分块的程序设计思维,线程是操作系统分配CPU资源的最小单位,所以如果想要设计多核并行的程序,那么我们就要用分块思维去设计程序。如何分块?例1.统筹方法中的泡茶问题,分块的程序设计思维,比如,想泡壶茶喝:开水没有;水壶要洗,茶壶茶杯要洗;火生了,茶叶也有了。怎么办?甲:洗好水壶,灌上凉水,放在火上;在等待水开的 时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。乙:做好一些准备工作,
5、洗水壶,洗茶壶茶杯,拿茶 叶;一切就绪,灌水烧水;坐待水开了泡茶喝。丙:洗净水壶,灌上凉水,放在火上,坐待水开;水 开了之后,急急忙忙找茶叶,洗茶壶茶杯,泡茶 喝。,分块的程序设计思维,如果我们有两个机器人,让它们给我们泡茶喝,那最好的方法显然是按照“办法甲”分工:机器人A去烧水,机器人B洗茶具;等水开了,泡茶喝。看,不经意间,我们就应用了分块的思维把不相关的事务分开给不同的处理器执行。,分块的程序设计思维,例2.有数据类型为T的序列A,求序列中值与K相等的元素个数。,分块的程序设计思维,Count(k,p,n)=Count(k,p,n/2)+Count(k,p+n/2,n-n/2)前半段值为
6、K的元素个数+后半段值为K的元素个数。如果我们开启两条线程:线程1执行Count(k,p,n/2),线程2执行Count(k,p+n/2,n-n/2),那么在双核系统上我们将可以节省一半的运行时间。,分块的程序设计思维,以上分块的思维都是简单直接的,如果是复杂的任务,就不可能容易地找出分块的方案了,所以需要并行设计的方法来指导我们。,并行设计的方法,如果由甲一人来完成这个泡茶过程的话,图中红色虚框部分可以并行。如果由两机器人来完成,而且有不少于2个水龙头供机器人使用,那绿色虚框的部分都可以并行而且能取得更高的效率。可见能够合理利用的资源越多,并行的加速比率就越高。,例1.统筹方法中的泡茶问题,
7、并行设计的方法,例2.对某一N维向量乘以一个实数值,for(int i=0;i N;+i)vi*=r;,如果有N个处理器,那么这N次带有数据并行性的迭代可以同时执行。,并行设计的方法,数据并行性:有不相关的任务对数据集的不同元素进行相同的操作,我们称这种数据相关表现了功能并行性:有不相关的任务对数据集的不同元素进行不同的操作。流水线:在处理单个问题上不存在并行性,但如果需要处理多个问题,且每个问题可以分为几个阶段,那么就能支持与阶段数相同的并行性。,并行程序设计思想,目前比较流行的三种:一、扩张编译器开发并行化编译器,使其能够发现和表达现有串行语言程序中的并行性,例如Intel C+Compi
8、ler就有自动并行循环和向量化数据操作的功能。这种把并行化的工作留给编译器的方法虽然降低了编写并行程序的成本,但因为循环和分枝等控制语句的复杂组合,编译器不能识别相当多的可并行代码而错误地编译成了串行版本。,并行程序设计思想,二、扩展串行编程语言这是当前最为流行的方式,通过增加函数调用或者编译指令来表示低层语言以获取并行程序。用户能够创建和结束并行进程或线程,并提供同步与通信的功能函数等。这方面较为杰出的库有MPI和OpenMP等;在解释型脚本阵营,ParallelPython也吸引了不少粉丝。,并行程序设计思想,三、创造一个并行语言虽然这是一个疯狂的想法,但事实上近几十年来一直有人在做这样的
9、事情,如HPF(High Performance Fortran)是Fortran90的扩展,用多种方式支持数据并行程序。,合适的编程语言选择,合适的编程语言选择,C#、java、Python脚本语言提供了对多线程的原生支持:如:C#的 java的 Python的Threading.Thread。编译语言通过平台相关的库来提供对多线程的支持:如:Win32 SDK、POSIX threads等。,合适的编程语言选择,没有统一的标准,造成使用C/C+编写多线程程序需要考虑更多的细节,提高了项目成本。PHP/Ruby/Lua等脚本语言并没有提供内核级线程支持,它们的多线程是用户级的甚至不支持线程,
10、用它们编写的多线程程序仍然无法完全利用多核优势。,合适的编程语言选择,从语言级提供多线程支持方面,C/C+失去了优势。不过,当前的主流操作系统都以C语言接口的方式提供创建线程的API,而C/C+又有相当丰富的程序库,在一定程度上弥补了语言上的不足。但是对于多核程序员来说,使用这些库进行多线程编程的话,要增加一倍的关键代码,比较复杂。综合以上各方面的对比,推荐使用C#、java、Python等脚本语言。,旧程序如何应对多核环境?,一、精确地评估旧程序是否需要作出修改。如Foxmail、Windows优化大师之类的桌面软件原本就只占用极少的CPU资源,那么就不需要针对多核改写。而作为网站服务器端运
11、行的CGI程序基本上都是以多进程或多线程的方式来响应请求的,将可以平滑地充分利用多核系统的性能优势,一般而言也不需要针对多核改写。,旧程序如何应对多核环境?,二、就重避轻。一个应用程序,性能瓶颈通常都只有几个或者一两个甚至这些瓶颈相关的功能还是用户很少使用的。那么为了这些少量需求而对已有程序进行伤筯动骨的改造是不合适的,更不宜以多线程的架构重写整个应用。如果应用程序是使用C/C+/Fortran编写的,那使用OpenMP使性能瓶颈部分的代码并行化是相当好的选择。如果代码是使用C#/java/Python等脚本编写的,可能需要多花一些功夫来完成同样的工作。,旧程序如何应对多核环境?,三、不追逐潮流。一句话,如果旧的应用程序没有性能瓶颈,那就不要作任何改动,否则只会引火烧身。像暴风影音、千千静听这一类多媒体播放软件,针对多核优化是可做可不做的事情;但如果做了,用户可能反而会觉得太占用资源,因为换了双核系统还觉得播放视频/音频的时候做其它事情仍然有点“卡”,那就不如不做。,报告完毕,谢谢大家!,