我试图测量特斯拉(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);
}
Run Code Online (Sandbox Code Playgroud)
这是因为cudaEventRecord是异步的.无论状态如何,它都会立即完成执行.异步函数只是在"CUDA执行队列"上下订单.当GPU完成当前分配时,它会弹出下一个订单并执行它.这一切都在一个单独的线程中完成,由CUDA驱动程序处理,与程序主机线程分开.
cudaEventRecord 这是一个或多或少这样的命令:"当你完成以前的所有工作时,请在这个变量中标记我".
如果您的主机线程然后要求cudaEventElapsedTime,但GPU尚未完成其工作,它会感到困惑并报告"尚未准备就绪!".cudaEventSynchronize()停止当前主机线程,直到GPU达到cudaEventRecord您之前放置的顺序.在此之后,您将确保cudaEventElapsedTime为您提供有意义的答案.
cudaThreadSynchronize()它只是一个更强大的工具:它会停止当前线程,直到GPU完成所有已分配的任务,而不仅仅是那些直到事件.
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |