2011-02-25 3 views
13

Какова эквивалентная методика утверждения в CUDA Ядро Код?CUDA: Как утверждать в коде ядра?

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

+0

Можете ли вы утверждать в режиме эмуляции? – jmilloy

+0

jmilloy: Режим эмуляции не поддерживается в CUDA 3.x. –

+5

Для любого, кто сталкивается с этим через Google, как и я, ** утверждает, что в коде ядра теперь возможны: ** http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html #assertion – Sam

ответ

3

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

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

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

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

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

Using assert within kernel invocation

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

+0

Jawad: Просто возвращение из ядра при утверждении неудачи не очень полезно. Использование printf() однако полезно. Благодаря! :-) –

+0

@Ashwin - ну, вы не можете напечатать f из ядра, и нет никакого способа обойти это. – jmilloy

+0

Можете ли вы установить cudaError для пользовательского значения в ядре? – jmilloy

3

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^