CUDA:CUtil计时器 - 经过时间的混乱

时间:2012-07-28 21:10:46

标签: timer cuda initialization elapsedtime

当我评估我的节目时,我发现在某些时候我达到了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是正确的,还是有任何正确的方法..

1 个答案:

答案 0 :(得分:1)

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