我是CUDA的新手并且对cudaEvent
感到困惑。我现在有一个代码示例如下:
float elapsedTime;
cudaEvent_t start, stop;
CUDA_ERR_CHECK(cudaEventCreate(&start));
CUDA_ERR_CHECK(cudaEventCreate(&stop));
CUDA_ERR_CHECK(cudaEventRecord(start));
// Kernel functions go here ...
CUDA_ERR_CHECK(cudaEventRecord(stop));
CUDA_ERR_CHECK(cudaEventSynchronize(stop));
CUDA_ERR_CHECK(cudaEventElapsedTime(&elapsedTime, start, stop));
CUDA_ERR_CHECK(cudaDeviceSynchronize());
我对此代码有两个问题:
1.最后cudaDeviceSynchronize
是必要的吗?因为根据cudaEventSynchronize
的文档,其功能等到最近一次调用cudaEventRecord()
之前所有设备工作完成。既然我们已经拨打cudaEventSynchronize(stop)
,我们是否需要再次致电cudaDeviceSynchronize
?
2.与以下实施相比,上述代码有何不同:
#include <chrono>
auto tic = std::chrono::system_clock::now();
// Kernel functions go here ...
CUDA_ERR_CHECK(cudaDeviceSynchronize());
auto toc = std::chrono::system_clock:now();
float elapsedTime = std::chrono::duration_cast < std::chrono::milliseconds > (toc - tic).count() * 1.0;
答案 0 :(得分:2)
只是为了充实评论,以便这个问题有一个答案,并且会从未答复的队列中删除:
不,cudaDeviceSynchronize()
来电不是必需的。事实上,在许多情况下,在多个流中使用异步API调用,使用全局范围同步调用是不正确的,因为您将破坏事件计时器的功能,这些功能允许在流中准确计时操作。
他们完全不同。一个是使用主机端 时机,另一个是使用设备驱动程序时序。在最简单的情况下,两者测量的时间将具有可比性。但是,在主机端定时版本中,如果您在主机定时部分中放置主机CPU操作会占用大量时间,那么您的时间测量将不会反映GPU操作所花费的时间少于主机时使用的GPU时间操作