CUDA计算能力1.0比3.5快

时间:2013-05-08 22:16:25

标签: cuda gpgpu nvidia compiler-optimization nsight

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

  • 编译我的代码用于计算能力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]

3 个答案:

答案 0 :(得分: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的旧精度。

答案 1 :(得分: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. <强>更新

    显然,你的代码需要大量的寄存器,3.0的编译会分配更多的寄存器(因为这种架构具有更高的寄存器号),限制了占用率。

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

答案 2 :(得分:0)

我正在处理同样的问题。

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

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

所以可能有一张“仅”cuda 3.0的卡,例如gtx-760,拥有1152个核心和cuda 3.0,并且可能有另外一张卡片,640 640,384核心,但cuda 3.5)

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

我认为他们应该更清楚地表明,计算能力指数与速度无关,大多数人都认为是关于能力的。