Карта CUDA иногда выходит из строя из-за «сбоя запуска» в середине выполнения, вместе со снегом

#memory-leaks #memory-management #cuda #gpgpu

#утечки памяти #управление памятью #cuda #gpgpu

Вопрос:

Я хотел бы сфотографировать, что происходит с моим экраном, но скриншот этого не передает, но лучшее описание — снег.

Один из моих проектов имеет привычку к случайному сбою на новой итерации, и я всегда предполагал, что это ошибка «Вы используете слишком много памяти, дурак!», Поэтому был рад перезапустить, разобраться с этим и попытаться устранить проблему.

Затем я начал фактически отслеживать назначенную глобальную память; Она оставалась свободной примерно на 70% на протяжении всего выполнения, пока внезапно не умерла на новом malloc.

Чтобы усугубить ситуацию, эти медитации Гуру начали регулярно появляться в моем dmesg; все (что я заметил) с одним и тем же адресом.

 NVRM: Xid (0000:01:00): 13, 0008 00000000 000050c0 00000368 00000000 00000080 
  

Есть какие-нибудь слова от мудрых о том, что, черт возьми, происходит? Я все еще продолжаю расследование проблем с регистром и общей памятью, но хотел бы задать этот вопрос для любых идей, которые есть у кого-либо еще.

Комментарии:

1. Какую версию CUDA вы используете и какой графический процессор?

2. Вы почти наверняка записываете вне диапазона. Карты с вычислительными возможностями < 2.0 могут плохо себя вести в этих условиях.

3. Последние версии драйверов, но «старая» карта sm_13 (я думаю, geforce 9800)

Ответ №1:

Если ни одно из ваших выделений памяти CUDA не завершается сбоем, то ваша проблема не в том, что у вас закончилась память (если бы это было так, это могло быть из-за фрагментации, не обязательно из-за потребления 100% ).

Если вы получаете эффект рождественского дерева, то у вас, вероятно, есть ядро, которое выполняет запись за пределами выделенной памяти. Проверьте индексы пикселей / ячеек массива, к которым вы обращаетесь, и вычисление смещения памяти для их положения в выходных буферах.

Вы также можете попробовать использовать 1D index при вызове ядер, чтобы упростить вычисления. (Вы можете смоделировать любой многомерный массив как длинный одномерный массив.)

Ответ №2:

Пожалуйста, завершите все вызовы CUDA Runtime API с помощью cudaSafeCall() и добавьте cudaCheckError() после всех вызовов ядра. Эти служебные функции представлены в cutil.h . Это должно помочь вам обнаружить любые ошибки CUDA в тот момент, когда они действительно происходят, и их сообщение об ошибке должно помочь вашему расследованию.

Комментарии:

1. Все вызовы ядра поступают через предварительно упакованные вызовы PyCUDA.

2. Эндрю: Я не знаком с PyCUDA, но было бы полезно установить некоторую проверку ошибок (с использованием cudaGetLastError) после каждого из вызовов.