【问题标题】:CUDA: What reasons could there be for nvcc taking several minutes to compile?CUDA:nvcc 编译需要几分钟的原因是什么?
【发布时间】:2010-12-08 21:06:00
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 可能是编译器中的错误?编译器是否占用了大量内存并导致系统崩溃?
  • 鉴于问题的性质,我不会感到惊讶。特别是当我使用 --device-emulation 编译时,它编译得很快。当然,即使它是编译器中的一个错误,我仍然希望能够对此做点什么。
  • 如果禁用优化会怎样?
  • 禁用优化也会出现同样的问题。
  • 您使用的是什么版本的工具包和驱动程序? 3.0 测试版使用更新的后端。

标签: cuda gpgpu nvcc


【解决方案1】:

我遇到了类似的问题——没有优化,编译失败,寄存器用完了,优化花了将近半个小时。我的内核有类似

的表达式
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

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

【讨论】:

  • 有趣。当您重写它们时,如果没有优化它仍然会失败吗?也就是说,您是否像这样重写它足以暗示只有优化器能够保存寄存器,或者基本编译器也能够?
  • 即使没有优化也有帮助。看起来 nvcc 基本编译器有问题,优化器问题只是后果
【解决方案2】:

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

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

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

【讨论】:

  • 我知道参数限制,我之前遇到过这个问题。 (令人讨厌的是,我似乎无法通过仅使用结构来解决它)但是,我不清楚这是否是导致减速的一个因素。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2014-12-17
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多