当我评估我的程序时,我发现在某些时候我的延时时间高达 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-100 毫秒。在你的例子中 cudaThreadSynchronize(); 正在创造背景。上下文仅为您的应用程序创建一次。在进行时序分析时,我还会进行虚拟内存复制来创建上下文(正如您上面使用的那样) cudaThreadSynchronize();).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top