我想知道使用Matlab在GPU上进行fft和简单添加的巨大性能差异。我希望GPU上的fft比简单的加法慢。但为什么反过来呢?有什么建议吗?
a=rand(2.^20,1);
a=gpuArray(a);
b=gpuArray(0);
c=gpuArray(1);
tic % should take a long time
for k=1:1000
fft(a);
end
toc % Elapsed time is 0.085893 seconds.
tic % should be fast, but isn't
for k=1:1000
b=b+c;
end
toc % Elapsed time is 1.430682 seconds.
值得注意的是,如果减少矢量a的长度,则加法(第二次循环)的计算时间会减少。
修改
如果我改变两个循环的顺序,即如果首先完成加法,则加法需要0.2秒而不是1.4秒。 FFT时间仍然相同。
答案 0 :(得分:1)
我猜测Matlab实际上并没有运行fft因为输出没有在任何地方使用。此外,在您的简单加法循环中,每次迭代都取决于前一次迭代,因此必须以串行方式运行。
我不知道为什么循环的顺序很重要。也许它与第一次循环后清理GPU内存有关。您可以尝试在循环之间调用pause(1)
,让计算机在第二次循环之前返回空闲状态。这可能会使您的时间更加一致。
答案 1 :(得分:0)
我没有带GPU的2012b MATLAB来检查这个,但我认为你缺少一个wait()命令。在2012a,MATLAB引入了异步GPU计算。因此,当您向GPU发送内容时,它不会等到它完成后再继续执行代码。试试这个:
mygpu=gpuDevice(1);
a=rand(2.^20,1);
a=gpuArray(a);
b=gpuArray(0);
c=gpuArray(1);
tic % should take a long time
for k=1:1000
fft(a);
end
wait(mygpu); %Wait until the GPU has finished calculating before moving on
toc
tic % should be fast
for k=1:1000
b=b+c;
end
wait(mygpu); %Wait until the GPU has finished calculating before moving on
toc
添加的计算时间不应再取决于何时执行。你介意检查并回复我吗?