maxrregcount和动态并行的问题

Adi*_*hah 0 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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这种情况.谁能帮我这个?

Tom*_*Tom 5

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

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

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