Возможно ли, что наблюдаемая вами большая задержка (около 1 с) вызвана инициализацией драйвера?Это кажется довольно длинным для cudaMalloc.Также убедитесь, что ваш драйвер обновлен.
Задержка первого запуска ядра может быть вызвана рядом факторов:
- Инициализация драйвера
- PTX-компиляция
- Создание контекста
Первый из них применим только в том случае, если вы работаете в системе Linux без X. В этом случае драйвер загружается только тогда, когда требуется, а затем выгружается,Запуск nvidia-smi -pm 1
от имени пользователя root запустит драйвер в постоянном режиме, чтобы избежать таких задержек, за подробностями обращайтесь к man nvidia-smi
и не забудьте добавить его в сценарий инициализации, поскольку он не будет сохраняться при перезагрузке.
Вторая задержка заключается в компиляции PTX для конкретной архитектуры устройства в вашей системе.Этого легко избежать, внедрив двоичный файл для архитектуры вашего устройства (или архитектур, если вы хотите поддерживать несколько арок без компиляции PTX) в исполняемый файл.См. Руководство по программированию CUDA C (доступно на веб-сайте NVIDIA ) для получения дополнительной информации, в разделе 3.1.1.2 рассказывается о компиляции JIT.
Третий момент, создание контекста, неизбежен, но NVIDIA ушлаприложить большие усилия для снижения стоимости.Создание контекста включает копирование исполняемого кода на устройство, копирование любых объектов данных, настройку системы памяти и т. Д.