1 Почему K40 занимает гораздо больше времени (1100ms против 150мс) для 1-го cudaMalloc? Поскольку K40 должен быть лучше K20
Детали процесса инициализации не указаны, однако при наблюдении объем системной памяти влияет на время инициализации. Инициатива CUDA обычно включает установление UVM, что предполагает согласование карт памяти устройства и хоста. Если на вашем сервере больше системной памяти, чем на вашем ПК, это одно из возможных объяснений несоответствия времени инициализации. ОС также может иметь эффект, и, наконец, размер памяти графического процессора может иметь эффект.
2, я думал, что «cudaSetDevice» может захватить время Init? например Этот ответ от talonmies
Процесс инициализации CUDA является «ленивой» инициализацией. Это означает, что достаточно всего процесса инициализации будет завершена, чтобы поддержать запрошенную операцию. Если запрошенная операция равна cudaSetDevice
, для этого может потребоваться меньше завершения инициализации (что означает, что требуемое время может быть короче), чем если запрошенная операция равна cudaMalloc
. Это означает, что некоторые из служебных данных инициализации могут быть поглощены операцией cudaSetDevice
, в то время как некоторые дополнительные служебные данные инициализации могут быть поглощены в последующую операцию cudaMalloc
.
3, Если инициализация неизбежна, может обрабатывать A поддерживать свой статус (или контекст) в графическом процессоре, когда процесс B работает на одном GPU? Я понимаю, что лучше запустить GPU в «эксклюзивном» режиме, но может обрабатывать «приостановку», так что позже не нужно снова инициализировать GPU?
Независимые процессы хоста, как правило, создаются независимо CUDA contexts. Контекст CUDA имеет связанное с ним требование инициализации, поэтому тот факт, что другой, отдельный контекст cuda может быть уже инициализирован на устройстве, не принесет большой пользы, если новый CUDA-контекст должен быть инициализирован (возможно, из отдельного хост-процесса). Как правило, сохранение активного процесса связано с тем, что приложение работает в этом процессе. Приложения имеют различные механизмы «спать» или приостанавливать поведение. Пока приложение не завершено, любой контекст, установленный этим приложением, не должен требовать повторной инициализации (за исключением, возможно, если вызывается cudaDeviceReset
).
В целом, некоторые преимущества могут быть получены в системах, которые позволяют графическим процессорам перейти в режим глубокого холостого хода, установив режим сохранения GPU (используя nvidia-smi
). Однако это не будет актуально для графических процессоров GeForce, и это будет несовместимо с системой Windows.
Кроме того, при использовании нескольких GPU-систем, если для приложения не требуется несколько графических процессоров, обычно можно избежать некоторого времени инициализации, используя CUDA_VISIBLE_DEVICES
environment variable, чтобы ограничить время выполнения CUDA только использованием необходимых устройств.
В самом деле, что ответ от @talonmies уже объясняет, что 'cudaSetDevice' не может захватить все время инициализации. –