【GPU】no 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;
}



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从善若水

原创不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值