在cudaGetExportTable(CUDA运行时库)中抛出异常'cudaError_enum'?

时间:2012-07-24 16:17:01

标签: exception cuda mpi icc

我正在使用DDT调试基于MPI的CUDA程序。我的代码在CUDA运行时库(libcudart)在(未记录的)函数cudaGetExportTable中抛出异常时从cudaMalloccudaThreadSynchronize调用时中止(更新:使用cudaDeviceSynchronize给出我的代码中的相同错误。

为什么libcudart在我的代码中使用cudaError_t返回值或CHECKCUDAERROR检测到异常(我使用的是C API,而不是C ++ API)?

(我正在使用适用于Linux的CUDA 4.2 SDK。)

输出:

Process 9: terminate called after throwing an instance of 'cudaError_enum'
Process 9: terminate called recursively

Process 20: terminate called after throwing an instance of 'cudaError'
Process 20: terminate called recursively

我的代码:

cudaThreadSynchronize();
CHECKCUDAERROR("cudaThreadSynchronize()");

其他代码片段:

const size_t t;  // from argument to function
void* p=NULL;
const cudaError_t r=cudaMalloc(&p, t);
if (r!=cudaSuccess) {
    ERROR("cudaMalloc failed.");
}

部分回溯:

Process 9:
cudaDeviceSynchronize()
-> cudaGetExportTable()
   -> __cxa_throw

Process 20:
cudaMalloc()
-> cudaGetExportTable()
   -> cudaGetExportTable()
      -> __cxa_throw

内存调试错误:

Processes 0,2,4,6-9,15-17,20-21:
Memory error detected in Malloc_cuda_gx (cudamalloc.cu:35):
dmalloc bad admin structure list. 

这一行是上面显示的cudaMalloc代码片段。也:

Processes 1,3,5,10-11,13-14,18-19,23:
Memory error detected in vfprintf from /lib64/libc.so.6:
dmalloc bad admin structure list.

此外,当每个节点运行3个内核/ gpus而不是每个节点4 gpus时,dmalloc检测到类似的内存错误,但是当不处于调试模式时,代码运行完全正常,每个节点3 gpus(尽我所能告诉)。

1 个答案:

答案 0 :(得分:1)

使用gcc重新编译。 (我使用icc编译我的代码。)

执行此操作时,调试时会出现异常,但继续经过它,我会收到真正的CUDA错误:

Process 9: gadget_cuda_gx.cu:116: ERROR in gadget_cuda_gx.cu:919: CUDA ERROR:   cudaThreadSynchronize(): unspecified launch failure
Process 20: cudamalloc.cu:38: ERROR all CUDA-capable devices are busy or unavailable, cudaMalloc failed to allocate 856792 bytes = 0.817101 Mb

Valgrind在我的代码中没有显示内存损坏或泄漏(使用gcc或icc进行编译),但在libcudart中发现了一些泄漏。

更新:仍然没有修复。似乎是在这个帖子的答案#2中报告的相同问题:cudaMemset fails on __device__ variable。运行时不像它应该的那样工作,似乎......