CUDA: Как утверждать в коде ядра?

Можно назвать GC.Collect (), когда Вы знаете что-то о природе приложения, сборщик "мусора" не делает. Заманчиво думать, что, как автор, это вероятно. Однако истина является суммами GC к довольно правильно написанной и протестированной экспертной системе, и редко, чтобы Вы знали что-то о низкоуровневых путях выполнения кода, которые она не делает.

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

Однако большую часть времени GC достаточно умен, чтобы сделать это так или иначе.

17
задан karlphillip 1 July 2011 в 20:58
поделиться

2 ответа

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

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

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

4
ответ дан 30 November 2019 в 14:32
поделиться

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

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

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

3
ответ дан 30 November 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: