Какая-либо конкретная функция для инициализации GPU, отличная от первого вызова cudaMalloc?

#opencv #cuda #gpgpu

#cuda #графический процессор

Вопрос:

Первый вызов cudaMalloc выполняется медленно (например, 0,2 секунды) из-за некоторой работы по инициализации на GPU. Есть ли какая-либо функция, которая выполняет исключительно инициализацию, чтобы я мог разделить время? cudaSetDevice, похоже, сокращает время до 0,15 секунды, но по-прежнему не устраняет все накладные расходы на инициализацию.

Ответ №1:

Вызов

 cudaFree(0);
  

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

ОТРЕДАКТИРУЙТЕ в 2015 году, чтобы добавить, что эвристика инициализации контекста в API среды выполнения со временем слегка изменилась, так что cudaSetDevice теперь устанавливается контекст, поэтому cudaFree() вызов явно не требуется для инициализации контекста, вы можете использовать cudaSetDevice вместо этого. Также обратите внимание, что при первом запуске ядра все равно потребуется некоторое время на настройку, тогда как раньше этого не было. Для синхронизации ядра лучше всего сначала включить прогревающий вызов перед запуском ядра. у вас будет время, чтобы устранить эту задержку настройки. Похоже, что различные инструменты профилирования имеют достаточную степень детализации, чтобы избежать этого без каких-либо дополнительных вызовов API или вызовов ядра.

Комментарии:

1. Точно! Он фиксирует все время инициализации! Спасибо!