2013-10-15 2 views
2

Я пытаюсь интерпретировать некоторые тайминги, которые я использовал с помощью CudaEvents, не выполняет ли время выполнения ядра через CudaEvents накладное время для запуска ядра?CudaEvent время запуска ядра

К сожалению, у меня больше нет доступа к графическому процессору, совместимому с Cuda, для проведения любых тестов.

Большое спасибо

ответ

2

Это, конечно, захватывает некоторые рода накладные расходы, основанные на моих экспериментах.

Я думаю, что это должно быть ясно, что если ядро ​​скобки другой синхронной активности, то процессор накладных необходимо быть включены, так как накладные расходы 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, поэтому я не вижу причин в этом чтобы не ссылаться на него как накладные расходы ЦП.

+0

Не зависит ли «захват служебных данных» от использования потока по умолчанию или нет? – einpoklum

Смежные вопросы