matlab与gpu编程结合应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MATLAB与GPU编程结合应用 多核服务器以及多线程技术使科学家,工程师以及财务分析师能够加快处理多个学科内的计算密集型应用。现在,另一种硬件承诺提供更高的计算性能,那就是GPU。 GPU最初用于加速图形渲染,现在越来越多地应用于科学计算。和传统的CPU只包括少数的几个核不同,GPU由整型和浮点处理器组成的大规模并行矩阵以及专用的高速内存构成。如图1所示,一个典型的GPU包含数百个小型处理器。 图1. CPU和GPU的核心数对比 上述配置极大地增加了GPU的吞吐量,但同时也要付出代价。首先,内存访问很有可能会出现瓶颈。进行计算前数据必须从CPU发送到GPU,计算完成后,数据必须从GPU发送到CPU。因为GPU通过PCI-E总线与主机的CPU连接,但是内存访问要比传统的CPU慢很多。这意味着整体的计算加速受限于算法中用到的数据转换器数目。其次,采用C或Fortran进行GPU编程需要不同的心智模型和技能,这很困难而且需要很长的时间才能达到。此外,针对特定的GPU你必须花费时间调整代码以优化应用性能。 本文演示了并行计算工具箱的功能特性,只需要对MATLAB代码进行简单的修改就能够在GPU上运行。我们通过使用波谱法解二阶波动方程对该方法进行了举例说明。 为什么要并行化波动方程求解程序? 波动方程广泛用于工程专业包括地震学,流体动力学,声学,以及电磁学,用于描述声,光和流体波。 使用波谱法解波动方程的算法能够实现并行是因为它满足使用GPU进行加速的两个标准: 大规模并行。并行快速傅里叶变化(FFT)算法的目的在于“分而治之”,这样一个相似的任务能够采用不同的数据反复执行。此外,该算法要求在处理线程和大量的内存带宽之间进行大量的通信。反向快速傅里叶变换(IFFT)同样能够并行运行。 计算密集型。算法执行大量的FFT以及IFFT,准确的数字取决于网格的规模和仿真中时间步长的数量。每个时间步长需要两个FFT,四个IFFT,而单个计算可能包含成千上万的时间步长。 图2. 32x32网格矩阵波动方程解决方案 在GPU上执行能够加快我的应用程序吗? GPU能够对符合以下标准的应用程序进行加速: 大规模并行—计算能够被分割成上百个或上千个独立的工作单元。 计算密集型—计算消耗的时间显著超过了花费转移数据到GPU内存以及从GPU内存转移出数据的时间。 不满足上述标准的应用程序在GPU上运行时可能会比CPU要慢。 使用MATLAB进行GPU编程 FFT,IFFT以及线性代数运算超过了100个内置的MATLAB函数,通过提供一个类型为GPUArray(由并行计算工具箱提供的特殊数组类型)的输入参数,这些函数就能够直接在GPU上运行。这些启用GPU的函数都是重载的,换句话说,这些函数根据传递的参数类型的不同而执行不同的操作。 例如,以下代码使用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工作空间中依旧可见。通过运行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工作集移动到设备内存的时间。一般来说是这样的但是也取决于硬件和阵列规模。数据传输开销可能变得异常显著以至于降低了应用的总体性能,尤其是当你重复地在CPU和GPU之间交换数据,执行相对来说很少的计算密集型操作时。更有效率的方式是当数据处于GPU当中时对数据进行一些操作,只在必要的情况下才将数据返回至CPU。 需要指出的是,和CPU类似,GPU的内存也是有限的。然而,与CPU不同,GPU不能在内存和硬盘之间交换数据。因此,你必须核实你希望保留在GPU当中的数据不会超出内存的限制,尤其是当用到大规模矩阵时。通过运行gpuDevice命令,可以查询GPU卡,获取信息比如名称,总内存以及可用内存。

文档评论(0)

diliao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档