我有一些CUDA代码nvcc
(技术上ptxas
)喜欢花费10分钟来编译。虽然它不小,但肯定不是很大。 (约5000行)。
延迟似乎在CUDA版本更新之间出现,但之前只花了一分钟左右而不是10分钟。
当我使用-v
选项时,在显示以下内容后似乎卡住了:
ptxas --key="09ae2a85bb2d44b6" -arch=sm_13 "/tmp/tmpxft_00002ab1_00000000-2_trip3dgpu_kernel.ptx" -o "/tmp/tmpxft_00002ab1_00000000-9_trip3dgpu_kernel.sm_13.cubin"
内核确实有一个相当大的参数列表,并且传递了一个具有大量指针的结构,但我确实知道至少有一个时间点,其中几乎完全相同的代码仅在一个几秒钟。
如果有帮助,我正在运行64位Ubuntu 9.04。
有什么想法吗?
答案 0 :(得分:2)
我有类似的问题 - 没有优化,编译失败了寄存器,并且通过优化它花了近半个小时。我的内核有像
这样的表达式t1itern[II(i,j)] = (1.0 - overr) * t1itero[II(i,j)] + overr * (rhs[IJ(i-1,j-1)].rhs1 - abiter[IJ(i-1,j-1)].as * t1itern[II(i,j - 1)] - abiter[IJ(i-1,j-1)].ase * t1itero[II(i + 1,j - 1)] - abiter[IJ(i-1,j-1)].ae * t1itern[II(i + 1,j)] - abiter[IJ(i-1,j-1)].ane * t1itero[II(i + 1,j + 1)] - abiter[IJ(i-1,j-1)].an * t1itern[II(i,j + 1)] - abiter[IJ(i-1,j-1)].anw * t1itero[II(i - 1,j + 1)] - abiter[IJ(i-1,j-1)].aw * t1itern[II(i - 1,j)] - abiter[IJ(i-1,j-1)].asw * t1itero[II(i - 1,j - 1)] - rhs[IJ(i-1,j-1)].aads * t2itern[II(i,j - 1)] - rhs[IJ(i-1,j-1)].aadn * t2itern[II(i,j + 1)] - rhs[IJ(i-1,j-1)].aade * t2itern[II(i + 1,j)] - rhs[IJ(i-1,j-1)].aadw * t2itern[II(i - 1,j)] - rhs[IJ(i-1,j-1)].aadc * t2itero[II(i,j)]) / abiter[IJ(i-1,j-1)].ac;
当我重写它们时:
tt1 = lrhs.rhs1;
tt1 = tt1 - labiter.as * t1itern[II(1,j - 1)];
tt1 = tt1 - labiter.ase * t1itern[II(2,j - 1)];
tt1 = tt1 - labiter.ae * t1itern[II(2,j)];
//etc
它显着减少了编译时间和寄存器使用。
答案 1 :(得分:0)
您应该注意,可以传递给函数的参数列表的大小有限制,目前为256字节(参见“CUDA编程指南”的B.1.4节)。功能是否已更改?
每个内核还有200万条PTX指令限制,但你不应该接近它; - )
您使用的是什么版本的工具包?如果您是注册开发人员,则可以使用3.0测试版,这是一项重大更新。如果您仍然遇到问题,请联系NVIDIA,他们当然需要能够重现问题。
答案 2 :(得分:0)
在编译行上设置-maxrregcount 64
有帮助,因为它会导致寄存器分配器溢出到早期的lmem