Cuda - nvcc - 设备上没有可执行的内核图像。问题出在哪里?

9

我试图使用最简单的例子使用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个回答

7

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

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

你的 Quadro 6000 是一款计算能力为 2.0 的 GPU。可以通过 deviceQuery CUDA 样本代码或通过 谷歌搜索 确定此信息。 它不受 CUDA 9.0 支持。


3

您应该将您的显卡计算能力添加为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 Sample SDK中提供的deviceQuery示例来检查您的显卡的计算能力。


2
补充@RobertCrovella的回答: 在使用nvcc编译时,您应始终设置适当的标志以生成针对您打算运行的微架构/计算能力的二进制内核映像。例如:-gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${COMPUTE_CAPABILITY},其中COMPUTE_CAPABILITY=61。 有关这些标志的更多信息,请阅读nvcc --help(尽管说实话,这是一个有点模糊的主题)。

你提出的开关组合无法生成二进制内核映像,而是会生成 PTX。 - Robert Crovella
@RobertCrovella:我并不是想让那些开关成为唯一的选择。 - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接