我正在尝试估计限制注册表使用对应用程序占用率的影响。在运行我的实验时,当我试图限制在Nvidia样本中找到的cdpBezierTessellation应用程序的寄存器数量时,我收到了一个错误。
标志已添加到nvcc:-maxrregcount 16
Error: nvlink error : entry function '_Z21computeBezierLinesCDPP10BezierLinei' with max regcount of 16 calls function 'cudaMalloc' with regcount of 18
我不明白为什么会发生这种情况。任何人都可以帮我这个吗?
答案 0 :(得分:5)
正如评论者所说,链接器错误消息非常清楚地告诉您发生了什么。您正在尝试编译内核(computeBezierLinesCDP()
),告诉它最多可以使用16个寄存器,但是当您进入链接步骤(在编译之后)时,链接器会发现其中一个函数从内核调用(cudaMalloc()
)使用18个寄存器。这是链接器明显无法满足的约束!
由于您无法减少cudaMalloc()
使用的寄存器数量(因为它是预编译的库例程),您需要增加寄存器限制。
如果你真的需要将你的内核限制为16个寄存器,那么你需要避免调用cudaMalloc()
(以及使用更多寄存器的任何其他例程)。您可以通过从主机预分配来避免从内核中分配内存。