2012-07-24 80 views
0

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

为什么libcudart在我的代码中检测到它返回值cudaError_tCHECKCUDAERROR之前抛出异常(我正在使用C API,而不是C++ API)?

(我使用CUDA 4.2 SDK的Linux版本。)

输出:

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个核心上运行时/每节点而不是每个节点4个GPU的GPU,dmalloc检测类似的存储器错误,但是,当不处于调试模式时,代码运行与每节点3分的GPU完全正常(据我所知)。

+0

当发生这种情况时,您运行了多少个MPI进程? – talonmies 2012-07-24 17:39:08

+0

我在6个节点上运行24个进程(每个节点有4个内核和gpus)。 – BenWibking 2012-07-24 18:14:46

+0

'cudaThreadSynchronize'在技术上已被弃用。如果您尝试使用'cudaDeviceSychronize',会发生什么? – talonmies 2012-07-24 18:29:34

回答

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。运行时并不像它应该那样工作,它似乎...

+0

这是一个相当大的遗漏 - icc不支持!未指定的启动失败可能意味着您的内核在某处出现内存访问超出限制。你可以使用独立的cuda-memcheck或者在cuda-gdb里面获取更多的诊断信息。 – talonmies 2012-07-28 07:10:14

+0

啊,很高兴知道。我发现传递给我的代码错误地使用了变量范围语义。但是,我无法找到一种重现正确行为的惯用方式。相关的设备函数声明并返回一个'dim3结果;'返回时明显超出范围。然而,'result'变量应该是线程局部的(它存储线程,块信息)并且可以修改,这在CUDA中看起来是不可能的。 – BenWibking 2012-07-30 22:12:42

+0

好的,所以事实证明这些都不是问题。 (我升级到CUDA 5,现在错误报告工作得更好。)我可以通过'cudaGetSymbolAddress'从您在另一个线程上发布的代码中重现错误:http://stackoverflow.com/questions/9996563/cudamemset-失败-设备上的变量。所以似乎有什么东西坏了... – BenWibking 2012-08-30 02:13:51