如何测量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测试,但无法正常工作。clock()是主机函数,而不是设备函数。
clock()
是一个设备函数,它确实有效。有关
clock()
clock64()
的说明,请参阅《CUDA编程指南》第B10节。如果它“工作不正常”,你就做错了什么,或者误解了输出的含义。输出是时钟周期。如何转换为秒?我在回答中确实说过这是一个时钟周期。将其除以着色器时钟频率(以千赫兹为单位),以毫秒为单位得到答案(请注意,除非你有一个新的开普勒GPU,否则你的GPU有两个时钟速度,你需要的是着色器时钟,而不是主时钟频率)@Amin:如果这解决了你的问题,也许你会很乐意接受它。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);
}