CUDA 计算能力 1.0 比 3.5 快

Posted

技术标签:

【中文标题】CUDA 计算能力 1.0 比 3.5 快【英文标题】:CUDA compute capability 1.0 faster than 3.5 【发布时间】:2013-05-03 07:15:03 【问题描述】:

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

为计算能力 1.0 和 sm 1.0 编译我的代码给出了一个 运行时间 47 毫秒

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


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

我在 linux 和 CUDA 5.0 上使用 nsight 编译器进行编译 而且我的内核主要受内存限制。

谢谢。


命令:

cc 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"

cc 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"

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

cc 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

cc 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]

【问题讨论】:

sm 1.0sm 3.5 问题不谈,避免像那样溢出到堆栈框架可能是个好主意。也许删除一些循环展开或类似的东西? 【参考方案1】:

大约两年前,我将模拟从 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 的旧精确性。

【讨论】:

谢谢!这似乎解决了这个问题,现在两个内核具有相当的性能。事实上,当增加块大小时,为 cc3.0 编译似乎确实像预期的那样快了大约 5% :) CC 1.0 中的“清零”是什么? @Jeb11:看这里***.com/questions/2083550/…【参考方案2】:

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

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

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

更新

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

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

【讨论】:

感谢您的回复,(0) 编译器声明支持 cc 3.5,但这也发生在 cc 2.x (1) 计算给出相同的结果,没有错误。 (2) 在这种情况下,性能差异似乎相当大,有关此问题的更多信息会有所帮助:) 编译器是什么意思?编译器将始终让您编译 3.5 - 无论您的系统中是否有 Titan 或 K20。如果您指的是 Nsight UI,那么您可能选择了与您的设备兼容的 PTX 1.0。 Re: 2 - 我同意 30% 的性能损失似乎有点太大了,因此我怀疑你根本没有执行 GPU 代码。您可以粘贴 Make 输出以查看发出的编译器命令吗? 你是对的,编译器似乎正在编译为 cc 3.0 ,但对于任何 cc 2.x 及更高版本,问题仍然存在。我已经更新了原始帖子以包含 make 命令。【参考方案3】:

我正在处理同样的问题。

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

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

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

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

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

【讨论】:

以上是关于CUDA 计算能力 1.0 比 3.5 快的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 计算能力之间有啥区别?

CUDA 计算能力要求

使用动态并行回退编译 CUDA - 多种架构/计算能力

如何计算正在启动的 CUDA 线程数?

使用cmake和3.5计算功能编译CUDA代码

如何针对 cublas_device 编译/链接具有不同计算能力的代码?