Почему пересекающиеся передачи данных в CUDA медленнее, чем ожидалось?
Когда я запускаю simpleMultiCopy в SDK (4.0) на Tesla C2050, я получаю следующие результаты:
[simpleMultiCopy] starting...
[Tesla C2050] has 14 MP(s) x 32 (Cores/MP) = 448 (Cores)
> Device name: Tesla C2050
> CUDA Capability 2.0 hardware with 14 multi-processors
> scale_factor = 1.00
> array_size = 4194304
Relevant properties of this CUDA device
(X) Can overlap one CPU<>GPU data transfer with GPU kernel execution (device property "deviceOverlap")
(X) Can overlap two CPU<>GPU data transfers with GPU kernel execution
(compute capability >= 2.0 AND (Tesla product OR Quadro 4000/5000)
Measured timings (throughput):
Memcpy host to device : 2.725792 ms (6.154988 GB/s)
Memcpy device to host : 2.723360 ms (6.160484 GB/s)
Kernel : 0.611264 ms (274.467599 GB/s)
Theoretical limits for speedup gained from overlapped data transfers:
No overlap at all (transfer-kernel-transfer): 6.060416 ms
Compute can overlap with one transfer: 5.449152 ms
Compute can overlap with both data transfers: 2.725792 ms
Average measured timings over 10 repetitions:
Avg. time when execution fully serialized : 6.113555 ms
Avg. time when overlapped using 4 streams : 4.308822 ms
Avg. speedup gained (serialized - overlapped) : 1.804733 ms
Measured throughput:
Fully serialized execution : 5.488530 GB/s
Overlapped using 4 streams : 7.787379 GB/s
[simpleMultiCopy] test results...
PASSED
Это показывает, что ожидаемое время выполнения составляет 2,7 мс, тогда как на самом деле требуется 4,3. Что именно является причиной этого несоответствия? (Я также разместил этот вопрос по адресу http://forums.developer.nvidia.com/devforum/discussion/comment/8976.)
1 ответ
Первый запуск ядра не может начаться, пока не будет завершен первый memcpy, а последний memcpy не может запуститься, пока не будет завершен последний запуск ядра. Итак, есть "свисание", которое вводит некоторые накладные расходы, которые вы наблюдаете. Вы можете уменьшить размер "выгрузки", увеличив число потоков, но синхронизация между потоками влечет за собой собственные издержки.
Важно отметить, что перекрывающиеся вычисления + передача не всегда приносят пользу данной рабочей нагрузке - в дополнение к описанным выше проблемам с накладными расходами, сама рабочая нагрузка должна тратить одинаковое количество времени на вычисления и передачу данных. В соответствии с законом Амдала, потенциальное ускорение в 2 или 3 раза уменьшается, когда рабочая нагрузка становится либо переданной, либо привязанной к вычислениям.