最近我开始扩展一个非常依赖boost的项目,使其最内部的循环使用CUDA。不过我觉得值得在这里发布一些我看到的奇怪行为。简单地包含某些boost头会导致我的第一次cuda调用产生大量的kernels。
如果编译并调试以下代码:simpleestCase.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]
到目前为止,我发现有两个头文件导致了这个问题:boostthread.hppboostmpi.hpp。
这里有一点信息,可能对复制这个问题有用。
项目设置。
我想这就是一切
编辑。
谢谢你让我注意到我没有问过问题的事实。我知道我忘记了一些关键的东西.我的问题是这样的。
我觉得很奇怪,在他们的生成外设内核调用中,非常具体的包括,特别是我没有使用这些包括,我不明白它们如何影响我与CUDA的交互。cuda应该为我根本不用的代码启动这么多额外的内核吗?我看到在我现在正在做的项目中,有超过100个内核被启动。 当我的项目中唯一与CUDA相关的代码就是在程序的入口处有一个cudaMalloc。
编辑2.在Tesla K20(开普勒架构卡)上也会发生。
同样发生在Tesla K20上 (开普勒架构卡, 而我认为GTX 580是费米卡).
编辑3:我把cuda驱动更新到319版本。
更新cuda驱动到319.23版本。我上面提到的行为没有变化,但这确实解决了我在大型程序中遇到的调试器问题。
好吧,还是没有实际问题产生,所以我想这只是后台发生的事情。