【问题标题】:How to measure the inner kernel time in NVIDIA CUDA?如何测量 NVIDIA CUDA 中的内核时间?
【发布时间】:2012-05-22 02:15:57
【问题描述】:

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

__global__ void kernelSample()
{
  some code here
  get start time 
  some code here 
  get stop time 
  some code here
}

【问题讨论】:

  • 阿明,(几年前)您接受了一个有用信息但没有回答您的实际问题的答案。您是否介意不接受或编辑问题以反映答案?

标签: cuda gpu gpgpu nvidia


【解决方案1】:

你可以这样做:

__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() 是主机函数,不是设备函数。
  • clock() 一个设备功能,它确实有效。有关clock()clock64() 的描述,请参见CUDA 编程指南的B10 部分。如果它“无法正常工作”,则说明您做错了什么或误解了输出的含义。
  • 输出为时钟周期。如何转换为秒?
  • 确实在我的回答中说这是一个时钟周期。将其除以以千赫兹为单位的着色器时钟频率得到以毫秒为单位的答案(请注意,除非您有一个新的 Kepler GPU,否则您的 GPU 有两个时钟速度,您需要着色器时钟,而不是主时钟频率)
  • @Amin:如果这解决了你的问题,也许你会接受它。
【解决方案2】:

试试这个,它以毫秒为单位测量 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);

【讨论】:

  • 该代码不能在内核中使用,这就是问题所要求的。
  • @talonmies:所以,这个答案没有回答问题,但被接受了。我们应该做什么?编辑问题吧?
  • 在多个 GPU 上的 openmp 线程中运行内核,这段代码给了我 0 毫秒的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2011-01-12
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多