【问题标题】:How can I get kernel start time in CUDA?如何在 CUDA 中获取内核启动时间?
【发布时间】:2022-01-04 01:03:11
【问题描述】:

我正在尝试使用以下代码获取内核启动时间,但此代码的输出不正确。

我想要内核函数的启动时间相对于这个程序的启动时间。也就是说,如果我们把这个程序的开始时间看作零时间,那么内核函数的开始时间是多少。

我的错误是什么?

//headers
#include <sys/time.h>

//kernel function defined here

int main(){
struct timeval kernelStartTime;

//memcpys and ....

gettimeofday(&kernelStartTime, 0);
MatrixMulCUDA<32><<<matrixMulgrid, matrixMulthreads>>>(C, A, B, dimsA.x, dimsB.x);
cudaDeviceSynchronize();

float startTime = (1000000.0 * kernelStartTime.tv_sec + kernelStartTime.tv_usec)/1000.0;

//some codes

printf("kernel start time = %f", startTime);
return 0;
}

输出:

内核启动时间 = 1.63786e+12

谢谢。

【问题讨论】:

  • 为什么 1.6e12 不是正确答案?根据gettimeofday linux man page,该函数返回“自 epoch 以来的秒数”。你知道那是什么吗?时代似乎是1970-01-01 00:00:00 +0000 (UTC).。自纪元以来,您的缩放似乎实际上产生了数毫秒。这个数字似乎在正确的范围内,从 1970 年到现在的毫秒数。您期望的价值是多少?
  • 谢谢克罗维拉先生。在你的评论之后,我明白了我应该做什么。
  • 当你不想使用 cudaDeviceSynchronize - docs.nvidia.com/cuda/cuda-runtime-api/… 时,你也可以考虑使用回调来获取实际的内核启动时间
  • @meh 由于您已经发布了自己问题的答案,请考虑接受该答案。如果问题已接受答案,则对社区更有帮助。

标签: cuda


【解决方案1】:
//headers
#include <sys/time.h>

//kernel function defined here

int main(){
struct timeval kernelStartTime, baseTime;
gettimeofday(&baseTime, 0);

//memcpys and ....

gettimeofday(&kernelStartTime, 0);
MatrixMulCUDA<32><<<matrixMulgrid, matrixMulthreads>>>(C, A, B, dimsA.x, dimsB.x);
cudaDeviceSynchronize();

float startTime = (1000000.0 * (kernelStartTime.tv_sec - baseTime.tv_sec) + (kernelStartTime.tv_usec - baseTime.tv_usec))/1000.0;

//some codes

printf("kernel start time = %f", startTime);
return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2012-10-28
    • 2013-07-15
    • 2012-08-23
    相关资源
    最近更新 更多