Обратите внимание, что вы упоминаете NVPROF, но изображения, которые вы показываете, взяты из nvvp - визуального профилировщика. nvprof - это профилировщик командной строки
Запуски ядра GPU являются асинхронными. Это означает, что поток ЦП запускает ядро, но не ожидает его завершения. Фактически, процессорная нагрузка фактически помещает ядро в очередь запуска - фактическое выполнение ядра может быть отложено, если что-то еще происходит в GPU.
Таким образом, не существует определенной связи между активностью CPU (API) и активностью GPU по времени, за исключением того, что запуск ядра CPU должен явно предшествовать (хотя бы немного) выполнению ядра GPU.
Желтый блок ЦП (API) представляет продолжительность времени, которое поток ЦП тратит на вызов библиотеки в библиотеку времени выполнения CUDA, чтобы запустить ядро (то есть поместить его в очередь запуска). Эта активность вызова библиотеки обычно связана с некоторыми временными издержками в диапазоне 5-50 микросекунд. Начало этого периода отмечается началом вызова в библиотеку. Конец этого периода отмечен временем, когда библиотека возвращает управление вашему коду (т. Е. Вашей следующей строке кода после запуска ядра).
Желтый блок графического процессора представляет фактический период времени, в течение которого ядро выполнялось на графическом процессоре. Начало и конец этого желтого блока отмечены началом и концом активности ядра на графическом процессоре. Продолжительность здесь зависит от того, что делает код в вашем ядре, и сколько времени это занимает.
Я не думаю, что точная причина, по которой запуск ядра GPU занимает ~ 5-50 микросекунд процессорного времени, документирована или объяснена где-либо авторитетным образом, и это библиотека с закрытым исходным кодом, поэтому вам нужно будет признать, что накладные расходы, как то, что вы мало контролируете. Если вы разрабатываете ядра, которые работают долго и выполняют много работы, эти издержки могут стать незначительными.