MATLAB GPU并行编程

来源:互联网 发布:二次元图片制作软件 编辑:程序博客网 时间:2024/05/01 17:08

gpuArray
MATLAB中的gpuArray表示存储在GPU上的数据。使用gpuArray函数可以将数据从MATLAB工作空间传送到GPU。例如:
A = data(10);
G = gpuArray(A);
执行以上语句后,G 就是一个MATLAB GPUArray对象了。

gather
当GPU运行完程序后,可以通过gather函数将数据从GPU取回到MATLAB工作空间,存储在内存中,CPU可以调用。
D = gather(G);

其他,gpuArray自带的方法可以直接在GPU中创建数据:
这里写图片描述
这些方法的具体用法可以使用类似夏敏的命令寻找帮助
help gpuArray/eye

最后,一些处理普通数据的函数也可以用来检测GPU数据的属性
这里写图片描述

值得注意滴是,GPU的数据是要存到显存里面的,显存可没有内存那么大,虽然MATLAB和cuda为我们做了很多显存管理的工作,但是我还是要保证处理的矩阵不会把显存撑爆。

实例:使用MATLAB进行GPU编程
在GPU上执行能够加快我的应用程序吗?

  GPU能够对符合以下标准的应用程序进行加速:
  大规模并行—计算能够被分割成上百个或上千个独立的工作单元。
  计算密集型—计算消耗的时间显著超过了花费转移数据到GPU内存以及从GPU内存转移出数据的时间。
  不满足上述标准的应用程序在GPU上运行时可能会比CPU要慢。

使用MATLAB进行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函数操作。
  
需要指出的是,和CPU类似,GPU的内存也是有限的。然而,与CPU不同,GPU不能在内存和硬盘之间交换数据。因此,你必须核实你希望保留在GPU当中的数据不会超出内存的限制,尤其是当用到大规模矩阵时。通过运行gpuDevice命令,可以查询GPU卡,获取信息比如名称,总内存以及可用内存。

调用多块GPU
在matlab中如果调用多GPU那么需要开启多个pool,一个pool对应一个GPU,也就是一个CPU worker对应一块GPU,如

matlabpool 2 spmd     gpuDeviceendspmd      if labindex ==1      gpuDevice(2);end

参考文章:http://bbs.gpuworld.cn/thread-9309-1-1.html

0 0
原创粉丝点击