Исключение '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__. Время выполнения не работает, как должно, похоже...