【问题标题】:Calculating performance of CUFFTCUFFT的计算性能
【发布时间】:2012-03-09 08:24:15
【问题描述】:

我在划分为多个 GPU 的块 (N*N/p) 上运行 CUFFT,我对计算性能有疑问。首先,关于我是如何做到的:

  1. 向每个 GPU 发送 N*N/p 个块
  2. 对 p 个 GPU 中的每一行进行批处理 1-D FFT
  3. 将 N*N/p 个块返回主机 - 对整个数据集执行转置
  4. 同上步骤 1
  5. 同上步骤 2

Gflops = ( 1e-9 * 5 * N * N *lg(N*N) ) / execution time

执行时间计算如下:

execution time = Sum(memcpyHtoD + kernel + memcpyDtoH times for row and col FFT for each GPU)

这是在多个 GPU 上评估 CUFFT 性能的正确方法吗?有没有其他方法可以代表 FFT 的性能?

谢谢。

【问题讨论】:

  • 这是一个真实的还是复杂的变换?
  • cufftZ2Z - 我在执行时间中包含 fft 计划创建和销毁时间是否正确?如果我不包括它们,我会看到相当大的差异......
  • 对此没有“正确”的答案。您应该准确报告您的时间安排包括哪些内容。计划创建可能包括惰性运行时 API 上下文建立。如果确实如此,您可能不希望这样做。我并没有真正使用 CUFFT,也不太了解它的内部结构。
  • 出于好奇,为什么你有 5 * 1e-9 (问题是“5”部分)
  • @CarlodelMundo:长度为 N 的复杂 FFT 的操作计数是 5 N log2(N)(这是 5 的来源)。 1e-9 是从 FLOP/s 到 GFLOP/s 的转换因子。

标签: cuda fft cufft


【解决方案1】:

如果您正在执行复杂的变换,则操作计数是正确的(对于实值变换,它应该是 2.5 N log2(N)),但 GFLOP 公式不正确。在并行、多处理器操作中,通常的吞吐量计算是

operation count / wall clock time

在您的情况下,假设 GPU 并行运行,请测量执行时间的挂钟时间(即整个操作花费了多长时间),或者使用以下方法:

execution time = max(memcpyHtoD + kernel + memcpyDtoH times for row and col FFT for each GPU)

就目前而言,您的计算代表了串行执行时间。考虑到多 GPU 方案的开销,我预计您获得的计算性能数字将低于在单个 GPU 上完成的等效转换。

【讨论】:

  • 谢谢,我明白我哪里出错了。如果包括数据传输,那么 GPU 性能可以与 CPU 中的 n 个线程相媲美,这样说对吗?
  • 对不起,我不明白你想问什么。
  • 我注意到如果我在execution time 中包含memcpyHtoD/DtoH 时间,cpus 上多个线程上gpu 和fftw 的gflops 接近;因为我的目的是比较 fft 和 gpu 的 cpu 性能,所以我问了。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2016-08-08
  • 2021-03-28
  • 2016-07-26
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多