如何测量NVIDIA CUDA中的内核时间?

如何测量NVIDIA CUDA中的内核时间?,cuda,gpu,gpgpu,nvidia,Cuda,Gpu,Gpgpu,Nvidia,我想测量GPU内核的时间,如何在NVIDIA CUDA中测量它? e、 g 试试这个,它以毫秒为单位测量两个事件之间的时间 cudaEvent_t start, stop; float elapsedTime; cudaEventCreate(&start); cudaEventRecord(start,0); //Do kernel activity here cudaEventCreate(&stop); cudaEventRecord(stop,

我想测量GPU内核的时间,如何在NVIDIA CUDA中测量它? e、 g


试试这个,它以毫秒为单位测量两个事件之间的时间

  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);

您可以这样做:

__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进行检查。

该代码不能在内核中使用,这正是问题所在。@talonmies:so,这个答案没有回答问题,但被接受了。我们该怎么办?也许可以编辑这个问题?在多个GPU上的openmp线程中运行内核,这段代码会给我0毫秒的resultI测试,但无法正常工作。时钟是主机功能,而不是设备功能。时钟是设备功能,它确实工作。有关时钟和时钟64的说明,请参阅《CUDA编程指南》第B10节。如果它不能正常工作,你就做错了,或者误解了输出的含义。输出是时钟周期。如何转换为秒?我在回答中确实说过这是一个时钟周期。将其除以着色器时钟频率(以千赫兹为单位),以毫秒为单位获得答案请注意,除非您有一个新的开普勒GPU,否则您的GPU有两个时钟速度,您需要的是着色器时钟,而不是主时钟frequency@Amin当前位置如果这解决了你的问题,也许你会接受它。阿明,几年前,你接受了一个答案,这是有用的信息,但没有回答你的实际问题。您是否介意取消接受或编辑问题以反映答案?
__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);
}