Cuda-nvcc-没有内核映像可用于在设备上执行。有什么问题?

时间:2019-04-05 14:48:34

标签: cuda nvcc

我正在尝试通过最简单的示例使用nvcc,但是它无法正常工作。我正在从https://devblogs.nvidia.com/easy-introduction-cuda-c-and-c/编译并执行示例,但是我的服务器无法执行 global 函数。我重写代码以获得一些错误消息,并且收到以下消息: “没有内核映像可用于在设备上执行”

我的GPU是Quadro 6000,CUDA版本是9.0。

#include <stdio.h>
#include <cuda_runtime.h>

__global__ void saxpy(int n, float a, float *x, float *y)
{
  int i = blockIdx.x*blockDim.x + threadIdx.x;
  y[i] = 10.0; //a*x[i] + y[i];  
}

int main(int argc, char *argv[])
{
  int N = 120;
  int nDevices;
  float *x, *y, *d_x, *d_y;

  cudaError_t err = cudaGetDeviceCount(&nDevices);
  if (err != cudaSuccess) 
    printf("%s\n", cudaGetErrorString(err));
  else
    printf("Number of devices %d\n", nDevices);

  x = (float*)malloc(N*sizeof(float));
  y = (float*)malloc(N*sizeof(float));

  cudaMalloc(&d_x, N*sizeof(float)); 
  cudaMalloc(&d_y, N*sizeof(float));

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

  cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);

  // Perform SAXPY on 1M elements  
  saxpy<<<1, 1>>>(N, 2.0f, d_x, d_y);
  cudaDeviceSynchronize(); 

  err = cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);  

  printf("%s\n",cudaGetErrorString(err));

  cudaError_t errSync  = cudaGetLastError();
  cudaError_t errAsync = cudaDeviceSynchronize();
  if (errSync != cudaSuccess) 
    printf("Sync kernel error: %s\n", cudaGetErrorString(errSync));
  if (errAsync != cudaSuccess)
    printf("Async kernel error: %s\n", cudaGetErrorString(errAsync)); 


  cudaFree(d_x);
  cudaFree(d_y);
  free(x);
  free(y);
}"

执行命令

bash-4.1$ nvcc  -o sapx simples_cuda.cu
bash-4.1$ ./sapx
Number of devices 1
no error
Sync kernel error: no kernel image is available for execution on the device

3 个答案:

答案 0 :(得分:2)

只有6.5版或更早版本的CUDA工具包才支持计算能力低于2.0的GPU。

计算能力小于3.0(但大于或等于2.0)的GPU仅受8.0和更早版本的CUDA工具包支持。

您的Quadro 6000是具有计算能力的2.0 GPU。这可以通过deviceQuery CUDA示例代码以编程方式确定,也可以通过google search来确定。 CUDA 9.0不支持它

答案 1 :(得分:0)

您应该将视频卡的计算功能作为参数添加到nvcc编译器。就我而言(Windows / Visual Studio 2017),我在“代码生成”字段中进行设置。因此,就像@einpoklum在添加 gencode 参数之前一样回答-gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${SM_CAPABILITY},其中{COMPUTE_CAPABILITY}{SM_CAPABILITY}属于以下对(您可以像VS2017一样将它们全部添加) ),

{COMPUTE_CAPABILITY},{SM_CAPABILITY}    

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
compute_80,sm_80

enter image description here

D:\Program Files\nVidia\CUDA Samples\MySamples\IntroToCUDA_1\IntroToCUDA_1>"D:\Program Files\nVidia\GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" -gencode=arch=compute_37,code=\"sm_37,compute_37\" -gencode=arch=compute_50,code=\"sm_50,compute_50\" -gencode=arch=compute_52,code=\"sm_52,compute_52\" -gencode=arch=compute_60,code=\"sm_60,compute_60\" -gencode=arch=compute_61,code=\"sm_61,compute_61\" -gencode=arch=compute_70,code=\"sm_70,compute_70\" -gencode=arch=compute_75,code=\"sm_75,compute_75\" -gencode=arch=compute_80,code=\"sm_80,compute_80\" --use-local-env -ccbin "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64" -x cu   -I"D:\Program Files\nVidia\GPU Computing Toolkit\CUDA\v11.0\include" -I"D:\Program Files\nVidia\GPU Computing Toolkit\CUDA\v11.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -D_DEBUG -D_CONSOLE -D_UNICODE -DUNICODE -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc141.pdb /FS /Zi /RTC1 /MDd " -o x64\Debug\IntroToCUDA_1.cu.obj "D:\Program Files\nVidia\CUDA Samples\MySamples\IntroToCUDA_1\IntroToCUDA_1\IntroToCUDA_1.cu"

您可以使用CUDA Samples SDK中的deviceQuery示例来检查视频卡的CC

答案 2 :(得分:-1)

添加到@RobertCrovella的答案中:

使用nvcc进行编译时,应始终设置适当的标志以生成bianry内核映像,以实现要在其上运行的微体系结构/计算功能。例如:-gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${COMPUTE_CAPABILITY}, 与COMPUTE_CAPABILITY=20一起使用。并阅读nvcc --help以获得更多信息(尽管有点令人困惑)。