【问题标题】:CUDA: CUtil timer - confusion on elapsed timeCUDA:CUtil 计时器 - 经过时间的混淆
【发布时间】:2012-07-28 21:10:45
【问题描述】:

当我评估我的程序时,我发现在某些时候我会出现长达 100 毫秒的时间间隔。我已经搜索了每个操作,但单独没有操作需要这个时间。然后我注意到无论我在哪里进行 cudaThreadSynchronize 调用,第一次调用都需要 100 毫秒。然后我在下面写了这样一个例子。在第一行调用 cudaThreadSynchronize 时,发现最后经过的时间值小于 1 毫秒。但如果不调用它,则平均需要 110 毫秒。

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}

我认为一开始的 cudaThreadSynchronize() 会处理 CUDA 库的初始化。完全初始化内核的方法是否正确,不会影响其他操作的时间评估?一开始就调用 cudaThreadSynchronize 是否足够,是否正确,或者有什么正确的方法..

【问题讨论】:

标签: timer cuda initialization elapsedtime


【解决方案1】:

为了使用 CUDA,必须首先在 GPU 上创建一个“CUDA 上下文”,这大约需要 70-100 毫秒。在您的示例中,cudaThreadSynchronize(); 正在创建上下文。上下文只为您的应用程序创建一次。在进行时序分析时,我还会创建一个虚拟内存副本来创建上下文(就像您在上面使用 cudaThreadSynchronize(); 所做的那样)。

【讨论】:

  • 在一段定时代码之前强制创建 CUDA 上下文的“经典”方法是调用 cudaFree(0)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多