6

我的问题很像这个。我运行最简单的 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() 操作时,它不会返回任何错误。关于内核为什么不启动的任何建议?

4

3 回答 3

13

使用时不打印的原因是printf内核启动是异步的,并且您的程序在 printf 缓冲区被刷新之前退出。CUDA (5.0) C Programming Guide 的 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>>>(); 
} 

但是这个程序会打印十次“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();
} 
于 2012-08-29T02:02:56.723 回答
3

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

从您的 nvcc 命令行中删除 arch= 选项并重建所有内容。这为 1.0 CUDA 架构编译,所有 CUDA 设备都支持该架构。如果它仍然没有运行,请进行构建清理并确保没有任何目标文件遗留在任何地方。然后重建并运行。

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

于 2012-08-28T17:24:18.540 回答
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生成代码。但是,如果您要将其运送给其他人,则最好将所有这些都包括在内。

于 2019-02-26T06:56:33.070 回答