MATLAB可谓工程计算中的神器,一方面它自带丰富的函数库,另一方面它所有的数据都是内建的矩阵类型,最后画图也方便,因此解决一些小规模的计算问题如果对性能要求不高的话开发效率远大于C++ FORTRAN之类传统手段。不过受限于PC的计算能力,对于一些大规模数据处理它就力不从心了。还好最近Matlab开发了cuda的wrapper,计算能力因而上升了一个数量级。
那么怎样在MATLAB上做GPU计算呢?
首先要进行数据的初始化。有两种方法可以进行初始化:一是先在CPU上设置好数据然后拷贝到GPU;二是直接在GPU上初始化数据。先看看第一种方案:
N = 6;
M = magic(N);
G = gpuArray(M);
可见把数据从CPU拷贝到GPU上非常简单,只要B = gpuArray (A)就可以了。实际上MATLAB并没有规定一个矩阵定义之后不能改类型,所以以下也是可以的:
M = gpuArray(M);
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度:
A = gpuArray(single(B));
如前所述,第二种方法是直接在GPU上设置数据:
A = zeros(10, \'gpuArray\');
这时候运行size函数:
size (A)
得到 100 100。所以A其实是一个二维数组。
也可以生成一个一维的随机数组:
r = gpuArray.rand(1, 100) % 一行,一百列
运行class函数:
class(r)
得到
ans = gpuArray。可见这是一个在gpu上的数组。
下面就是对GPU数据进行操作。首先,MATLAB定义了GPU上丰富的库函数,比如快速傅立叶变换:
result = fft(r)
这样result就是另一个GPU上的数组,存储了对r做fft的结果。
加减乘除更不在话下:
r2 = (real(result) + r ) / 2
作用是对result取实部之后加r再除以2.这里r2, r, result都是GPU上的数组。方便吧?
最后是如何把GPU上的数据回传给CPU:
B = gather (A);
其中A是GPU上的数据,B是CPU上的数据。B的内容在回传之后等于A。
并不是所有的电脑都可以用MATLAB进行GPU加速计算。想知道自己的电脑有没有这个能力,运行gpuDevice:
>> gpuDevice
ans =
CUDADevice with properties:
Name: \'GeForce GTX 650\'
Index: 1
ComputeCapability: \'3.0\'
SupportsDouble: 1
DriverVersion: 6.5000
ToolkitVersion: 5
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [2.1475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 1.0737e+09
FreeMemory: 732377088
MultiprocessorCount: 2
ClockRateKHz: 1058500
ComputeMode: \'Default\'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 1
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
MATLAB目前只支持Nvidia的显卡。如果你的显卡是AMD的或者是Intel的,就得考虑另寻它路了。