Поведение, которое вы наблюдаете, - это ожидаемое поведение.Если вы будете искать по тегу cuda
«очередь» или «очередь запуска», вы найдете много других вопросов, которые относятся к нему.CUDA имеет очередь (очевидно, для каждого потока), в которую запускаются ядра.Пока количество ожидающих запусков меньше глубины очереди, процесс запуска будет асинхронным.
Однако, когда ожидающие (то есть незавершенные) запуски превышают глубину очереди, процесс запуска меняется на своего рода синхронный.поведение (хотя и не синхронное в обычном смысле).В частности, когда оставшееся количество запусков ядра превышает глубину очереди, процесс запуска будет блокировать поток ЦП, который выполняет следующий запуск, до тех пор, пока в очереди не откроется слот запуска (фактически это означает, что ядро вышло на другой конецочередь).
Вы не можете видеть это (невозможно запросить количество открытых слотов в очереди), а также нет возможности просматривать или контролировать глубину очереди.Большая часть информации, которую я здесь цитирую, получена в результате проверки;он официально не публикуется в документации CUDA, о которой мне известно.
Как уже обсуждалось в комментариях, один из возможных подходов к устранению вашей озабоченности по поводу запусков в сценарии с несколькими устройствами - это запуск в ширину, а нев глубину.Под этим я подразумеваю, что вы должны изменить свои циклы запуска, чтобы запустить ядро на устройстве 0, затем на устройстве 1, затем на устройстве 2 и т. Д., Прежде чем запускать следующее ядро на устройстве 0. Это даст вам оптимальную производительность в смыслечто все графические процессоры будут задействованы в обработке как можно раньше в последовательности запуска.
Если вы хотите увидеть изменения в поведении или документации CUDA, общее предложение - стать зарегистрированным разработчиком на разработчике.nvidia.com, затем войдите в свою учетную запись и зарегистрируйте ошибку, используя процесс регистрации ошибок, нажав на имя своей учетной записи в правом верхнем углу.