CUDA: как утверждать в коде ядра? - PullRequest
17 голосов
/ 25 февраля 2011

Каков эквивалентный метод утверждения в коде CUDA kernel ?

Кажется, что нет утверждения для кода ядра CUDA.Я хочу способ легко поймать ошибки программиста в коде ядра.Механизм, в котором я могу установить условия, которые должны быть истинными, и ядро ​​должно выручить, когда условие ложно с сообщением об ошибке.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2011

Я хотел бы отметить, что утверждение может произойти только в одном потоке, но если вы решите досрочно прекратить этот поток, его отсутствие может вызвать другие ошибки (и, вероятно, другие утверждения), происходящие позже;возможно, приведет к полному сбою ядра и потере всей информации о графическом процессоре.

Кроме того, ответ, заданный на « Использование assert в вызове ядра », будет работать, только если assert используется напрямую.в функции __ global__, а не глубже, где-то внутри функции __ device__.

Мое предложение состоит в том, что даже утверждение не выполняется, вы продолжаете работу с вашим кодом, но оставляете сообщение об ошибке.Вы можете использовать сопоставленную закрепленную память (вы отображаете память ОЗУ хоста в адресное пространство GPU) для хранения кодов ошибок / сообщений.Таким образом, даже если ваше ядро ​​выйдет из строя и GPU будет сброшен, вы, вероятно, получите ценную информацию в этой отображенной памяти.Если я не ошибаюсь, подключенная, закрепленная память поддерживается практически всеми устройствами Compute Capability 1.1 и выше.

4 голосов
/ 25 февраля 2011

Вы не сможете вернуть сообщение об ошибке или код ошибки хосту из ядра.

Вместо этого я установил бы состояние ошибки и проверил бы его с хоста. Используйте глобальную память устройства или (лучше) отображенную память хоста для хранения состояния ошибки, передаваемого в качестве параметра каждому вызову ядра. Используйте операторы if в ядре, и если операторы не выполняются, установите код ошибки и вернитесь. Вы сможете проверить код ошибки с хоста после вызова ядра, но имейте в виду, что вам придется синхронизировать хост и устройство после запуска ядра перед проверкой кода ошибки. Я думаю, что это будет хорошо работать для разработки, но не так много для производства.

Что касается печати сообщения об ошибке прямо с устройства

  • На картах 1.x, 2.x и 3.0 вы можете использовать режим эмуляции для вывода сообщения об ошибке.
  • В версии 3.1 forward (в fermi), очевидно, вы можете использовать printf в ядрах для вывода сообщения об ошибке. Похоже, что это не всегда работает сразу, например, http://forums.nvidia.com/index.php?showtopic=182448
3 голосов
/ 25 февраля 2011

Вы можете найти это полезным:

Использование assert в вызове ядра

В качестве альтернативы вы можете перехватить cudaError , используя cudaThreadSynchronize (), что дает вам одну из 40 различных причин, по которым ядро ​​возвращает ошибку. Но в основном вы можете проверить эти условия, используя в ядре команды if / else.

...