CUDA内核无法启动

时间:2012-08-28 17:12:33

标签: cuda gpu gpgpu gpu-programming

我的问题非常像one。我运行最简单的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(); 
} 

程序正确编译。当我添加cudaMemcpy()操作时,它不会返回任何错误。关于为什么内核不启动的任何建议?

3 个答案:

答案 0 :(得分:12)

使用printf时不打印的原因是内核启动是异步的,并且在刷新printf缓冲区之前程序正在退出。 CUDA(5.0)C编程指南的B.16节解释了这一点。

  

在内核启动之前,printf()的输出缓冲区设置为固定大小(请参阅   关联的主机端API)。它是循环的,如果在内核期间产生更多输出   执行比可以放入缓冲区,旧的输出被覆盖。它只是被冲洗了   当执行其中一个操作时:

     
      
  • 通过&lt;&lt;&lt;&lt;&gt;&gt;&gt;启动内核或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>>>(); 
} 

但是这个程序打印了“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();
} 

答案 1 :(得分:3)

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

从nvcc命令行中删除arch =选项并重建所有内容。这将编译1.0 CUDA架构,这将在所有CUDA设备上得到支持。如果它仍然没有运行,请执行构建清理并确保没有任何目标文件留在任何位置。然后重建并运行。

此外,arch =指的是虚拟架构,它应该类似于compute_10。 sm_20是真正的架构,我认为应该与code = switch一起使用,而不是arch =。

答案 2 :(得分:0)

在Visual Studio中:

  

右键单击您的项目>属性> Cuda C / C ++>设备

,然后将其添加到代码生成字段

compute_30,sm_30;compute_35,sm_35;compute_37,sm_37;compute_50,sm_50;compute_52,sm_52;compute_60,sm_60;compute_61,sm_61;compute_70,sm_70;compute_75,sm_75;

为所有这些体系结构生成代码会使您的代码慢一些。因此,一劳永逸地找出GPU需要的computesm gen代码。 但是,如果您要将此产品运送给其他人,最好将所有这些都包括在内。