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

tl;dr

Проверка ошибок в CUDA должна выполняться вручную, к счастью, Toolkit предоставляет полезные методы для этого.

Ошибка проверки в CUDA

К сожалению для нас, код CUDA выполняется на GPU, поэтому для параллельного (concurrent) кода нет стека, из которого мы могли бы получать ошибки, как мы привыкли иметь в программах на C\C++. Вместо этого код ядра тихо выйдет из строя, и мы никогда не поймем этого мудрее.

Хорошая новость заключается в том, что проверка ошибок в коде CUDA возможна, плохая новость заключается в том, что это нужно делать вручную, а этого все еще не хватает. Позвольте мне показать вам, что я имею в виду.

Среда выполнения предоставляет переменную ошибки, которая изначально имеет значение cudaSuccess и перезаписывается каждый раз, когда в коде CUDA возникает ошибка.

CUDA предоставляет нам две функции для проверки ошибок. cudaPeekAtLastError и cudaGetLastError . Разница между двумя функциями заключается в том, как они обрабатывают переменную успеха. Первый возвращает только переменную ошибки, а второй также сбрасывает переменную ошибки в cudaSuccess. Чтобы убедиться, что переменная корректна после асинхронных вызовов (большинство вызовов в контексте GPU), мы должны вызвать метод синхронизации cudaDeviceSyncronize.

Секреты и уловки

Есть два основных совета, которым следует следовать при использовании методов проверки ошибок CUDA.

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

Эту функцию можно использовать для переноса любой функции, которая возвращает ошибки cuda. Например:

Вывод

Проверка ошибок является важной частью любой программы. Хотя проверка ошибок в CUDA не так проста, как в большинстве программ, сама по себе она не сложна, но требует больше ручной работы, чем обычно.

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

Удачи!