cudaEventSynchronize vs cudaDeviceSynchronize

时间:2017-11-07 22:35:14

标签: cuda cuda-events

我是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;

1 个答案:

答案 0 :(得分:2)

只是为了充实评论,以便这个问题有一个答案,并且会从未答复的队列中删除:

  1. 不,cudaDeviceSynchronize()来电不是必需的。事实上,在许多情况下,在多个流中使用异步API调用,使用全局范围同步调用是不正确的,因为您将破坏事件计时器的功能,这些功能允许在流中准确计时操作。

  2. 他们完全不同。一个是使用主机端 时机,另一个是使用设备驱动程序时序。在最简单的情况下,两者测量的时间将具有可比性。但是,在主机端定时版本中,如果您在主机定时部分中放置主机CPU操作会占用大量时间,那么您的时间测量将不会反映GPU操作所花费的时间少于主机时使用的GPU时间操作