Проверка ошибок является важной частью каждой программы. Мы должны знать, когда наши операции завершились неудачно, чтобы мы могли повторить попытку или, по крайней мере, зарегистрировать проблему для последующего анализа.
tl;dr
Проверка ошибок в CUDA должна выполняться вручную, к счастью, Toolkit предоставляет полезные методы для этого.
Ошибка проверки в CUDA
К сожалению для нас, код CUDA выполняется на GPU, поэтому для параллельного (concurrent) кода нет стека, из которого мы могли бы получать ошибки, как мы привыкли иметь в программах на C\C++. Вместо этого код ядра тихо выйдет из строя, и мы никогда не поймем этого мудрее.
Хорошая новость заключается в том, что проверка ошибок в коде CUDA возможна, плохая новость заключается в том, что это нужно делать вручную, а этого все еще не хватает. Позвольте мне показать вам, что я имею в виду.
Среда выполнения предоставляет переменную ошибки, которая изначально имеет значение cudaSuccess
и перезаписывается каждый раз, когда в коде CUDA возникает ошибка.
CUDA предоставляет нам две функции для проверки ошибок. cudaPeekAtLastError
и cudaGetLastError
. Разница между двумя функциями заключается в том, как они обрабатывают переменную успеха. Первый возвращает только переменную ошибки, а второй также сбрасывает переменную ошибки в cudaSuccess
. Чтобы убедиться, что переменная корректна после асинхронных вызовов (большинство вызовов в контексте GPU), мы должны вызвать метод синхронизации cudaDeviceSyncronize
.
Секреты и уловки
Есть два основных совета, которым следует следовать при использовании методов проверки ошибок CUDA.
- Всегда проверяйте ошибки, прежде чем запускать основные функции вашего кода. Я сбился со счета, сколько раз я не мог найти ошибку в своем коде, о которой сообщала функция ошибок, просто потому, что ошибка возникла из-за чего-то глупого, не связанного с основным кодом, например, из-за неправильного приведения к переменной или плохо выделенная память.
- Используйте функцию-оболочку, чтобы правильно и легко сообщать об ошибках.
Эту функцию можно использовать для переноса любой функции, которая возвращает ошибки cuda. Например:
Вывод
Проверка ошибок является важной частью любой программы. Хотя проверка ошибок в CUDA не так проста, как в большинстве программ, сама по себе она не сложна, но требует больше ручной работы, чем обычно.
Использование механизма проверки ошибок, включенного в CUDA Toolkit, дает нам возможность успешно отслеживать и управлять нашими ошибками даже в коде графического процессора.
Удачи!