【问题标题】:Matlab GPU performance fft vs. simple additionMatlab GPU 性能 fft 与简单加法
【发布时间】:2013-01-09 09:10:50
【问题描述】:

我想知道 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时间还是一样的。

【问题讨论】:

  • 在您的示例中, b 和 c 是标量。是故意的吗?
  • 哪个版本的 MATLAB?
  • 我使用 Matlab r2012b。 @Jonas,你是对的, b 和 ca 是标量。重点是,为什么标量加法这么慢。我正在尝试优化我的 Matlab 代码,但这种添加总是让我的代码变慢。

标签: performance matlab gpu


【解决方案1】:

我没有带 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

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

【讨论】:

  • 我检查了你的代码。第一个循环大约需要 1.2 秒,而第二个(加法)只需要 0.2 秒(在 MATLAB2012b 上)。
【解决方案2】:

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

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

【讨论】:

  • 如果我写 g=fft(a) 而不是 fft(a),它不会改变任何事情。 fft 要快得多。
  • 但是 g 没有在任何地方使用,所以它仍然可以被优化掉。如果你运行s = 0; for k=1:1000, s = s + fft(a); end 会怎样?
  • 好吧,你说得对。它被优化了。谢谢你。但我仍然想知道添加。即使 FFT 被优化掉了,为什么加法的计算时间取决于它是在 FFT 之前还是之后进行的?
  • 不确定循环的顺序。我在我的答案中猜测。
猜你喜欢
  • 2013-08-19
  • 2012-06-04
  • 2013-02-24
  • 1970-01-01
  • 2014-12-08
  • 2017-11-09
  • 2014-10-10
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多