CUDA:nvcc花几分钟编译的原因是什么?

时间:2009-10-21 20:48:35

标签: cuda gpgpu nvcc

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

有什么想法吗?

3 个答案:

答案 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