maxrregcount和动态并行的问题

时间:2015-06-05 09:58:36

标签: cuda nvidia

我正在尝试估计限制注册表使用对应用程序占用率的影响。在运行我的实验时,当我试图限制在Nvidia样本中找到的cdpBezierTessellation应用程序的寄存器数量时,我收到了一个错误。

标志已添加到nvcc:-maxrregcount 16

Error: nvlink error : entry function '_Z21computeBezierLinesCDPP10BezierLinei' with max regcount of 16 calls function 'cudaMalloc' with regcount of 18

我不明白为什么会发生这种情况。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:5)

正如评论者所说,链接器错误消息非常清楚地告诉您发生了什么。您正在尝试编译内核(computeBezierLinesCDP()),告诉它最多可以使用16个寄存器,但是当您进入链接步骤(在编译之后)时,链接器会发现其中一个函数从内核调用(cudaMalloc())使用18个寄存器。这是链接器明显无法满足的约束!

由于您无法减少cudaMalloc()使用的寄存器数量(因为它是预编译的库例程),您需要增加寄存器限制。

如果你真的需要将你的内核限制为16个寄存器,那么你需要避免调用cudaMalloc()(以及使用更多寄存器的任何其他例程)。您可以通过从主机预分配来避免从内核中分配内存。