Вопрос по nvidia – Как измерить время внутреннего ядра в NVIDIA CUDA?

16

Я хочу измерять время внутреннего ядра графического процессора, как его измерить в NVIDIA CUDA? например

__global__ void kernelSample()
{
  some code here
  get start time 
  some code here 
  get stop time 
  some code here
}
Amin, (несколько лет назад) вы приняли ответ, который является полезной информацией, но не отвечает на ваш настоящий вопрос. Вы не против принять или отредактировать вопрос, чтобы отразить ответ? einpoklum

Ваш Ответ

2   ответа
6

он измеряет время между двумя событиями в миллисекундах.

  cudaEvent_t start, stop;
  float elapsedTime;

  cudaEventCreate(&start);
  cudaEventRecord(start,0);

 //Do kernel activity here

 cudaEventCreate(&stop);
 cudaEventRecord(stop,0);
 cudaEventSynchronize(stop);

 cudaEventElapsedTime(&elapsedTime, start,stop);
 printf("Elapsed time : %f ms\n" ,elapsedTime);
Этот код нельзя использовать внутри ядра, о чем и спрашивает вопрос. talonmies
@ talonmies: Итак, этот ответ не отвечает на вопрос, но принимается. Что нам делать? Изменить вопрос возможно? einpoklum
Работающие ядра в потоках openmp на нескольких графических процессорах, и этот код дает мне 0 мс результат newbieee
35

__global__ void kernelSample(int *runtime)
{
  // ....
  clock_t start_time = clock(); 
  //some code here 
  clock_t stop_time = clock();
  // ....

  runtime[tidx] = (int)(stop_time - start_time);
}

Который дает количество тактов между двумя вызовами. Тем не менее, будьте осторожны, таймер переполнится через пару секунд, поэтому вы должны быть уверены, что длительность кода между последовательными вызовами довольно мала. Вы также должны знать, что компилятор и ассемблер выполняют переупорядочение инструкций, поэтому вы можете проверить, чтобы вызовы часов не оказались рядом друг с другом в выводе SASS (используйтеcudaobjdump Проверять)

Я проверяю и не работает должным образом. clock () - это функция хоста, а не функция устройства. Amin
clock() являетс функция устройства, и она действительно работает. См. Раздел B10 руководства по программированию CUDA для описанияclock() а такжеclock64(). Если это «не работает должным образом», вы делаете что-то неправильно или неправильно поняли, что означает вывод. talonmies
Выход - тактовый цикл. Как перевести в секунды? Amin
I сдела скажи, что в моем ответе был тактовый цикл. Разделите его на тактовую частоту шейдера в килогерцах, чтобы получить ответ в миллисекундах (обратите внимание, что если у вас нет нового графического процессора Kepler, у вашего графического процессора есть две тактовые частоты, вам нужны тактовые частоты шейдера, а не основная тактовая частота) talonmies
@ Амин: если это решит твою проблему, возможно, ты будешь так любезен принять ее. talonmies

Похожие вопросы