На этом шаге мы рассмотрим CUDA runtime API.
Далее мы будем использовать именно CUDA runtime API как более простой.
Важным моментом работы c CUDA, на который следует сразу же обратить внимание, является то, что многие функции API - асинхронные, то есть управление возвращается еще до реального завершения требуемой операции.
К числу асинхронных операций относятся:
Для синхронизации текущей нити на CPU с GPU используется функция cudaThreadSynchronize, которая дожидается завершения выполнения всех операций CUDA, ранее вызванных с данной нити CPU:
cudaError_t cudaThreadSynchronize(void);
CUDA поддерживает синхронизацию через потоки (streams) - каждый поток задает последовательность операций, выполняемых в строго определенном порядке. При этом порядок выполнения операций между разными потоками не является строго определенным и может изменяться.
Каждая функция CUDA runtime API (кроме запуска ядра) возвращает значение типа cudaError_t. При успешном выполнении функции возвращается значение cudaSuccess, в противном случае возвращает код ошибки.
Получить описание ошибки в виде строки по ее коду можно при помощи функции cudaGetErrorString:
char *cudaGetErrorString(cudaError_t code);
Также можно получить код последней ошибки при помощи функции cudaGetLastError:
cudaError_t cudaGetLastError();
На следующем шаге мы рассмотрим получение информации об имеющихся GPU.