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.0
与 sm 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 快的主要内容,如果未能解决你的问题,请参考以下文章