2

我想知道 fft 的巨大性能差异和使用 Matlab 在 GPU 上的简单添加。我希望 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时间还是一样的。

4

2 回答 2

1

我猜 Matlab 实际上并没有运行 fft,因为输出没有在任何地方使用。此外,在您的简单加法循环中,每次迭代都依赖于前一次,因此它必须连续运行。

我不知道为什么循环的顺序很重要。也许这与第一次循环后清理 GPU 内存有关。您可以尝试pause(1)在循环之间调用,让您的计算机在第二个循环之前回到空闲状态。这可能会使您的时间更加一致。

于 2013-01-25T14:48:55.713 回答
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

加法的计算时间不应再取决于何时执行。你介意检查一下然后回复我吗?

于 2013-02-01T16:47:48.417 回答