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

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

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

Ответы на вопрос(2)

__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 Проверять)

 Amin15 мая 2012 г., 18:03
Выход - тактовый цикл. Как перевести в секунды?
 talonmies16 мая 2012 г., 05:18
@ Амин: если это решит твою проблему, возможно, ты будешь так любезен принять ее.
 talonmies15 мая 2012 г., 16:41
clock() являетс функция устройства, и она действительно работает. См. Раздел B10 руководства по программированию CUDA для описанияclock() а такжеclock64(). Если это «не работает должным образом», вы делаете что-то неправильно или неправильно поняли, что означает вывод.
 talonmies15 мая 2012 г., 19:10
I сдела скажи, что в моем ответе был тактовый цикл. Разделите его на тактовую частоту шейдера в килогерцах, чтобы получить ответ в миллисекундах (обратите внимание, что если у вас нет нового графического процессора Kepler, у вашего графического процессора есть две тактовые частоты, вам нужны тактовые частоты шейдера, а не основная тактовая частота)
 Amin15 мая 2012 г., 16:38
Я проверяю и не работает должным образом. clock () - это функция хоста, а не функция устройства.
Решение Вопроса

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

  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);
 talonmies14 мая 2012 г., 18:14
Этот код нельзя использовать внутри ядра, о чем и спрашивает вопрос.
 einpoklum11 февр. 2017 г., 01:31
@ talonmies: Итак, этот ответ не отвечает на вопрос, но принимается. Что нам делать? Изменить вопрос возможно?
 newbieee13 апр. 2017 г., 09:59
Работающие ядра в потоках openmp на нескольких графических процессорах, и этот код дает мне 0 мс результат

Ваш ответ на вопрос