如何衡量NVIDIA CUDA的内核时间?

Ami*_*min 19 cuda gpu gpgpu nvidia

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

__global__ void kernelSample()
{
  some code here
  get start time 
  some code here 
  get stop time 
  some code here
}
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 36

你可以这样做:

__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);
}
Run Code Online (Sandbox Code Playgroud)

这给出了两次调用之间的时钟周期数.但要小心一点,计时器会在几秒后溢出,所以你应该确保连续调用之间的代码持续时间很短.您还应该知道编译器和汇编器确实执行指令重新排序,因此您可能需要检查时钟调用是否最终在SASS输出中彼此相邻(用于cudaobjdump检查).

  • `clock()`**是**设备功能,它确实有效.有关`clock()`和`clock64()`的说明,请参阅CUDA编程指南的B10部分.如果它"无法正常工作"你做错了什么或者误解了输出意味着什么. (5认同)
  • @Amin:如果这解决了你的问题,也许你会非常友好地接受它. (3认同)
  • 我*在我的回答中说*这是一个时钟周期.将它除以着色器时钟频率(以千赫兹为单位)以毫秒为单位得到答案(请注意,除非你有一个新的Kepler GPU,你的GPU有两个时钟速度,你需要着色器时钟,而不是主时钟频率) (2认同)

edo*_*rwi 1

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

  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);
Run Code Online (Sandbox Code Playgroud)

  • 该代码不能在内核中使用,这就是问题所要求的. (32认同)