CUDA内核无法启动

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)


dth*_*rpe 4

您确定您的CUDA设备支持SM_20架构吗?

从 nvcc 命令行中删除 arch= 选项并重建所有内容。这是针对 1.0 CUDA 架构进行编译的,所有 CUDA 设备都支持该架构。如果它仍然无法运行,请执行干净的构建并确保任何地方都没有留下目标文件。然后重建并运行。

另外,arch=指的是虚拟架构,应该类似于compute_10。sm_20 是真正的架构,我相信应该与 code= 开关一起使用,而不是 arch= 。

  • 了解您的硬件的功能。运行硬件不支持的代码很困难。;&gt; (2认同)