我刚接触过数据自动化系统,对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
的文档,它的功能是,直到在最近一次调用之前完成所有设备工作。因此,考虑到我们已经调用了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;
发布于 2017-11-08 10:28:30
只是为了充实注释,这样这个问题就有了答案,并从未回答的队列中掉了下来:
cudaDeviceSynchronize()
电话。事实上,在许多情况下,在多个流中使用异步API调用,使用全局范围同步调用是不正确的,因为您将打破事件定时器的特性,这些特性允许在流中精确地计时操作。https://stackoverflow.com/questions/47168542
复制相似问题