我有一个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]
答案 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。
我对你所看到的差异有两种截然不同的解释:
<强>更新强>
显然,你的代码需要大量的寄存器,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
我认为他们应该更清楚地表明,计算能力指数与速度无关,大多数人都认为是关于能力的。