异构计算Word文档下载推荐.docx
- 文档编号:22242117
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:30.39KB
异构计算Word文档下载推荐.docx
《异构计算Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《异构计算Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
下面通过一个简单例子来说明异构计算的基本工作原理。
假设在某一基准串行计算机上执行某一给定计算任务的时间为ts,其中向量、mimd、simd以及sisd各类子任务所占执行时间的百分比分别为30%、36%、24%和10%。
假设某向量机执行上述各类子任务相对于基准串行机的加速比分别为30、2、8和1.25,则在该向量机上执行此任务所需的总时间为
tv=30%ts/30+36%ts/2+24%ts/8+10%ts/1.25=0.30ts,
故相应的加速比为sv=ts/tv=ts/0.3ts=3.33
若上述向量机与其他的mimd机、simd机以及一台高性能工作站(sisd型)构成一个异构计算系统,并假设mimd机、simd机以及工作站执行相匹配子任务的加速比分别为36、24和10,则在该异构计算系统上执行同样任务所需时间就变为
thet=30%ts/30+36%ts/36+24%ts/24+10%ts/10+tc
其中tc为机器间交互开销时间,假设需2%ts时间,则thet=0.06ts,从而相应的加速比为shet=ts/0.06ts=16.67。
由上例可见,异构计算系统可比同构计算系统获取高得多的加速比。
这主要是因为同构计算系统中的加速比只是靠并行性开发获取的,而异构计算系统中的加速比除了并行性之外,更主要的是靠开发异构性获得的(即不同类型子任务与相应类型的计算资源相匹配),尽管此时会有相应的交互开销。
交互开销越小,异构计算的优越性就越加明显。
分类
异构计算按以何种形式来提供计算类型多样性,可分为系统异构计算(shc-systemheterogeneouscomputing)和网络异构计算(nhc-networkheterogeneouscomputing)两大类。
shc以单机多处理器形式提供多种计算类型,而nhc则以网络连接的多计算机形式提供多种计算类型。
根据异构性实现方式不同,即是空间异构性还是时间异构性,shc和nhc各自又可进一步分为两类。
shc分为单机多计算方式和单机混合计算方式两大类,前者在同一时刻允许以多种计算方式执行任务,后者在同一时刻只允许以一种计算方式执行任务,但在不同时刻计算可从一种方式自动切换到另一种方式,如simd和mimd方式间的切换。
前者的实例有美国hughes研究实验室和mit共同研制的图像理解系统结构(iua),它是多层异构系统结构,按图像理解层次要求设计每一层,低层是simd位串网络(4096),用来处理像素级操作(如图像增强),中层是由64个数字信号处理(dsp)芯片构成的,以spmd或mimd(中粒度)方式执行模式分类等操作,顶层是一个通用mimd(粗粒度)机器,完成场景和动作分析等知识处理操作。
后者的实例为美国普渡大学研制的pasm系统原型,由16个pe(处理单元)组成的系统,它们可动态地加以划分以形成各种大小的独立的混合方式子机器,执行方式可按需要在simd和mimd之间自动切换。
nhc可进一步分为同类异型多机方式和异类混合多机方式两类。
同类异型多机方式中所使用的多机,它们的结构属同一类,即支持同一种并行性类型(如simd、mimd、向量等类型之一),但型号可能不同,因此性能可以各有差异。
通常的now或cow为同类同型多机方式,因此可看成是同类异型多机方式中的特例。
异类混合多机方式中所使用的多机,它们的结构则属不同类型。
层次结构
网络异构计算系统主要由一组异构计算机、一个连接所有机器的高速网络和一个并行编程环境所组成。
逻辑上这种系统可分为三个层次:
网络层、通信层和处理层。
如图1所示。
网络层主要用来连接在不同地点的计算机,如图1中的计算站a和计算站b,并考虑其中消息传递的路由选择、网络流优化和网络排队理论等问题,这与传统的计算机网络设计类似。
通信层工作于网络层之上,主要为系统中各种不同的计算机提供能够相互通信的机制。
通信工具软件应提供使众多异构计算机集合可视为是一个单一的系统映像、单个虚拟异构并行机的机制。
这将方便用户编程。
这种通信工具通常提供一组原语来提供各种通信。
典型流行的通信工具是pvm(并行虚拟机)和mpi(消息传递标准接口)。
处理层主要用来管理异构机器组并保证任务的高效执行。
它所提供的主要服务包括编程环境和语言支持、应用任务的类型分析和任务划分、任务的映射与调度以及负载平衡等。
主要问题
异构计算处理过程本质上可分为三个阶段:
并行性检测阶段、并行性特征(类型)析取阶段以及任务的映射和调度阶段。
并行性检测不是异构计算特有的,同构计算也需要经历这一阶段。
可用并行和分布计算中的常规方法加以处理。
并行性特征析取阶段是异构计算特有的,这一阶段的主要工作是估计应用中每个任务的计算类型参数,包括映射及对任务间通信代价的考虑。
任务映射和调度阶段(也称为资源分配阶段)主要确定每个任务(或子任务)应映射哪台机器上执行以及何时开始执行。
从用户来看,上述的异步计算处理过程可用两种方法来实现。
第一种是用户指导法,即由用户用显式的编译器命令指导编译器完成对应用代码类型分析及有关任务的分解等工作,这是一种显式开发异构性和并行性方法,较易于实现,但对用户有一定要求,需将异构计算思想融入用户程序中。
另一种是编译器指导法,需将异构思想融入编译器中,然后由具有“异构智力”的编译器自动完成应用代码类型分析、任务分解、任务映射及调度等工作,即实现自动异构计算。
这是一种隐式开发异构性和并行性方法,是异构计算追求的终极目标,但难度很大,对编译器要求很高。
自动异构计算的概念性模型如图2所示。
首先对两个对象进行分析,一是异构计算系统中的机器集,二是求解的应用程序。
为了获取最好的执行效果,对它们不但进行定性分析,还需进行相应的定量分析。
整个异构计算处理过程可分为以下四个阶段:
第一阶段主要是对各台机器进行计算特征的分类,得出异构计算系统所能完成的计算类型;
按代码块统计应用对计算特征的需求并加以分类;
用基准程序测试各机器的性能参数,包括速度参数及机器间通信性能参数,生成对应的两个机器速度性能矩阵和通信带宽矩阵。
将程序按计算类型分类划分;
估算各子任务的计算量和子任务间通信量,生成相应的任务dag图。
dag图中结点上的数值表示子任务计算量,弧上的数值表示两结点间通信量。
第二阶段主要是根据dag和速度性能矩阵计算出每个子任务在各台机器上的执行时间,生成时间性能矩阵;
根据通信性能矩阵和子任务的通信量计算各子任务间的通信时间,生成通信时间矩阵。
第三阶段根据前两个阶段结果,给出各子任务到各机器的映射和符合任务dag图偏序关系的调度。
映射和调度可以是静态或动态的,动态调度需根据机器负载和网络状态信息进行。
第四阶段为执行。
应用与研究
异构计算的应用范围很广,几乎所有涉及巨大挑战性问题的求解都可用异构计算进行经济有效的求解。
典型的应用包括图像理解、质点示踪、声束形成、气候建模、湍流对流混合模拟以及多媒体查询等。
这些应用中通常都含有多种不同的计算类型的需求,因此很适合于用异构计算来进行求解。
1、未来应重点开展异构混合多机方式的网络异构计算的研究,它代表着发展趋向,且较经济有效;
2、自动异构计算是长期追求目标,在现阶段宜采用用户指导方法来进行研究和开发;
3、应尽量利用现有成熟工具如pvm和mpi来开展异构计算的研究和开发;
4、应注意开展异构计算的理论分析和建模、性能估计模型、有关软件工具以及异构计算中任务映射和调度算法等方面的研究;
5、应研究如何使异构计算系统具有良好的单一系统映像。
今天的计算技术面临挑战
计算产业的发展陷入了四处挚肘的窘境,推动计算技术发展的努力不得不在多个互相牵制的因素上仔细权衡。
首先,降低功耗对各种类型、各种规模的计算都变得日益关键。
消费者希望笔记本电脑、平板电脑、智能手机的电池续航时间更长、尺寸更小、分量更轻。
与之类似,数据中心的用电需求和制冷成本不断上升。
另一方面,我们不断追求更高的计算性能,为用户提供更炫酷的体验。
我们希望通过更加自然的人机界面(包括语音和手势)来控制设备,我们希望设备可以处理无休止膨胀的数据(从照片、录像一直到“云”上的一切内容)。
为了提供这些功能,程序员的工作效率变成了必须确保的关键因素。
为此,必须使得软件开发者很容易地通过原来所熟悉的、强大的编程模型,就能充分利用新的计算能力。
最后,应用软件需要支持和兼容广泛的硬件平台也日益变得重要。
对开发者而言,随着平台种类的不断增多,目前反复移植代码的惯常方法必然难以为继。
计算产业需要一种新的发展思路–让计算机架构更加高效,才能在上述需求交织的复杂环境中前行。
这种新的思路需承诺在功耗、性能、可编程性和可移植性这四个维度上同时都有改进。
异构系统架构(HSA,HeterogeneousSystemArchitecture)应运而生
计算机发展历程中,为了解决各种特定的问题,不断有互不兼容的计算模块被加入系统,却很少从全局优化的角度加以考察。
计算机整体效率不高的现状正是这种设计模式的直接后果。
常见情况是软件的计算负载被调度在一个并不适合当前任务的计算设备上低效执行。
HSA则展现了一种全新的体系架构,可以适应各种特性的计算任务。
计算机从诞生之日起就配有中央处理器,即执行通用计算任务的CPU。
但在过去的二、三十年中,主流的计算系统同时配置了其他计算处理单元,其中最常见的是图形处理器(GPU)。
最初,GPU应用于并行化的特殊的图形计算。
随着时间推移,GPU的绝对计算能力越来越强,而专用芯片的特点则逐渐淡化,此消彼长的结果是,GPU可以极佳的性能-功耗比完成通用并行计算的任务。
今天数量越来越多的主流应用要求兼具高性能和低功耗的素质,并行计算是达成目标的唯一途径。
但是,当前的CPU和GPU是分立设计的处理器,不能高效率地协同工作,编写同时运行于CPU和GPU的程序也是相当麻烦。
由于CPU和GPU拥有独立的地址空间,应用程序不得不明确地控制数据在CPU和GPU之间的流动。
CPU代码通过系统调用向GPU发送任务,此类系统调用一般由GPU驱动程序管理,而驱动程序本身又受到其他调度程序管理。
这么多的环节造成了很大的调用开销,以至于,只有在任务所需处理的数据规模足够大,任务的并行计算量足够大时,这样的调用开销才是划算的。
而其他的调用形式,比如由GPU向CPU发送任务,或者GPU向自己发送任务,在今天则根本不被支持!
为了充分释放并行处理器的计算能力,架构设计者必须打破既有格局,采用新的思路。
设计者必须重塑计算系统,把同一个平台上分立的处理单元紧密整合成为不断演进单颗处理器,同时无需软件开发者的编程方式发生重大的改变,这是HSA设计中的首要目标。
HAS创造了一种更佳的处理器设计,展示了CPU和GPU被无缝集成后所带来的益处和潜能。
通过HSA,程序可以在统一的地址空间中建立数据结构,在最合适的处理器上创建任务。
处理器之间的数据交互不过是传递一个指针。
多个计算任务之间通过coherentmemory,barrier,和atomic等操作来保证数据的同步(和多核CPU的方式相同)。
HSA效能初探
AMD的HSA团队分析了Haar人脸检测算法的性能,这是一个广为使用的多级视频分析算法,用于在视频流中识别出人脸。
HSA团队对比了基于OpenCL实现和基于HSA实现。
HSA版本可以在CPU和GPU之间无缝地共享数据,而无需内存拷贝和缓存刷新,因为任务以极低的开销被调度到合适的处理器上。
最终的结果是HSA版本的性能高出2.3倍,而功耗降低2.4倍*。
相较而言,无论是多核CPU、GPU、甚至非HSA方式的混合CPU和GPU都无法达到这样的性能水平。
同样重要的是,无需转换到迥异的编程模型,仅仅通过C++的简单扩展就可以实现程序。
∙*硬件配置
∙-4GBRAM;
Windows7(64位);
OpenCL™1.1
∙-APU:
AMDA104600MwithRadeon™HDGraphics
∙-CPU:
4核@2.3MHz(turbo3.2GHz)
∙-GPU:
AMDRadeonHD7660G,6CU,685MHz;
HSA作为工业标准
如果意图在更广泛的应用中被采纳,HSA必须超越自身,不再仅仅是某个硬件厂商的独家解决方案。
软件开发者的理想一直是“一次编码,处处运行”,实现这个理想需要具备一个跨平台和跨设备的基础架构。
这也是HSA的愿景。
HSA基金会由此成立,作为一个开放的工业标准组织,基金会的工作是把计算产业的参与者们联合到同一面旗帜之下。
HSA的五家创始会员分别是:
AMD、ARM、ImaginationTechnologies、MediaTek,TI和Samsung。
HSA基金会的目标是协助系统设计者把CPU、GPU这样不兼容的计算单元很好地整合在一起,消除计算单元之间数据共享和任务调用的开销。
透过HSA中间语言(HSAIL,HSAIntermediateLanguage),不同的硬件实现向上暴露出统一的软件接口。
HSAIL也是所有底层软件模块、开发工具一致的目标平台。
同时,HSAIL足够灵活并且接近硬件,各个硬件厂商可以高效地把它映射到自己的硬件设计上。
HSAIL也解放了程序员,后者不必为不同硬件平台裁剪自己的代码,同一套代码可以顺利运行在不同CPU/GPU配置的系统上。
对应用软件透明
HSA成功的一个关键是最小化应用程序移植的代价。
从过去的经验来看,要求软件供应商修改代码以适应新的硬件的这种做法充其量只能获得有限度的成功。
对于厂商专有解决方案就更是如此了。
要成为主流技术,必须降低使用者的门槛。
这就是HSA的设计思路。
HSA解决方案为应用程序员提供了硬件、接口、通用的中间语言和基本的运行时环境,封装并隐藏了内存一致性,任务调度管理等等复杂的底层细节。
如果主流的编程语言和库支持HSA,数以百万计的开发者凭着现成的代码就可以从HSA中直接获益。
AMD将从目前最主流的异构编程语言OpenCL和C++AMP入手,提供相应的基于HSA的开发工具。
随后,AMD将和HSA基金会的其他厂商一起拓展相关工具集,使之覆盖广泛的编程语言和实用库,适用于各个领域,成为主流编程人员易学易用的工具和架构。
异构计算(CPU
+
GPU)编程简介
1.概念
所谓异构计算,是指CPU+GPU或者CPU+其它设备(如FPGA等)协同计算。
一般我们的程序,是在CPU上计算。
但是,当大量的数据需要计算时,CPU显得力不从心。
那么,是否可以找寻其它的方法来解决计算速度呢?
那就是异构计算。
例如可利用CPU(CentralProcessingUnit)、GPU(GraphicProcessingUnit)、甚至APU(AcceleratedProcessingUnits,CPU与GPU的融合)等计算设备的计算能力从而来提高系统的速度。
异构系统越来越普遍,对于支持这种环境的计算而言,也正受到越来越多的关注。
2.异构计算的实现
目前异构计算使用最多的是利用GPU来加速。
主流GPU都采用了统一架构单元,凭借强大的可编程流处理器阵容,GPU在单精度浮点运算方面将CPU远远甩在身后。
英特尔Corei7965处理器,在默认情况下,它的浮点计算能力只有NVIDIAGeForceGTX280的1/13,与AMDRadeonHD4870相比差距就更大。
3.基于GPU编程
不同厂商通常仅仅提供对于自己设备编程的实现。
对于异构系统一般很难用同种风格的编程语言来实现机构编程,而且将不同的设备作为统一的计算单元来处理的难度也是非常大的。
基于GPU编程的,目前主要两大厂商提供:
一个是NVidia,其提供的GPU编程为CUDA,目前使用的CUDASDK4.2.另一个是AMD,其提供的GPU编程为AMDAPP(其前身是ATIStream),目前最新版本AMDAPP2.7。
这两个东西是不兼容的,各自为政。
作为软件开发者而言,用CUDA开发的软件只能在NVidia相应的显卡上运行,用AMDAPP开发的软件,只能在ATI相应的显卡上运行。
4.OpenCL简介
那么有没有可能让他们统一起来,简化编程呢?
有,那就是由苹果公司发起并最后被业界认可的OpenCL,目前版本1.2。
开放式计算语言(OpenComputingLanguage:
OpenCL),旨在满足这一重要需求。
通过定义一套机制,来实现硬件独立的软件开发环境。
利用OpenCL可以充分利用设备的并行特性,支持不同级别的并行,并且能有效映射到由CPU,GPU,FPGA(Field-ProgrammableGateArray)和将来出现的设备所组成的同构或异构,单设备或多设备的系统。
OpenCL定义了运行时,允许用来管理资源,将不同类型的硬件结合在同种执行环境中,并且很有希望在不久的将来,以更加自然的方式支持动态地平衡计算、功耗和其他资源。
5.DirectCompute简介
作为软件行业的老大—微软在这方面又做了什么呢?
微软也没闲着,微软推出DirectCompute,与OpenCL抗衡。
DirectCompute集成在DX中,目前版本DX11,其中就包括DirectCompute。
由于微软的地位,所以大多数厂商也都支持DirectCompute。
6.GPU计算模型
内核是执行模型的核心,能在设备上执行。
当一个内核执行之前,需要指定一个N-维的范围(NDRange)。
一个NDRange是一个一维、二维或三维的索引空间。
还需要指定全局工作节点的数目,工作组中节点的数目。
如图NDRange所示,全局工作节点的范围为{12,12},工作组的节点范围为{4,4},总共有9个工作组。
如果定义向量为1024维,特别地,我们可以定义全局工作节点为1024,工作组中节点为128,则总共有8个组。
定义工作组主要是为有些仅需在组内交换数据的程序提供方便。
当然工作节点数目的多少要受到设备的限制。
如果一个设备有1024个处理节点,则1024维的向量,每个节点计算一次就能完成。
而如果一个设备仅有128个处理节点,那么每个节点需要计算8次。
合理设置节点数目,工作组数目能提高程序的并行度。
7.程序实例
不论是OpenCL还是DirectCompute,其编程风格都基本差不多,程序是分成两部分的:
一部分是在设备上执行的(对于我们,是GPU),另一部分是在主机上运行的(对于我们,是CPU)。
在设备上执行的程序或许是你比较关注的。
它是OpenCL和DirectCompute产生神奇力量的地方。
为了能在设备上执行代码,OpenCL程序员需要写一个特殊的函数(kernel函数)放在专用文件中(.cl),这个函数需要使用OpenCL语言编写。
OpenCL语言采用了C语言的一部分加上一些约束、关键字和数据类型。
在主机上运行的程序提供了API,所以可以管理你在设备上运行的程序。
主机程序可以用C或者C++编写,它控制OpenCL的环境(上下文,指令队列…)。
DirectCompute程序员需要写Shader文件(.hlsl),在这个文件中写函数。
Shader文件的格式可以查MSDN。
在写程序时,先初始化设备,然后编译需要在GPU上运行的程序(运行在GPU上的程序是在应用程序运行时编译的)。
然后映射需要在GPU上运行的函数名字,OpenCL调用clEnqueueNDRangeKernel执行kernel函数,DirectCompute调用ID3D11DeviceContext:
:
Dispatch执行Shader函数。
函数是并发执行的。
运行在GPU上的函数一般都很简单。
以求和为例:
用CPU运算
void
vector_add_cpu(constfloat*fIn1,
const
float*fIn2,
float*
fOut,
int
iNum)
{
for
(int
i
=0;
<
iNum;
i++)
fOut
[i]=fIn1[i]+fIn2[i];
}
以下是OPenCL的kernel函数
//在GPU上,逻辑就会有一些不同。
我们使每个线程计算一个元素的方法来代替cpu程序中的循环计算。
每个线程的index与要计算的向量的index相同。
__kernelvoid
vector_add_gpu(__global
float*fIn1,
__global
float*fOut,
idx=
get_global_id(0);
if
(idx<
iNum)
fOut[idx]=fIn1[idx]+fIn2[idx];
有一些需要注意的地方:
1.Kernel关键字定义了一个函数是kernel函数。
Kernel函数必须返回void。
2.Global关键字位于参数前面。
它定义了参数内存的存放位置。
另外,所有kernel都必须写在“.cl”文件中,“.cl”文件必须只包含OpenCL代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算