Debugging 在cuda函数中打印堆栈跟踪
关于如何从C/C++之类的函数中打印堆栈跟踪,有几个很好的问题和答案,但这种方法在Cuda中似乎不可用。虽然我能够在C/C++中使用下面的代码段,但我无法在Cuda中使用它Debugging 在cuda函数中打印堆栈跟踪,debugging,cuda,Debugging,Cuda,关于如何从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);
__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);
}
我想知道是否有人知道在Cuda中打印堆栈跟踪的方法,至少可以查看调用方函数。原因是
backtrace()
是为在CPU(主机上)上使用而定义的函数。您不能在GPU(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);
}
}
}
我想查看
cuda memcheck
谢谢你的回答,但这并没有回答我的问题。我需要找到堆栈跟踪,知道函数是否返回成功与此无关。好的,我编辑了答案以包含一个链接,这可能会有进一步帮助。感谢您的编辑,但正如我在问题下的另一条评论中提到的,我无法在这种情况下使用调试器。我只对打印解决方案感兴趣,或者我可以通过运行代码从函数本身获得调用函数的任何东西。设备源调试器可以打印堆栈traces@talonmies谢谢你的建议。但问题是内核是通过另一个库调用的,该库带有一个函数指针,我无法访问该库的源代码,因此我无法使用调试器。当我想单步执行该调用时,调试器会传递该调用并在该行之后停止。那么你就不走运了
#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);
}
}
}
cudaErrorCheck(cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice));
cudaErrorCheck(cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice));
cudaErrorCheck(cudaDeviceSynchronize());