Это, конечно, захватывает некоторые рода накладные расходы, основанные на моих экспериментах.
Я думаю, что это должно быть ясно, что если ядро скобки другой синхронной активности, то процессор накладных необходимо быть включены, так как накладные расходы CPU отделяет предыдущую активность от запуска ядра:
cudaEventRecord(start);
cudaMemcpy(...); // cudaMemcpy 1
my_kernel<<<...>>>(...);
cudaMemcpy(...);
cudaEventRecord(stop);
Конечно, это кажется очевидным, что выбор времени изображали выше должны захватить нагрузку на процессор между cudaMemcpy 1 и вызова ядра (наряду с различными другими вкладами время не из-за самого ядра.)
Так менее очевидный случай, когда ядро в одиночку или в квадратных скобках других асинхронных вызовов:
cudaEventRecord(start);
my_kernel<<<...>>>(...);
cudaEventRecord(stop);
cudaEventSynchronize(stop);
Основываясь на моем тестировании выше шаблон, и с пустым ядром:
__global__ void my_kernel(){
}
Я наблюдаю тайминги на Linux, по меньшей мере, несколько микросекунд, и это совсем немного дольше, чем время, необходимое для выполнения двух команд в моем пустом ядре:
Function : _Z8mykernelv
/*0000*/ /*0x00005de428004404*/ MOV R1, c [0x1] [0x100];
/*0008*/ /*0x00001de780000000*/ EXIT;
Поэтому я утверждаю, что какое-то о f служебные данные настройки выполнения захватываются системой cudaEvent
. Если кто-то хочет утверждать, что это накладные расходы не Накладные расходы процессора, но что-то еще, пусть будет так.
Моя претензия в том, что какая-то форма накладных расходов захвачена, и я не вижу причин не ссылаться на нее как накладные расходы ЦП. Кроме того, при типичном времени cudaEvent
, который включает в себя cudaEventSynchronize()
сразу после маркера stop
, кажется очевидным, что хост-поток будет заблокирован, по меньшей мере, на длительности, захваченной системой cudaEvent
между маркерамии stop
, поэтому я не вижу причин в этом чтобы не ссылаться на него как накладные расходы ЦП.
Не зависит ли «захват служебных данных» от использования потока по умолчанию или нет? – einpoklum