1

我有一些 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。

有任何想法吗?

4

3 回答 3

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

它显着减少了编译时间和寄存器使用。

于 2009-11-23T10:27:07.220 回答
0

您应该注意,可以传递给函数的参数列表的大小是有限制的,目前为 256 字节(参见 CUDA 编程指南的 B.1.4 节)。功能完全改变了吗?

每个内核也有 200 万条 PTX 指令的限制,但你不应该接近那个;-)

您使用的是什么版本的工具包?如果您是注册开发者,则可以使用 3.0 测试版,这是一个重大更新。如果您仍然有问题,您应该联系 NVIDIA,他们当然需要能够重现问题。

于 2009-11-20T15:24:28.220 回答
0

编译行上的设置-maxrregcount 64会有所帮助,因为它会导致寄存器分配器更早地溢出到 lmem

于 2009-11-26T18:17:11.907 回答