Можно назвать GC.Collect (), когда Вы знаете что-то о природе приложения, сборщик "мусора" не делает. Заманчиво думать, что, как автор, это вероятно. Однако истина является суммами GC к довольно правильно написанной и протестированной экспертной системе, и редко, чтобы Вы знали что-то о низкоуровневых путях выполнения кода, которые она не делает.
лучший пример я могу думать, где у Вас могла бы быть некоторая дополнительная информация, приложение что циклы между периодами неактивности и очень напряженными периодами. Вы хотите лучшую производительность, возможную в течение напряженных периодов, и поэтому хотите использовать время простоя, чтобы сделать некоторую уборку.
Однако большую часть времени GC достаточно умен, чтобы сделать это так или иначе.
Я хотел бы отметить, что утверждение может произойти только в одном потоке, но если вы решите досрочно прекратить этот поток, его отсутствие может вызвать другие ошибки (и, вероятно, другие утверждения), происходящие позже; возможно, приведет к полному сбою ядра и потере всей информации о графическом процессоре.
Кроме того, ответ, заданный на « Использование assert в вызове ядра », будет работать, только если assert используется непосредственно в функции __ global__ и не глубже, где-то внутри функции __ device__.
Мое предложение состоит в том, что даже утверждение не выполняется, вы продолжаете работу с вашим кодом, но оставляете сообщение об ошибке. Вы можете использовать сопоставленную закрепленную память (вы отображаете память ОЗУ хоста в адресное пространство GPU) для хранения кодов ошибок / сообщений. Таким образом, даже если ваше ядро выйдет из строя и GPU будет сброшен, вы, вероятно, получите ценную информацию в этой отображенной памяти. Если я не ошибаюсь, подключенная, закрепленная память поддерживается практически всеми устройствами Compute Capability 1.1 и выше.
Вы можете найти это полезным:
Использование assert в вызове ядра
В качестве альтернативы вы можете перехватить cudaError с помощью cudaThreadSynchronize (), который дает вам одна из 40 разных причин, по которым ядро возвращает ошибку Но в основном вы можете проверить эти условия, используя в ядре команды if / else.