У меня есть ядро, которое запускает много блоков, и я знаю, что для blockIdx.y = 312
происходит нелегальное чтение памяти. Запуск его под cuda-gdb
приводит к последовательному выполнению блоков по 16 за раз, и требуется очень много времени, чтобы выполнение достигло этого индекса блока, даже с условной точкой останова.
Есть ли способ изменить порядок блоков потоков, запланированных при работе под cuda-gdb
? Если нет, есть ли другая стратегия отладки, которую я мог пропустить?
У меня есть базовое ядро свертки CUDA, которое масштабируется с размером проблемы, запуская больше блоков. Существует ошибка для входных изображений с размерами порядка 10_000 x 10_000
. Запустив его под cuda-memcheck
, я вижу следующее.
...
========= Invalid __global__ read of size 4
========= at 0x00000150 in convolution_kernel_sharedmem(float*, float*, float*)
========= by thread (30,31,0) in block (0,312,0)
...
Похоже, что все нелегальные доступы происходят для blockDim.y = 312
. Таким образом, при запуске с cuda-gdb
одновременно запускается 16 блоков, начиная с (0, 0, 0)
. Я установил условную точку останова в ядре, чтобы остановиться на нужном индексе блока, но это занимает очень много времени.
Есть ли способ изменить порядок, в котором блоки потоков планируются на устройстве? Если нет, есть ли альтернативная стратегия отладки, которую я мог пропустить?
P.S: Я знаю, что могу использовать циклы с шагом сетки вместо запуска этих многочисленных блоков, но я хотел бы знать, что не так с этой конкретной реализацией.
Is there any way to change the order in thread blocks are scheduled when running under cuda-gdb?
Существует ни за что для изменения порядка планирования потоков, если вы не хотите переписывать код, и взять под контроль планирование блокировки потоков самостоятельно. Обратите внимание, что этот связанный пример не совсем то, как переопределить запланированный порядок блокировки потоков, но в нем есть все необходимые ингредиенты. На практике я не вижу большого количества людей, желающих заниматься этим уровнем рефакторинга, но я упомянул об этом для полноты картины.
If not, is there any other debugging strategy that I might have missed?
Описанный метод здесь может локализовать вашу ошибку в конкретной строке кода ядра. Оттуда вы можете использовать, например. с условием printf
для выявления недопустимого расчета индекса и т. д. Обратите внимание, что для этого метода нет необходимости компилировать код с ключами отладки, но вам нужно компилировать с -lineinfo
.
Этот тема обучения обеспечивает более длительную обработку отладки CUDA.
Вы можете — в целях отладки — вставить инструкции в начало вашего ядра, чтобы просто вернуться, если
blockIdx.y
(предположительно, неblockDim.y
) не равно312
.