最近我开始扩展一个非常依赖boost的项目,将CUDA用于其最内层循环。我觉得有必要把我看到的一些奇怪的行为贴在这里。简单地包括某些boost头将导致我的第一个cuda调用生成大量内核。
If编译并调试以下代码:simplestCase.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 edition 操作系统:ubuntu 12.04 x64
- GPU: GeForce GTX 580(我相信我的GeForce GT 520正在被我的操作系统使用) boost lib: 1.52
- 猫/proc/driver/nvidia/version:
- NVRM版本:NVIDIA UNIX x86_64 Kernel Module 310.32 Mon Jan 14 14:41:13 PST 2013
- GCC版本:GCC version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
- Properties->Build->CUDA->DeviceLinkerMode = Separate Compilation
- Properties->Build->CUDA->GenerateGPUCode = 2.0
- Properties->Build->Settings->ToolSettings->NVCCLinker->Libraries = boostrongystem
- 属性->Name = simplest_case_example
我想就这些了。
编辑:谢谢你让我注意到我没有提问这个事实。我知道我忘记了一些重要的东西。我的问题是:
对我来说,在它们生成外围内核调用上非常特定的包含似乎很奇怪,特别是因为我不使用这些包含,而且我不知道它们如何影响我与CUDA的交互。 cuda应该为我甚至不使用的代码启动这么多额外的内核吗?我看到超过100个内核在我现在正在工作的项目中启动,当我在我的项目中唯一的CUDA相关代码是一个单一的cudaMalloc在程序的入口点。
Edit2:
同样发生在Tesla K20 (kepler架构卡,而我认为GTX 580是fermi)上。
Edit3:
更新cuda驱动程序到版本319.23。我上面提到的行为没有变化,但这确实解决了我在大型程序中遇到的调试器问题。
好吧,仍然没有实际的问题产生,所以我想这只是在后台发生的事情。