Первый запуск ядра не может начаться, пока не завершится первый memcpy, а последний memcpy не может запуститься, пока не будет завершен последний запуск ядра. Итак, есть «свисание», которое вводит некоторые накладные расходы, которые вы наблюдаете. Вы можете уменьшить размер «выгрузки», увеличив число потоков, но синхронизация между потоками влечет за собой собственные издержки.
Важно отметить, что перекрывающиеся вычисления + передача не всегда приносят пользу данной рабочей нагрузке - в дополнение к описанным выше проблемам с накладными расходами, сама рабочая нагрузка должна тратить одинаковое количество времени на вычисления и передачу данных. В соответствии с законом Амдала, потенциальное ускорение в 2 или 3 раза уменьшается, когда рабочая нагрузка становится либо переданной, либо привязанной к вычислениям.