Debugging 我的CUDA内核是真的在设备上运行还是在模拟中被主机错误地执行?

Debugging 我的CUDA内核是真的在设备上运行还是在模拟中被主机错误地执行?,debugging,cuda,printf,gpu,Debugging,Cuda,Printf,Gpu,我刚拿到了我的GPU视频卡,开始玩CUDA。为了弄清楚块和线程,我编写了一个简单的内核,将其标识符存储到共享内存中,稍后将其复制回主机并打印。但是我想,为什么不在内核函数中简单地使用printf?尽管我认为这是不可能的,但我已经尝试过了。以下是我的尝试: __global__ void printThreadXInfo (int *data) { int i = threadIdx.x; data[i] = i; printf ("%d\n", i); } 。。但我突然

我刚拿到了我的GPU视频卡,开始玩CUDA。为了弄清楚块和线程,我编写了一个简单的内核,将其标识符存储到共享内存中,稍后将其复制回主机并打印。但是我想,为什么不在内核函数中简单地使用
printf
?尽管我认为这是不可能的,但我已经尝试过了。以下是我的尝试:

__global__ void
printThreadXInfo (int *data)
{
    int i = threadIdx.x;
    data[i] = i;
    printf ("%d\n", i);
}
。。但我突然在控制台中看到了输出。然后我搜索了开发人员手册,找到了关于设备仿真部分中提到的
printf
。据说设备仿真提供了在内核中运行主机特定代码的好处,比如调用
printf

我真的不需要调用
printf
。但现在我有点困惑。我有两个假设。首先,NVidia开发人员在设备上实现了一些特定的
printf
,开发人员以某种方式透明地访问调用进程并执行标准
printf
函数,并负责内存复制等。这听起来有点疯狂。另一个假设是,我编译的代码以某种方式在仿真中运行,而不是在实际设备上运行。但这听起来也不对,因为我只是测量了在100万元素阵列上添加两个数字的性能,CUDA内核的速度比我在CPU上的速度快了200倍。或者,当它检测到某些特定于主机的代码时,它可能会在仿真中运行?如果这是真的,那为什么不向我发出警告呢

请帮我整理一下。我在Linux上使用NVidia GeForce GTX 560 Ti(英特尔至强,1个CPU,4个物理内核,8 GB内存,如果需要的话)。这是我的
nvcc
版本:

$/usr/local/cuda/bin/nvcc--version
nvcc:NVIDIA(R)Cuda编译器驱动程序
版权所有(c)2005-2011英伟达公司
建于2011年5月12日星期四9时45分
Cuda编译工具,4.0版,V0.2.1221
下面是我如何编译代码的:

/usr/local/cuda/bin/nvcc-gencode=arch=compute\u 20,code=\“sm\u 21,compute\u 20\”-m64——编译器选项-fno严格别名-isystem/opt/boost\u 1\u 46\u 1/include-isystem/usr/local/cuda/include-compiler bindir”/usr/local/cuda/bin-O3-DNDEBUG-o构建linux版本/ThreadIdxTest.cu.o-c-idxtest.cu
/usr/local/cuda/bin/nvcc-gencode=arch=compute\u 20,code=\'sm\u 21,compute\u 20\'-m64--编译器选项-fno严格别名-isystem/opt/boost\u 1\u 46\u 1/include-isystem/usr/local/cuda/include-I../include--compiler bindir/usr/local/cuda/bin“-O3-DNDEBUG--生成依赖项ThreadIdxTest.cu | sed-e“s;ThreadIdxTest.o;build_linux_release/ThreadIdxTest.cu.o;g“>build\u linux\u release/ThreadIdxTest.d
g++-pipe-m64-ftemplate-depth-1024-fno严格别名-fPIC-pthread-DNDEBUG-fomit帧指针-momit叶帧指针-fno树预签名循环-Wuninitialized-Wstrict别名-ftree向量化-ftree循环线性-funroll循环-fsched interblock-march=native-mtune=native-g0-O3-ffor作用域-fuse cxa-atexit-fvisibility inlines高dden-Wall-Wextra-Wreorder-Wcast align-Winit self-Wmissing括号-Wmissing include dirs-Wswitch enum-Wunused参数-wreduntant decls-Wreturn类型-isystem/opt/boost_1_46_1/include-isystem/usr/local/cuda/cuda/include-I../include-L/opt/boost_1_46_1/lib-L/usr/local/cuda/lib64-lcudart-lgtest-lgtest-lgtest\u主版本linux_发行版/ThreadIdxTest.cu.o../src/build_linux_release/libspartan.a-o build_linux_release/ThreadIdxTest
…顺便说一下,主机代码和内核代码都混合在一个扩展名为
.cu
的源文件中(也许我不应该这样做,但我在SDK示例中看到了这种风格)


非常感谢您的帮助。谢谢!

从CUDA?3.1?开始,它们不再进行任何设备仿真。现在内核支持Printf。

每隔很长一段时间,我的内存就会工作。

3.1中的原始说明是,只要您使用费米体系结构卡,它们就可以直接从内核中促进Printf()。(这就是560!)它解释了一切,完美。非常感谢!