печать трассировки стека в функции cuda - PullRequest
0 голосов
/ 03 апреля 2020

Есть несколько хороших вопросов и ответов о том, как напечатать трассировку стека из функции в C / C ++, например { ссылка }, но кажется, что этот способ не применим в Cuda. Хотя я мог использовать следующий фрагмент в C / C ++, я не мог использовать его в Cuda.

__device__
void print_trace(void) {
        void *array[10];
        size_t size;
        char **strings;
        size_t i;
        size = backtrace(array, 10);
        strings = backtrace_symbols(array, size);
        printf("Obtained %zd stack frames.\n", size);
        for (i = 0; i < size; i++)
                printf("%s\n", strings[i]);

        free(strings);
}

и получил следующую ошибку:

calling a __host__ function (*backtrace*) from a __device__ function is not allowed
calling a __host__ function (*backtrace_symbols*) from a __device__ function is not allowed

Мне было интересно, Кто-нибудь знает способ напечатать трассировку стека в Cuda, по крайней мере, чтобы увидеть, что такое функция вызывающего абонента.

1 Ответ

0 голосов
/ 03 апреля 2020

Причина этого в том, что backtrace() - это функция, определенная для использования на ЦП (на хосте). Вы не можете запускать функции такого типа на графическом процессоре (на устройстве cuda).

Один из методов отладки, который я использовал в прошлом, - это определение оболочки для каждого вызова cuda. ​​

#define cudaErrorCheck(result) { cudaCheck((result), __FILE__, __LINE__); }
inline void cudaCheck(cudaError_t error, const char *file,
                      int line, bool abort = true) {
  if (error != cudaSuccess) {
    std::cerr << "__________CUDA_ERROR_____________" << endl;
    fprintf(stderr, "CUDA ERROR: %s %s %d\n",
            cudaGetErrorString(error), file, line);
    if (abort) {
      exit(error);
    }
  }
}

Тогда всякий раз, когда вы вызываете функцию, вам нужна дополнительная информация о том, что пошло не так, если что-то не так go.

Например ...

  cudaErrorCheck(cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice));
  cudaErrorCheck(cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice));
  cudaErrorCheck(cudaDeviceSynchronize());

Я бы воспользовался инструментом cuda-memcheck , если вам нужна дополнительная информация о трассировках стека .

...