GPUno kernel image is available for execution on the device

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPUno kernel image is available for execution on the device相关的知识,希望对你有一定的参考价值。

       前段时间在一个很古老的笔记本(lenovo Y400 GT650M*2)上安装NVIDIA内核驱动和CUDA,安装过程也是一波三折,首先是NVIDIA内核一直无法加载,提示原因是内核签名失败,最后发现是因为UEFI开启了secure boot选项,后来关闭这个feature之后内核正常加载了,nvidia-smi也可以正常使用了,


no kernel image is available for execution on the device

       之后写了一段测试程序,发现根本没有使用GPU加速,报告的错误信息如下,

后来在官网上询问才知道是安装的CUDA版本(v11.4)太高,而GTX650的算力等级太低,无法满足CUDA的最低算力等级要求


产看显卡的计算能力

计算能力查询

可以看到GT650M的计算能力是3.0。我们查询到支持计算能力3.0的CUDA版本。


查找支持算力3.0的CUDA版本

这里要注意,CUDAv10.2只能支持Ubuntu1804,所以我回退了Ubuntu版本。如果有小伙伴知道怎么可以不回退,评论里告诉我

你也可以选择下面的方式查询《Matching CUDA arch and CUDA gencode for various NVIDIA architectures

我们首先查看了最新的CUDAv11.8对于GPU算力的要求,CUDAv11.8的最低算力要求是5.2,如下图:

这个显然我们不能使用,之后我直接看了CUDAv10.2版本的算力要求,可以看到符合我们的要求,

所以我们首先卸载掉已经安装的CUDAv11.7(不同版本卸载命令可能有差异,可以参考CUDA手册),

sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \\
 "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" 

因为我回退了Ubuntu版本,所以没有卸载的过程,直接安装CUDAv10.2,安装之后问题就解决了。



方法二

       如果看了CUDA手册,你会发现nvcc有个--arch的参数,这个参数的默认值根据CUDA版本的不同有所差异,如果你发现CUDA默认的--arch值和你的GPU架构不匹配,也会出现上面的问题,你可以在编译的时候添加--arch=sm_xy(x和y取决于你的nvidia architecture)来解决。


附录

测试代码如下:

#include <stdio.h>
#include <stdint.h>

void CPUFunction()

  printf("This function is defined to run on the CPU.\\n");


__global__ void GPUFunction()

  printf("This function is defined to run on the GPU.\\n");


int main()

  int num_gpus;
  cudaGetDeviceCount(&num_gpus);
  printf("GPU num is %d\\n",num_gpus);
  cudaSetDevice(2);

  cudaError_t addVectorsErr;
  cudaError_t asyncErr;

  CPUFunction();
  addVectorsErr = cudaGetLastError();
  if(addVectorsErr != cudaSuccess) printf("Error: %s\\n", cudaGetErrorString(addVectorsErr));


  GPUFunction<<<1, 1>>>();

  addVectorsErr = cudaGetLastError();
  if(addVectorsErr != cudaSuccess) printf("1Error: %s\\n", cudaGetErrorString(addVectorsErr));

  cudaDeviceSynchronize();

  addVectorsErr = cudaGetLastError();
  if(addVectorsErr != cudaSuccess) printf("2Error: %s\\n", cudaGetErrorString(addVectorsErr));

  return 0;




以上是关于GPUno kernel image is available for execution on the device的主要内容,如果未能解决你的问题,请参考以下文章

GPUno kernel image is available for execution on the device

RuntimeError:CUDA error:no kernel image is available for execution on the device报错解决(亲测)

cuda The driver installation is unable to locate the kernel source 深恶痛觉的CSDN用户以及深恶痛觉的lyf5231

linux driver error ------ ERROR: Kernel configuration is invalid

WARNING: /sys/kernel/mm/transparent_hugepage/enabled is

编译kernel:make Image uImage与zImage的区别