【问题标题】:Excessive Kernel Launches on Context Creation上下文创建时内核启动过多
【发布时间】:2013-05-13 05:39:17
【问题描述】:

最近我开始扩展一个非常依赖于 boost 的项目,以将 CUDA 用于其最内层循环。我认为值得在这里发布一些我一直看到的奇怪行为。简单地包含某些 boost 标头将导致我的第一个 cuda 调用生成大量内核。

如果编译调试以下代码: simpleCase.cu

#include <boost/thread.hpp>

int main(int argc, char **argv){
int *myInt;
cudaMalloc(&myInt, sizeof(int));
return 0;
}

我在执行 cudaMalloc 时收到以下调试消息行(如果我运行我定义的内核,则行为相同。似乎任何触发上下文创建的东西都会触发这个。):

[Launch of CUDA Kernel 0 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 1 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 2 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 3 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 4 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 5 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 6 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 7 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 8 (memset32_post<<<(1,1,1),(64,1,1)>>>) on Device 0]

到目前为止,我已经确定了两个导致问题的标头: 升压/thread.hpp 升压/mpi.hpp

这里有一些信息可能有助于重现问题:

  • IDE:nSight Eclipse 版
  • 操作系统:ubuntu 12.04 x64
  • GPU:GeForce GTX 580(我相信我的操作系统正在使用我的 GeForce GT 520)
  • 提升库:1.52
  • cat /proc/driver/nvidia/版本:
    • NVRM 版本:NVIDIA UNIX x86_64 内核模块 310.32 Mon Jan 14 14:41:13 PST 2013
    • GCC 版本:gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

项目设置:

  • Properties->Build->CUDA->DeviceLinkerMode = 单独编译
  • 属性->构建->CUDA->生成GPUCode = 2.0
  • Properties->Build->Settings->ToolSettings->NVCCLinker->Libraries = boost_system
  • 属性->名称 = simple_case_example

我认为这就是一切。

编辑:

感谢您让我注意到我没有提出任何问题。我知道我忘记了一些重要的事情。 我的问题是这样的:

在我看来,它们生成外围内核调用的非常具体的包含很奇怪,特别是因为我不使用这些包含,而且我看不出它们会如何影响我与 CUDA 的交互。 cuda 是否应该为我什至不使用的代码启动这么多额外的内核?我看到我现在正在处理的项目中启动了 100 多个内核,而我的项目中唯一与 CUDA 相关的代码是程序入口点处的单个 cudaMalloc。

编辑2:

也发生在 Tesla K20(开普勒架构卡,而我认为 GTX 580 是费米)上。

编辑3:

将 cuda 驱动程序更新到版本 319.23。我上面提到的行为没有改变,但这确实解决了我在大型程序中遇到的调试器问题。

【问题讨论】:

  • 您未能提出问题。尽管您可能认为问题应该是显而易见的,但让它显而易见仍然是一种很好的做法。我认为您观察到的是,CUDA 运行时可能会自行决定调用各种非显而易见的操作以处理某些任务,例如“在后台”启动“额外”内核。我想您要问的是为什么包含特定的 boost 标头会导致运行时执行这些特定的内核调用?您在描述中使用了“问题”一词,但我不确定这里是否存在任何实际的“问题”。
  • 我无法在我可以访问的任何平台上复制此内容...
  • 有趣。我设法在同事的计算机上重现了这一点。我不知道我错过的任何细节。虽然我相信我们的计算机包含相同的硬件,但我相信显卡应该是这种情况下唯一可能的违规者。

标签: boost cuda boost-thread cuda-context


【解决方案1】:

好吧,仍然没有由此引起的实际问题,所以我想这只是在后台发生的事情。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2012-10-28
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多