Любая конкретная функция для инициализации GPU, кроме первого вызова cudaMalloc?
Первый вызов cudaMalloc медленный (примерно 0,2 с) из-за некоторой работы по инициализации на GPU. Есть ли какая-либо функция, которая выполняет только инициализацию, чтобы я мог отделить время? Кажется, cudaSetDevice сокращает время до 0,15 с, но все же не устраняет все издержки инициализации.
1 ответ
Вызов
cudaFree(0);
это канонический способ принудительного создания отложенного контекста в среде выполнения CUDA. Вы не можете уменьшить накладные расходы, это зависит от времени ожидания драйвера, времени выполнения и операционной системы. Но приведенный выше вызов позволит вам контролировать, как / когда возникают эти издержки во время выполнения программы.
РЕДАКТИРОВАТЬ в 2015 г., чтобы добавить, что эвристика инициализации контекста в API времени выполнения слегка изменилась с течением времени, так что cudaSetDevice
теперь устанавливает контекст, поэтому cudaFree()
Вызов явно не требуется для инициализации контекста, вы можете использовать cudaSetDevice
вместо. Также обратите внимание, что при первом запуске ядра некоторое время настройки будет по-прежнему происходить, тогда как раньше этого не было. Что касается синхронизации ядра, лучше всего сначала включить прогрев, прежде чем запускать ядро, у вас будет время, чтобы убрать эту задержку установки. Похоже, что различные инструменты профилирования имеют достаточную степень детализации, чтобы избежать этого без каких-либо дополнительных вызовов API или вызовов ядра.