Cuda - nvcc - Нет образа ядра, доступного для выполнения на устройстве. В чем проблема? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь использовать nvcc с самым простым примером, но он не работает правильно.Я компилирую и выполняю пример из https://devblogs.nvidia.com/easy-introduction-cuda-c-and-c/,, однако мой сервер не может выполнить функцию global .Я переписываю код, чтобы получить сообщение об ошибке, и получаю следующее сообщение: «Нет образа ядра, доступного для выполнения на устройстве»

Мой графический процессор - 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

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Графические процессоры с вычислительной способностью менее 2.0 поддерживаются только наборами инструментов CUDA версии 6.5 и более ранних.

Графические процессоры с вычислительной способностью менее 3,0 (но больше или равной 2,0) поддерживаются только наборами инструментов CUDA версии 8.0 и старше.

Ваш Quadro 6000 - это графический процессор с возможностью вычислений 2.0. Это можно определить программным путем с помощью deviceQuery примера кода CUDA или с помощью поиска Google . Это не поддерживается CUDA 9.0

0 голосов
/ 08 апреля 2019

Добавление к ответу @ RobertCrovella:

При компиляции с помощью nvcc вы всегда должны устанавливать соответствующие флаги для генерации образов ядра bianry для микроархитектуры / вычислительных возможностей, на которых вы собираетесь работать.Например: -gencode arch=compute_${COMPUTE_CAPABILITY},code=compute_${COMPUTE_CAPABILITY}, скажем, COMPUTE_CAPABILITY=20.И прочитайте nvcc --help для получения дополнительной информации (хотя это немного сбивает с толку).

...