cudaEventSynchronize 与 cudaDeviceSynchronize
cudaEventSynchronize vs cudaDeviceSynchronize
我是 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.Is最后cudaDeviceSynchronize
有必要吗?因为根据 cudaEventSynchronize
的文档,它的功能是 等待直到最近一次调用 cudaEventRecord()
之前的所有设备工作完成。那么既然我们已经调用了cudaEventSynchronize(stop)
,我们还需要再调用一次cudaDeviceSynchronize
吗?
2.How 上面的代码与下面的实现不同:
#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;
只是为了充实评论,以便这个问题有答案并且会从未回答的队列中消失:
不,不需要调用 cudaDeviceSynchronize()
。事实上,在多个流中使用异步 API 调用的许多情况下,使用全局范围同步调用是不正确的,因为您会破坏允许在流中准确计时操作的事件计时器的功能。
他们完全不同。一种是使用主机端
时序,另一种是使用设备驱动程序时序。在最简单的情况下,两者测量的时间将具有可比性。但是,在主机端计时版本中,如果将消耗大量时间的主机 CPU 操作放在主机计时部分,则当 GPU 操作花费较少时,您的时间测量将不会反映使用的 GPU 时间比主机操作时间。
我是 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.Is最后cudaDeviceSynchronize
有必要吗?因为根据 cudaEventSynchronize
的文档,它的功能是 等待直到最近一次调用 cudaEventRecord()
之前的所有设备工作完成。那么既然我们已经调用了cudaEventSynchronize(stop)
,我们还需要再调用一次cudaDeviceSynchronize
吗?
2.How 上面的代码与下面的实现不同:
#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;
只是为了充实评论,以便这个问题有答案并且会从未回答的队列中消失:
不,不需要调用
cudaDeviceSynchronize()
。事实上,在多个流中使用异步 API 调用的许多情况下,使用全局范围同步调用是不正确的,因为您会破坏允许在流中准确计时操作的事件计时器的功能。他们完全不同。一种是使用主机端 时序,另一种是使用设备驱动程序时序。在最简单的情况下,两者测量的时间将具有可比性。但是,在主机端计时版本中,如果将消耗大量时间的主机 CPU 操作放在主机计时部分,则当 GPU 操作花费较少时,您的时间测量将不会反映使用的 GPU 时间比主机操作时间。