MATLAB与GPU编程结合应用_第1页
MATLAB与GPU编程结合应用_第2页
MATLAB与GPU编程结合应用_第3页
MATLAB与GPU编程结合应用_第4页
MATLAB与GPU编程结合应用_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MATLAB与GPU编程结合应用多核服务器以及多线程技术使科学家,工程师以及财务分析师能够加快处理 多个学科内的计算密集型应用。现在,另一种硬件承诺提供更高的计算性能,那 就是GPU。GPU最初用于加速图形渲染,现在越来越多地应用于科学计算。和传统的 CPU只包括少数的几个核不同,GPU由整型和浮点处理器组成的大规模并行矩 阵以及专用的高速内存构成。如图1所示,一个典型的GPU包含数百个小型处 理器。GPU (Hundredt ofCPU MulKpk图1. CPU和GPU的核心数对比上述配置极大地增加了 GPU的吞吐量,但同时也要付出代价。首先,内存 访问很有可能会出现瓶颈。进行计算前数据必

2、须从CPU发送到GPU,计算完成 后,数据必须从GPU发送到CPU。因为GPU通过PCI-E总线与主机的CPU连 接,但是内存访问要比传统的CPU慢很多。这意味着整体的计算加速受限于算 法中用到的数据转换器数目。其次,采用C或Fortran进行GPU编程需要不同 的心智模型和技能,这很困难而且需要很长的时间才能达到。此外,针对特定的 GPU你必须花费时间调整代码以优化应用性能。本文演示了并行计算工具箱的功能特性,只需要对MATLAB代码进行简单 的修改就能够在GPU上运行。我们通过使用波谱法解二阶波动方程对该方法进 行了举例说明。为什么要并行化波动方程求解程序?波动方程广泛用于工程专业包括地震

3、学,流体动力学,声学,以及电磁学, 用于描述声,光和流体波。使用波谱法解波动方程的算法能够实现并行是因为它满足使用GPU进行加 速的两个标准:大规模并行。并行快速傅里叶变化(FFT)算法的目的在于“分而治之”,这样 一个相似的任务能够采用不同的数据反复执行。此外,该算法要求在处理线程和 大量的内存带宽之间进行大量的通信。反向快速傅里叶变换(IFFT)同样能够并 行运行。计算密集型。算法执行大量的FFT以及IFFT,准确的数字取决于网格的规模和 仿真中时间步长的数量。每个时间步长需要两个FFT,四个IFFT,而单个计算可 能包含成千上万的时间步长。SoUtian of SBOCnd Order

4、Wave Eq uMon图2. 32x32网格矩阵波动方程解决方案在GPU上执行能够加快我的应用程序吗?GPU能够对符合以下标准的应用程序进行加速:大规模并行一计算能够被分割成上百个或上千个独立的工作单元。计算密集型一计算消耗的时间显著超过了花费转移数据到GPU内存以及从 GPU内存转移出数据的时间。不满足上述标准的应用程序在GPU上运行时可能会比CPU要慢。使用MATLAB进行GPU编程FFT,IFFT以及线性代数运算超过了 100个内置的MATLAB函数,通过提 供一个类型为GPUArray(由并行计算工具箱提供的特殊数组类型)的输入参数, 这些函数就能够直接在GPU上运行。这些启用GPU

5、的函数都是重载的,换句 话说,这些函数根据传递的参数类型的不同而执行不同的操作。例如,以下代码使用FFT算法查找CPU上伪随机数向量的离散傅里叶变换:A = rand(2人16,1);B = fft (A);为在GPU上执行相同的操作,我们首先使用gpuArray命令将数据从MATLAB 工作空间转移至GPU设备内存。然后我们能够运行重载函数fft :A = gpuArray(rand(2人16,1);B = fft (A);fft操作在GPU上而不是在CPU上执行,因为输入参数(GPUArray )位于 GPU的内存中。结果B存储在GPU当中。然而,B在MATLAB工作空间中依旧可见。通过运

6、行class(B),我们看到B是一个GPUArray。class(B)ans =parallel.gpu.GPUArray我们能够使用启用GPU的函数继续对B进行操作。例如,为可视化操作结 果,plot命令自动处理GPUArrays。plot(B);为将数据返回至本地的MATLAB 工作集,你可以使用gather命令。例如C = gather(B);C现在是MATLAB中的double,能够被处理double变量的所有MATLAB 函数操作。在这个简单的例子当中,执行单个FFT函数节省的时间通常少于将向量从 MATLAB工作集移动到设备内存的时间。一般来说是这样的但是也取决于硬件 和阵列规模。

7、数据传输开销可能变得异常显著以至于降低了应用的总体性能,尤 其是当你重复地在CPU和GPU之间交换数据,执行相对来说很少的计算密集 型操作时。更有效率的方式是当数据处于GPU当中时对数据进行一些操作,只 在必要的情况下才将数据返回至CPU。需要指出的是,和CPU类似,GPU的内存也是有限的。然而,与CPU不 同,GPU不能在内存和硬盘之间交换数据。因此,你必须核实你希望保留在GPU 当中的数据不会超出内存的限制,尤其是当用到大规模矩阵时。通过运行 gpuDevice命令,可以查询GPU卡,获取信息比如名称,总内存以及可用内存。采用MATLAB解波动方程为将上述例子应用到具体的环境中,我们在一个

8、实际的问题中实现GPU的 功能。计算目标是解二阶波动方程。I胪U 知丑Bt2 + dy2当u=0时到达临界值。我们使用基于波谱法的算法解空间方程,使用基于 二阶中心有限差分法的算法解时间方程。波谱法通常用于解决偏微分方程。采用波谱法的解决方案接近连续基函数比 如正弦和余弦的线性组合。在这个例子中,我们应用了切比雪夫波谱法,使用切 比雪夫多项式作为基函数。我们在每一个时间步长使用切比雪夫波普法计算当前解决方案的在x象限和 y象限的二次导数。我们同时使用这些中间数值与旧的解决方案和新的解决方 案,应用二阶中心有限差分法(也称为蛙跳法)计算新的解决方案。我们选择了 保持蛙跳法稳定性的时间步长。MAT

9、LAB算法是计算密集型的,当网格中元素的数目超过了计算解决方案的 增长,算法的执行时间将显著增加。当在单个CPU上使用2048x2048的网格 执行时,完成50个时间步长需要一分多钟。需要指出的是我们计算的时间已经 包括了 MATLAB内在的多线程性能优势。自从R2007a起,MATLAb的一些函 数就支持多线程计算。这些函数自动在多线程上执行,并不需要在代码中显示指 定命令去创建线程。当考虑如何使用并行计算工具箱加速计算时,我们将关注每个时间步长所执 行的计算指令代码。图3距离说明了为获取在GPU上运行的算法需要做出的改 变。需要指出的是涉及MATLAB操作的计算指令、启用GPU的重载函数可

10、以从并行计算工具箱获取。这些操作包括FFT, IFFT,矩阵乘法,以及各种元素明 智(element-wise)操作。因此,我们不必改变算法就能够在GPU执行。只需 要在进入每个时间步长计算结果的循环前使用gpuArray将数据转移到GPU当 中。二:司 TT 5-:F _日_:2 二潭盘图3.代码对比工具显示了 CPU版本和GPU版本的差异CPU和GPU版本共享的代码超过了 84% (在111行当中有94行)。计算指令在GPU上执行后,我们将计算结果从GPU转移至CPU。被启用 GPU的函数所弓I用的每个变量必须在GPU上创建或者在使用前转移到GPU上。 为将用于光谱分化的一个权重转变为GP

11、UArray变量,我们使用W1T = gpuArray(WlT);某些类型的数组能够直接在GPU上构造,不用从MATLAB工作集转移。 例如,为直接在GPU上创建全零矩阵,我们使用uxx = parallel.gpu.GPUArray.zeros(N + 1,N + 1);我们使用gather函数将数据从GPU中转移回MATLAB工作集;例如:vvg = gather(vv);需要指出的是这只是将一个数据转移至GPU然后从GPU转移回MATLAB 工作集。每个时间步长的所有计算指令都是在GPU上执行的。ZbCPU 和 GPU 的m行速度为评估使用GPU借二阶波动方程的优势,我们进行了基准研究,

12、分别采用 Intel Xeon X5650处理器和NVIDIA Tesla C2050 GPU,选取不同的网格大小 ( 64,128,521,1024和2048),测量了算法执行50个时间步长所花费的时间。当网格大小为2048时,算法表明GPU的计算时间少于10秒,而CPU的 计算时间超过了 1分钟(图4)。图4中的对数标尺表明当网格大小很小时CPU 实际上比GPU要快。随着技术的演进和逐渐成熟,GPU解决方案处理小规模问 题的能力在不断增强,我们希望这一趋势能够延续下去。粕犯2010图4.同一个基准测试结果的线性标尺(左)和对数标尺(右)表明在不同的网格 规模下完成50个时间步长所需的时间。

13、使用MATLAB进行GPU高级编程通过在GPU上执行MATLAB代码,并行计算工具箱提供了简明的方式对 MATLAB代码进行加速。你只需要改变函数输入的数据类型就能够利用众多的、 已经针对GPUArray进行了重载的MATLAB命令(并行计算工具箱文档提供了 支持GPUArray的内置MATLAB函数的完整列表)。为在GPU上使用多个简单的操作加速算法,你可以使用arrayfun函数。因 为arrayfun是一个基于GPU的函数所以只会在单个调用中而不会在每个单独 的操作中引起内存转移开销。最后,自己写CUDA代码的有经验的程序员能够使用并行计算工具箱中的 CUDAKernel接口将代码与MA

14、TLAB进行集成。CUDAKernel接口使更加细粒 度控制、加速存在性能瓶颈的代码成为了可能,它创建了一个MATLAB对象, 该对象能够访问编译为PTX代码的核心程序(PTX是一个低级别并行线程执行 指令集)。你甚至可以使用MATLAB阵列作为输入和输出,调用feval命令评 估GPU上的核心程序。总结工程师和科学家正在成功地使用GPU技术加速与他们的学科相关的计算。 不需要具备广泛的GPU知识付出很少的努力你就能够使用MATLAB获取GPU所承诺的强大的计算能力。不必采用低级别的CUDA编程,GPUArrays以及启 用GPU的MATLAB函数帮助你加快了 MATLAB操作。如果你熟悉GPU编程, 那么不需要进行任何的C语言编程,MATLAB就能够将现有的CUDA核心程序 集成进MATLAB中。为使用GPU实现加速,你的应用必须满足一些标准,其中在CPU和GPU 之间发送数据的时间必须要少于程序在GPU上运行所节省的时间。如果你的程 序符合这些要求,那么就是MATLAB所提供的GPU功能范围内的一个很不错 的候选者。GPU术语CPU.计算机中的中央单元,负责计算,控制以及监管计算机的其他部件。CPU处理数据位于计算机内存当中的逻辑和浮点操作。GPU.原本用于图形渲染的可编程芯片。对于需要并行处理大规模数据的算 法而言,GPU的高度并行架构使它们比通用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论