如何通过GPU设备加速简单的matlab代码

时间:2014-10-13 15:45:15

标签: performance matlab cuda

我在Matlab GPU计算上模拟简单代码时遇到了一些问题。

第一种情况,我将CPU的fft2计算时间与GPU进行了比较

通过CPU:

A=rand(2000);
tic
for K=1:200
   yy=fft2(A);
end
toc

通过GPU:

A=gpuArray(A);
tic
for K=1:200
   yy=fft2(A);
end
toc

CPU占用5.984209秒,GPU占用0.036392秒。这似乎是一个合理的结果。

在第二种情况下,我尝试了简单的计算。

通过CPU:

D=rand(1,2000);
E=rand(1,2000);
tic
for K=1:2000
  pp=sqrt(D(K)^2+E(K)^2)/E(K);
end
toc

通过GPU:

F=gpuArray(D);
G=gpuArray(E);
tic
for K=1:2000
  qq=sqrt(F(K)^2+G(K)^2)/G(K);
end
toc

CPU占用0.002940秒,GPU占用2.699595秒。这是一个非常奇怪的结果!

为什么会发生这种情况?我知道使用' arrayfun'可以更快对于gpuArray输入。

无法计算' for循环'通过使用GPU除了arrayfun?

我知道一个GPU有几千个核心。 在这种情况下,是否可以使用' parfor loop'使用一个GPU?

对于非内置功能,很难适应所有适合' arrayfun的条件。

所以,我认为使用' for loop'在自我功能。但是,从上面的结果来看,' for loop'使gpuArray输入的总进程变慢。(它比CPU结果慢)

所以,我认为所有通用代码都无法转换为' GPU形式'通过充分利用GPU计算。是吗?

1 个答案:

答案 0 :(得分:1)

正如您所发现的,对gpuArray数据的标量元素的FOR循环执行非常糟糕,并且几乎总是一个坏主意。通常,您需要使用矢量化操作或arrayfun来获得良好的性能。如果这不能提供足够的灵活性或性能,您可以始终使用CUDAKernel界面或GPU MEX interface