3

我有一个在 680gtx 上运行的 cuda 程序,在测试不同的编译器选项时,我注意到:

  • 为计算能力 1.0 和 sm 1.0 编译我的代码给出了 47ms 的运行时间

  • 为计算能力 3.5(也是 2.0)和 sm 3.0 编译我的代码,运行时间为 60 毫秒


出现这种结果的原因可能是什么?

我在 linux 和 CUDA 5.0 上编译 nsight 编译器,我的内核主要是内存绑定的。

谢谢。


命令:

抄送 1.0

nvcc --compile -O0 -Xptxas -v -gencode arch=compute_10,code=compute_10 -gencode arch=compute_10,code=sm_10 -keep -keep-dir /tmp/debug -lineinfo -pg -v  -x cu -o  "BenOlaCuda/src/main.o" "../BenOlaCuda/src/main.cu"

抄送 3.0

nvcc -lineinfo -pg -O0 -v -keep -keep-dir /tmp/debug -Xptxas -v -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -odir "BenOlaCuda/src" -M -o "BenOlaCuda/src/main.d" "../BenOlaCuda/src/main.cu"

有关编译我的内核的更多信息:

抄送 1.0

ptxas info    : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_10'
ptxas info    : Used 40 registers, 68 bytes smem, 64 bytes cmem[1], 68 bytes lmem

抄送 3.0

ptxas info    : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_30'
ptxas info    : Function properties for _Z15optimizePixelZ3tfPfS_S_S_tttttt
128 bytes stack frame, 100 bytes spill stores, 108 bytes spill loads
ptxas info    : Used 63 registers, 380 bytes cmem[0], 20 bytes cmem[2]
4

3 回答 3

6

大约两年前,我将模拟从 CUDA3.2 切换到 CUDA4.0,性能下降了约 10%。借助 Compute Capability 2.0,nVidia 引入了符合 IEEE754-2008 的浮点计算(CC 1.0 使用了 IEEE754-1985)。这一点,以及删除“刷新为零”是性能下降的原因。尝试使用编译器标志 --use_fast_math 编译您的 CC 3.0 可执行文件。这启用了 CC 1.0 的旧精确性。

于 2013-05-10T07:05:10.340 回答
3

请注意,680 无法运行 SM 3.5 代码 - 只能运行 3.0。只有 Titan 可以运行 SM 3.5。

对于您所看到的差异,我有两种截然不同的解释:

  1. 实际上没有执行任何 GPU 代码。如果您编译“GPU”1.0(而不是“PTX”),就会发生这种情况。确保检查所有 CUDA RT 调用的错误值。
  2. 在一些相当罕见的情况下,编译到 PTX 1.0 的代码在 JITed 到 3.0 后运行得更快,然后代码直接编译到 3.0。这是由用于发出 GPU/PTX 1.0 代码和 SM 2+ 代码的不同编译器引起的。请注意,在大多数情况下,由 2+ 编译器发出的代码更快 - 但有些代码模式有相反的报告。

更新

显然,您的代码需要大量寄存器,并且为 3.0 编译会分配更多寄存器(因为此架构具有更高的寄存器数量),从而限制了占用。

您可以尝试使用您的块大小和/或限制代码使用的寄存器数量。如果不查看您的代码并尝试使用探查器,就很难提出任何建议。我还建议您在 CUDA 工具包 5.5 可用时尝试它 - 编译器可能会做出不同的权衡来提高代码的性能。

于 2013-05-08T23:06:23.697 回答
0

我正在处理同样的问题。

看起来 cuda 计算能力指数(1.0 2.0 2.1 3.0 3.5 等)是 cuda 卡可以处理的操作类型的指标。(参见:http ://en.wikipedia.org/wiki/CUDA 版本功能和规格,红色和绿色表格部分)。

另一件事是每个 cuda 卡的计算能力。这取决于 gpus 的数量和类型以及 ram 速度等。

因此,可能会有一张“只有”cuda 3.0 的卡,例如 gtx-760,具有 1152 个内核和 cuda 3.0,可能还有另一张卡 gt 640、384 个内核,但 cuda 3.5)

唯一可以在两种设备上比较的代码,必须兼容 3.0,并且可能在 gtx 760 上运行得更快,尽管只有 3.0 和 640 3.5

我认为他们应该更清楚一点,计算能力指数与其说是速度,不如说是大多数人的想法,而是关于能力。

于 2014-02-01T13:47:04.683 回答