Причина этого в том, что 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
, если вам нужна дополнительная информация о трассировках стека .