Matlab GPU性能fft与简单添加

时间:2013-01-25 11:49:35

标签: performance matlab gpu

我想知道使用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时间仍然相同。

2 个答案:

答案 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

添加的计算时间不应再取决于何时执行。你介意检查并回复我吗?