ПОМОГИТЕ!Ядро CUDA больше не запускается после использования слишком большого количества памяти - PullRequest
0 голосов
/ 27 апреля 2011

Я пишу программу, которая требует следующего запуска ядра:

dim3 blocks(16,16,16); //grid dimensions
dim3 threads(32,32); //block dimensions
get_gaussian_responses<<<blocks,threads>>>(pDeviceIntegral,itgStepSize,pScaleSpace);

Я забыл освободить массив pScaleSpace в конце программы, а затем запустил программу через профилировщик CUDA, которыйзапускает его 15 раз подряд, занимая много памяти / вызывая большую фрагментацию.Теперь, когда я запускаю программу, ядро ​​даже не запускается.Если я посмотрю на список вызовов функций, записанных профилировщиком, ядра там нет.Я понимаю, что это довольно глупая ошибка, но я не знаю, что я могу сделать в этот момент, чтобы снова запустить программу.Я перезагрузил компьютер, но это не помогло.Если я уменьшу размеры ядра, оно будет работать нормально, но текущие размеры будут в пределах допустимого максимума для моей карты.

Max threads per block: 1024
Max grid dimensions: 65535,65535,65535

Любые предложения приветствуются, заранее спасибо!

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

Если вы скомпилируете свой код так:

nvcc -Xptxas="-v" [other compiler options]

ассемблер сообщит количество локальной памяти кучи, которое требуется коду. Это может быть полезной диагностикой, чтобы увидеть объем памяти ядра. Существует также вызов API cudaThreadSetLimit , который можно использовать для управления объемом кучи памяти для каждого потока, которую ядро ​​будет пытаться использовать во время выполнения.

Последние наборы инструментов поставляются с утилитой cuda-memchk, которая предоставляет valgrind-подобный анализ доступа к памяти ядра, включая переполнение буфера и незаконное использование памяти. Возможно, ваш код где-то переполняет некоторую память и перезаписывает другие части памяти графического процессора, оставляя карту в плачевном состоянии.

1 голос
/ 28 апреля 2011

Я понял!nVidia NSight 2.0 - который предположительно поддерживает CUDA 4 - изменил мой CUDA_INC_PATH для использования CUDA 3.2.Не удивительно, что это не позволило бы мне выделить 1024 потока на блок.За исключением всего облегчения и ликования, это действительно глупая и раздражающая ошибка, учитывая, что у меня уже была установлена ​​CUDA 4.0 RC2.

1 голос
/ 27 апреля 2011

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

Возможно, вам придется сделать код CUDA более эффективным, чтобы иметь возможность запускать больше потоков. Вы можете попробовать нарезать ваше ядро ​​на более мелкие части, если оно содержит сложную логику. Или получить более мощное оборудование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...