Timer CUDA:CUtil定时器-运行时间混乱

Timer CUDA:CUtil定时器-运行时间混乱,timer,cuda,initialization,elapsedtime,Timer,Cuda,Initialization,Elapsedtime,当我评估我的程序时,我发现在某个时刻,我的时间间隔达到100毫秒。我搜索了每一次手术,但这次没有一次手术。然后我注意到,无论我在哪里调用cudaThreadSynchronize,第一个调用都需要100毫秒。然后我在下面写了这样一个例子。在第一行调用cudaThreadSynchronize时,发现末尾的已用时间值小于1毫秒。但如果不调用,则平均需要110毫秒 int main(int argc, char **argv) { cudaThreadSynchronize(); //Com

当我评估我的程序时,我发现在某个时刻,我的时间间隔达到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是否足够且正确,或者是否有任何正确的方法。

为了使用CUDA,必须首先在GPU上创建“CUDA上下文”,这大约需要70-100ms。在您的示例中,
cudaThreadSynchronize()正在生成上下文。仅为应用程序创建一次上下文。在进行计时分析时,我也会进行虚拟内存复制以创建上下文(正如您在上面使用
cudaThreadSynchronize();
)。

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

在代码的计时部分之前强制创建CUDA上下文的“经典”方法是调用cudaFree(0)。“经典”在代码的定时部分之前强制创建CUDA上下文的方法是调用cudaFree(0)。可能重复的