CUDA: Как утверждать в коде ядра?
Какова эквивалентная методика утверждения в коде CUDA ядра?
Кажется, что не существует аргумента для кода ядра CUDA. Мне нужен способ легко поймать ошибки программиста в коде ядра. Механизм, в котором я могу установить условия, которые должны быть истинными, и ядро должно выручить, когда условие ложно с сообщением об ошибке.
Ответы
Ответ 1
Вы не сможете вернуть сообщение об ошибке или код ошибки на хост из ядра.
Вместо этого я установил бы состояние ошибки и проверил бы его с хоста. Используйте глобальную память устройства или (лучшую) карту памяти для хранения состояния ошибки, переданную как параметр для каждого вызова ядра. Используйте операторы if в ядре, а также если сбой операторов, установите код ошибки и верните. Вы сможете проверить код ошибки с хоста после вызова ядра, но имейте в виду, что после проверки ядра вы должны синхронизировать хост и устройство, прежде чем проверять код ошибки. Я думаю, это будет хорошо работать для разработки, но не для производства.
Что касается печати сообщения об ошибке прямо с устройства
- В картах 1.x, 2.x и 3.0 вы можете использовать режим эмуляции для вывода сообщения об ошибке.
- В 3.1 forward (на ферми), очевидно, вы можете использовать printf в ядрах для печати сообщения об ошибке. Похоже, что он не всегда работает сразу, например. http://forums.nvidia.com/index.php?showtopic=182448
Ответ 2
Я хотел бы указать, что утверждение может возникать только в одном потоке, но если вы решите досрочно прекратить этот поток, его отсутствие может вызвать другие ошибки (и, возможно, другие утверждения), которые происходят позже; возможно, приводя к полному сбою ядра и отсутствию всей информации на графическом процессоре.
Кроме того, ответ, полученный в Использование assert в вызове ядра", будет работать только в том случае, если assert используется непосредственно в функции __ global__, а не глубже, где-то внутри Функция __ device__.
Мое предложение состоит в том, что даже утверждение не работает, вы обычно выполняете свой код, но оставляете сообщение об ошибке. Вы можете использовать сопоставленную, закрепленную память (вы размещаете память оперативной памяти в адресное пространство графического процессора) для хранения кодов ошибок/сообщений. Таким образом, даже если ваше ядро падает, а GPU - reset, вы, скорее всего, получите ценную информацию в этой сопоставленной памяти.
Если я не ошибаюсь, сопоставленная, закрепленная память поддерживается почти всеми устройствами Compute Capability 1.1 и выше.
Ответ 3
Вы можете счесть это полезным:
Использование assert в вызове ядра
В качестве альтернативы вы можете поймать cudaError с помощью cudaThreadSynchronize(), который дает вам одну из 40 причин, по которым ядро возвращает ошибку. Но в основном вы можете проверить эти условия, используя команды if/else в ядре.