gpt4 book ai didi

CUDA 内核未启动

转载 作者:行者123 更新时间:2023-12-01 21:15:30 35 4
gpt4 key购买 nike

我的问题很像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() 操作时,它不返回错误。关于为什么内核不启动有什么建议吗?

最佳答案

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

The output buffer for printf() is set to a fixed size before kernel launch (see Associated Host-Side API). It is circular and if more output is produced during kernel execution than can fit in the buffer, older output is overwritten. It is flushed only when one of these actions is performed:

  • Kernel launch via <<<>>> or cuLaunchKernel() (at the start of the launch, and if the CUDA_LAUNCH_BLOCKING environment variable is set to 1, at the end of the launch as well),
  • Synchronization via cudaDeviceSynchronize(), cuCtxSynchronize(), cudaStreamSynchronize(), cuStreamSynchronize(), cudaEventSynchronize(), or cuEventSynchronize(),
  • Memory copies via any blocking version of cudaMemcpy*() or cuMemcpy*(),
  • Module loading/unloading via cuModuleLoad() or cuModuleUnload(),
  • Context destruction via cudaDeviceReset() or 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();
}

关于CUDA 内核未启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164235/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com