CUDA:cudaEventElapsedTime返回设备未就绪错误

我试图测量特斯拉(T10处理器)上的经过时间,并且cudaEventElapsedTime返回设备未就绪错误.但是当我在Fermi(特斯拉M2090)上进行测试时,它给了我结果.

谁能告诉我发生了什么……

这是我的代码

cudaError_t err;
        cudaEvent_t start, stop;
        cudaEventCreate(&start);
        cudaEventCreate(&stop);
        err = cudaEventRecord(start, 0);
        f(err != cudaSuccess) {
          printf ("\n\n 1. Error: %s\n\n", cudaGetErrorString(err));
          exit(1);
        }
        // actual code
       cudaThreadSynchronize();
        err = cudaEventRecord(stop, 0);
        if(err != cudaSuccess) {
          printf ("\n\n2. Error: %s\n\n", cudaGetErrorString(err));
          exit(1);
        }
        err = cudaEventElapsedTime(&elapsed_time, start, stop);
        f(err != cudaSuccess) {
          printf ("\n\n 3. Error: %s\n\n", cudaGetErrorString(err));
          exit(1);
        }
最佳答案
这是因为cudaEventRecord是异步的.无论状态如何,它都会立即完成执行.异步函数只是在“CUDA执行队列”上下订单.当GPU完成当前分配时,它会弹出下一个订单并执行它.这一切都在一个单独的线程中完成,由CUDA驱动程序处理,与程序主机线程分开.

cudaEventRecord是一个或多或少说这样的命令:“当你完成以前的所有工作时,请在这个变量中标记我”.

如果您的主机线程然后请求cudaEventElapsedTime,但GPU尚未完成其工作,它会变得混乱并报告“尚未准备就绪!”. cudaEventSynchronize()停止当前主机线程,直到GPU达到您之前放置的cudaEventRecord顺序.之后,您可以保证cudaEventElapsedTime将为您提供有意义的答案.

cudaThreadSynchronize()只是一个更强大的工具:它会停止当前线程,直到GPU完成所有已分配的任务,而不仅仅是那些直到事件.

转载注明原文:CUDA:cudaEventElapsedTime返回设备未就绪错误 - 代码日志