Исключение 'cudaError_enum', брошенное в cudaGetExportTable (библиотека времени выполнения CUDA)?

Я отлаживаю программу CUDA на основе MPI с помощью DDT. Мой код прерывается, когда библиотека времени выполнения CUDA (libcudart) выдает исключение в (недокументированной) функции cudaGetExportTable, когда вызывается из cudaMalloc и cudaThreadSynchronize (ОБНОВЛЕНО: using cudaDeviceSynchronize дает ту же ошибку) в моем коде.

Почему libcudart бросает исключение (я использую API C, а не С++ API), прежде чем я смогу обнаружить его в своем коде с его возвращаемым значением cudaError_t или с помощью CHECKCUDAERROR?

(Я использую 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 ядра /gpus на node вместо 4 gpus на node dmalloc обнаруживает подобные ошибки памяти, но когда он не находится в режиме отладки, код отлично работает с 3 gpus за node (насколько я могу судить).

Ответ 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 терпит неудачу в переменной __device__. Время выполнения не работает, как должно, похоже...