1

当我评估我的程序时,我发现在某些时候我得到了高达 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 是否足够和正确,或者是否有任何正确的方法..

4

1 回答 1

1

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

于 2012-07-28T23:23:26.633 回答