Cuda 错误 (209): cudaLaunchKernel 返回 cudaErrorNoKernelImageForDevice

Posted

技术标签:

【中文标题】Cuda 错误 (209): cudaLaunchKernel 返回 cudaErrorNoKernelImageForDevice【英文标题】:Cuda Error (209): cudaLaunchKernel returned cudaErrorNoKernelImageForDevice 【发布时间】:2020-11-04 03:14:06 【问题描述】:

操作系统:CentOS 7 Cuda 工具包版本:11.0

Nvidia 驱动程序和 GPU 信息:

NVIDIA-SMI 450.51.05 驱动程序版本:450.51.05 CUDA 版本:11.0 显卡:Quadro M2000M

screenshot of nvidia-smi details

我对 cuda 编程非常陌生,因此非常感谢任何指导。我有一个非常简单的 cuda c++ 程序,它计算 GPU 上统一内存中两个数组的总和。但是,由于 cudaErrorNoKernelImageForDevice 错误,内核似乎无法启动。代码如下:

using namespace std;
#include <iostream>
#include <math.h>
#include <cuda_runtime_api.h>
__global__
void add(int n, float *x, float*y)
for (int i = 0; i < n; i++)
y[i] = x[i] + y[i];


int main() 
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

int N = 1<<20;
float *x, *y;

cudaMallocManaged((void**)&x, N*sizeof(float));
cudaMallocManaged((void**)&y, N*sizeof(float));

for(int i = 0; i < N; i++)
x[i] = 1.0f;
y[i] = 2.0f;


add<<<1, 1>>>(N, x, y);
cudaGetLastError();
    /**
     * This indicates that there is no kernel image available that is suitable
     * for the device. This can occur when a user specifies code generation
     * options for a particular CUDA source file that do not include the
     * corresponding device configuration.
     *
     *    cudaErrorNoKernelImageForDevice       =     209,
     */

cudaDeviceSynchronize();

float maxError = 0.0f;
for (int i = 0; i < N; i++)
maxError = fmax(maxError, fabs(y[i]-3.0f));


cudaFree(x);
cudaFree(y);

return 0;




【问题讨论】:

这是您如何编译代码的问题。您是如何编译代码的(即您使用什么命令来编译它,究竟是什么?)您的 Quadro M2000M 是一款 maxwell 设备,计算能力为 5.0,因此您需要编译以获得正确的计算能力。在你的编译命令中像-arch=sm_50 这样的东西。如果您有 -arch=sm_60 之类的内容,则可以解释为什么会出现此故障。 注意by default,CUDA 11.0 编译为默认架构sm_52,所以如果你没有在命令行提供任何架构开关,也会导致此类问题。 @RobertCrovella 我正在使用 Eclipse IDE,编译器命令在构建文件时输出如下: /usr/local/cuda-11.0/bin/nvcc --device-debug -- debug -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 -ccbin g++ -c -o "src/barracuda.o" "../src/barracuda.cu" 这就是问题所在。编译命令行中的所有_52 都不适合您的 GPU。当您设置项目(或在项目属性中)以更改您正在编译的体系结构时,IDE 有一个选择。你想要_50 而不是_52 @RobertCrovella 好的,鉴于我的 GPU 具有 5.0 的计算能力,我应该使用 -arch=sm_XX 的架构进行编译,其中 XX 代表我的计算能力?在这种情况下,XX = 50?我会试试看。 【参考方案1】:

这里的错误是由于必须以生成的代码(PTX 或 SASS)与运行它的 GPU 兼容的方式编译 CUDA 内核。这是一个有很多细微差别的主题,因此请参阅this(以及那里的链接)之类的问题以获取更多背景信息。

当我们想要精确时,GPU 架构被称为计算能力。您可以通过 google 搜索或运行 deviceQuery CUDA sample code 来发现 GPU 的计算能力。计算能力表示为 (major).(minor) 所以类似于计算能力 5.2 或 7.0 等。

编译代码时,需要指定计算能力(如果没有,则隐含default compute capability)。如果您在以与您的 GPU 匹配的方式编译时指定计算能力,那么一切都应该没问题。然而,较新/较高计算能力的代码通常不会在较旧/较低计算能力的 GPU 上运行。在这种情况下,您将看到您所描述的错误:

cudaErrorNoKernelImageForDevice

209

"GPU 没有二进制文件"

或类似的。如果您不执行proper CUDA error checking,您也可能根本看不到任何显式错误。解决方案是将编译时指定的计算能力与您打算运行的 GPU 相匹配。执行此操作的方法将根据您使用的工具链/IDE 而有所不同。对于基本的nvcc 命令行用法:

nvcc -arch=sm_XY ...

将指定 X.Y 的计算能力

对于 Eclipse/Nsight Eclipse/Nsight Visual Studio,可以在项目属性中指定计算能力。根据工具的不同,它可以表示为开关值(例如compute_XYsm_XY),也可以用数字表示为 X.Y

【讨论】:

以上是关于Cuda 错误 (209): cudaLaunchKernel 返回 cudaErrorNoKernelImageForDevice的主要内容,如果未能解决你的问题,请参考以下文章

Cuda 错误 CUDA_ERROR_NO_BINARY_FOR_GPU

删除内核调用中的倍数以获得更好的性能

React开发(209):react错误边界

怎么解决?颤振(6629):[错误:颤振/lib/ui/ui_dart_state.cc(209)]未处理的异常:NoSuchMethodError

无法安装 pentaho 业务分析 5.2.0.0-209-x64

从文件TEST中读出字符并写入TEST1里,要求均附加错误检查--p209_5