【问题标题】:Problems with maxrregcount and dynamic parallelismmaxrregcount 和动态并行的问题
【发布时间】:2015-08-20 05:37:33
【问题描述】:

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

添加到 nvcc 的标志:-maxrregcount 16

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

我不明白为什么会这样。谁能帮我解决这个问题?

【问题讨论】:

  • 你读过this吗?
  • 没有什么可以帮助的。链接器很有帮助地告诉您您尝试做的事情是不可能的,因为内核调用了一个预编译的设备函数,其寄存器占用空间比您的 maxrregcount 设置所允许的要大。
  • 我明白我无能为力。我正在寻求帮助以了解为什么会发生这种情况。

标签: cuda nvidia


【解决方案1】:

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

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

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

【讨论】:

  • 我理解那部分。但是如果我不使用动态并行并尝试将 cudaMalloc 的寄存器使用限制在 16 个寄存器,它会编译和链接而不会出现任何错误。我不明白的部分是,当我在此设置中使用 cudaMalloc 时,为什么链接器会失败。
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2020-09-23
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多