Tar*_*rek 6 cuda gpu gpgpu gpu-programming
我的问题是非常喜欢这一个.我运行最简单的CUDA程序,但内核没有启动.但是,我确信我的CUDA安装没问题,因为我可以运行复杂的CUDA项目,包括几个文件(我从其他人那里拿走),没有任何问题.在这些项目中,编译和链接是通过带有大量标志的makefile完成的.我认为问题在于编译时使用的正确标志.我只是使用这样的命令:
nvcc -arch=sm_20 -lcudart test.cu使用这样的程序(在linux机器上运行):
__global__ void myKernel()
{
cuPrintf("Hello, world from the device!\n");
}
int main()
{
cudaPrintfInit();
myKernel<<<1,10>>>();
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
}
Run Code Online (Sandbox Code Playgroud)
该程序正确编译.当我添加cudaMemcpy()操作时,它不会返回任何错误.关于为什么内核不启动的任何建议?
har*_*ism 12
它在使用时不打印的原因是printf内核启动是异步的,并且在刷新printf缓冲区之前程序正在退出.CUDA(5.0)C编程指南的B.16节解释了这一点.
在内核启动之前,printf()的输出缓冲区设置为固定大小(请参阅关联的主机端API).它是循环的,如果在内核执行期间产生的输出多于缓冲区中的输出,则会覆盖旧的输出.仅在执行以下操作之一时才刷新:
- 通过<<< >>>或cuLaunchKernel()启动内核(在启动开始时,如果CUDA_LAUNCH_BLOCKING环境变量设置为1,则在启动结束时),
- 通过cudaDeviceSynchronize(),cuCtxSynchronize(),cudaStreamSynchronize(),cuStreamSynchronize(),cudaEventSynchronize()或cuEventSynchronize()进行同步,
- 内存副本通过任何阻止版本的cudaMemcpy*()或cuMemcpy*(),
- 通过cuModuleLoad()或cuModuleUnload()加载/卸载模块,
- 通过cudaDeviceReset()或cuCtxDestroy()进行上下文破坏.
因此,此程序不打印任何内容:
#include <stdio.h>
__global__ void myKernel()
{
printf("Hello, world from the device!\n");
}
int main()
{
myKernel<<<1,10>>>();
}
Run Code Online (Sandbox Code Playgroud)
但是这个程序打印了"Hello,world from the device!\n"十次.
#include <stdio.h>
__global__ void myKernel()
{
printf("Hello, world from the device!\n");
}
int main()
{
myKernel<<<1,10>>>();
cudaDeviceSynchronize();
}
Run Code Online (Sandbox Code Playgroud)
您确定您的CUDA设备支持SM_20架构吗?
从 nvcc 命令行中删除 arch= 选项并重建所有内容。这是针对 1.0 CUDA 架构进行编译的,所有 CUDA 设备都支持该架构。如果它仍然无法运行,请执行干净的构建并确保任何地方都没有留下目标文件。然后重建并运行。
另外,arch=指的是虚拟架构,应该类似于compute_10。sm_20 是真正的架构,我相信应该与 code= 开关一起使用,而不是 arch= 。