我在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计算。是吗?
答案 0 :(得分:1)
正如您所发现的,对gpuArray
数据的标量元素的FOR循环执行非常糟糕,并且几乎总是一个坏主意。通常,您需要使用矢量化操作或arrayfun
来获得良好的性能。如果这不能提供足够的灵活性或性能,您可以始终使用CUDAKernel
界面或GPU MEX interface。