0

最近我开始扩展一个非常依赖于 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]

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

这里有一些信息可能对复制问题有用:

  • IDE:nSight Eclipse 版
  • 操作系统:ubuntu 12.04 x64
  • GPU:GeForce GTX 580(我相信我的操作系统正在使用我的 GeForce GT 520)
  • 提升库:1.52
  • 猫 /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。我上面提到的行为没有改变,但这确实解决了我在大型程序中遇到的调试器问题。

4

1 回答 1

0

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

于 2013-07-26T20:59:29.193 回答