【问题标题】:cudaStreamSynchronize in cuda for a single streamcudaStreamSynchronize 在 cuda 中用于单个流
【发布时间】:2014-06-11 16:09:37
【问题描述】:

我对 CUDA 流感到困惑。我了解到cudaStreamSynchronize() 会等待特定流的 GPU 操作完成。对于一个流,如果我们调用了 2 个内核,内核将按顺序执行;也就是说,对于一个流,第一个内核将被执行,下一个内核只有在第一个内核完成后才会执行。

我想问的是,如果我们只有一个流,是否有必要同步流? 无论我们是否为单个流同步它,它都不会按顺序执行吗?

【问题讨论】:

  • cudasynchronize()?你的意思是cudaDeviceSynchronize()
  • 抱歉是 cudaStreamSynchronize(stream);

标签: cuda


【解决方案1】:

是的,向同一流(默认流或任何流)发出的 cuda 调用会按顺序执行。它们是序列化的。

对于某些特定情况,您可能仍会向该流发出同步命令,在这些情况下您希望等待 GPU 活动完成,然后再执行一些 CPU 代码。例如,在内核调用之后立即发出的 CPU 代码或在 cudaMemcpyAsync 之后立即发出的 CPU 代码通常会与前面的 (cuda) 调用同时执行。

一个特定的情况可能是用于 cuda 错误检查。另一个特定情况可能是,如果您在零拷贝固定内存中异步进行一些 CPU/GPU 数据交换(无需发出明确的cudaMemcpy... 调用)。

但是当发布到同一个流时,通常不需要显式同步通常 cudaMemcpyAsync...kernel call...cudaMemcpyAsync 模式的 cuda 调用。信息流会为您做到这一点。

【讨论】:

  • 在单内核的情况下,在内核中使用 cudaDeviceSynchronize() 对计算时间有多大影响?创建单流和在内核中使用 cudaDeviceSynchronize() 应该是比使用没有 cudaDeviceSynchronize() 的默认流慢。不是吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2022-01-14
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多