首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cudaEventSynchronize对cudaDeviceSynchronize

cudaEventSynchronize对cudaDeviceSynchronize
EN

Stack Overflow用户
提问于 2017-11-07 22:35:13
回答 1查看 4.7K关注 0票数 6

我刚接触过数据自动化系统,对cudaEvent有点困惑。我现在有一个代码示例,如下所示:

代码语言:javascript
运行
复制
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.与以下实现相比,上述代码有多大不同:

代码语言:javascript
运行
复制
#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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-08 10:28:30

只是为了充实注释,这样这个问题就有了答案,并从未回答的队列中掉了下来:

  1. 不,没有必要打cudaDeviceSynchronize()电话。事实上,在许多情况下,在多个流中使用异步API调用,使用全局范围同步调用是不正确的,因为您将打破事件定时器的特性,这些特性允许在流中精确地计时操作。
  2. 他们完全不同。一种是使用主机端定时,另一种是使用设备驱动程序定时。在最简单的情况下,两者测量的时间是可比的。但是,在主机端定时版本中,如果将消耗大量时间的主机CPU操作放在主机计时部分,则您对时间的度量将不会反映GPU操作占用的时间少于主机操作时所用的GPU时间。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47168542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档