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

CUDA:CUDAEventReleasedTime返回设备未就绪错误,cuda,Cuda,我试图测量特斯拉(T10处理器)上的运行时间,CudaEventReleasedTime返回设备未就绪错误。但当我在费米(Tesla M2090)上测试时,它给出了结果 谁能告诉我发生了什么事 这是我的密码 cudaError_t err; cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventCreate(&stop); err = cudaEvent

我试图测量特斯拉(T10处理器)上的运行时间,CudaEventReleasedTime返回设备未就绪错误。但当我在费米(Tesla 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
是一个或多或少类似这样的命令:“当您完成所有以前的工作时,在这个变量中标记我”

如果您的主机线程随后请求
cudaeventerfersedtime
,但GPU尚未完成其工作,它会感到困惑并报告“尚未准备就绪!”
cudaEventSynchronize()
暂停当前主机线程,直到GPU达到您先前下的
cudaEventRecord
订单。在此之后,您可以保证
cudaeventreleasedtime
将为您提供有意义的答案


cudaThreadSynchronize()
只是一个更强大的工具:它会暂停当前线程,直到GPU完成所有分配的任务,而不仅仅是在事件发生之前。

甚至我也遇到了这个问题,因此根据@CygnusX1的回答,我将所有执行代码保存在一个单元格中,而将
cudaeventelsedtime
保存在另一个单元格中。这就解决了这个问题,因为Colab(或jupyter笔记本电脑)只有在当前单元格中的进程完成后才能转到下一个单元格

因此,

提出问题中报告的错误,即
设备未就绪错误
,并由解决

with torch.no_grad():
  model.eval()
  model(x) # warm up
  start.record() 
  model(x)
  model(x)
  model(x)
  end.record()
# Shift the print command to next code CELL !!!

我想出了解决这个问题的办法,但如果有人告诉我为什么会这样,那就好了。因此,我将保留这个问题。解决方案是cudaThreadSynchronize()应该在cudaEventRecord(停止,0)之后。如果有人知道费米没有发生的原因和原因,请告诉我。谢谢。但是为什么费米没有面对这个问题呢?我的意思是相同的代码成功运行并给出了费米体系结构的结果。为什么?我不知道。也许费米足够快了?:)
with torch.no_grad():
  model.eval()
  model(x) # warm up
  start.record() 
  model(x)
  model(x)
  model(x)
  end.record()
# Shift the print command to next code CELL !!!
 print('execution time in MILLISECONDS: {}'.format(start.elapsed_time(end)/3.0))