cuda-gdb: значение / возникновение «CUDA_EXCEPTION_9: переполнение аппаратного стека деформации» - PullRequest
0 голосов
/ 30 августа 2011

В руководстве по cuda-gdb и cuda-memcheck упоминается вышеупомянутое CUDA_EXCEPTION_9: «Переполнение аппаратного стека при деформации», но я не смог найти более подробную информацию; единственный комментарий в обоих руководствах:

"Это происходит, когда любой поток в деформации вызывает переполнение аппаратного стека. Это должно быть редким явлением."

В моем случае это иногда (!?) Происходит, когда я пытаюсь динамически распределить память на устройстве с помощью malloc () (обрабатывая тот же набор данных!). Попытка malloc () 0 байт (ошибка была исправлена) неоднократно вызывала одно и то же исключение.

Что именно вызывает это исключение при каких обстоятельствах; что это означает, как можно это исправить / обойти?

Большое спасибо

1 Ответ

1 голос
/ 31 августа 2011

Переполнение стека на графическом процессоре Fermi ничем не отличается от переполнения стека на любом другом устройстве. Каждый поток получает статический стек и выделение кучи из глобальной памяти при запуске. Если вы исчерпали стек из-за чрезмерной рекурсии, выделите больше доступной памяти кучи или попробуете работать вне границ для любой переменной, хранящейся в памяти кучи, будет сгенерирован сбой защиты, и вы получите сообщение об ошибке переполнения стека. Из вашего вопроса я бы предположил, что вы исчерпываете доступное пространство кучи для потока через вызовы malloc на стороне устройства.

API времени выполнения CUDA включает функции для управления стеком и кучей памяти cudaDeviceSetLimit и cudaDeviceGetLimit . С их помощью вы можете проверить, сколько стека, кучи и printf FIFO каждому потоку дается средой выполнения, и попробовать увеличить кучу и размер стека, чтобы увидеть, исчезнет ли ваша проблема.

...