【问题标题】:Is cublasSetMatrixAsync on the default stream blocking?cublasSetMatrixAsync 是否在默认流阻塞上?
【发布时间】:2014-12-24 08:51:14
【问题描述】:

我想将数据从主机复制到设备并并行运行一些内核。关于运行 cublasSetMatrixAsync 函数调用是否会阻塞默认流,似乎存在相互矛盾的信息?

我看到它阻止了执行,我想知道使用它的正确方法是什么。 cublasSetMatrixAsync 应该在非默认流上吗?如果是这样,如果默认流将来需要设备上的矩阵用于某些内核,是否有一种简单的方法可以阻止默认流?

【问题讨论】:

  • 您能否指出您认为有冲突的 NVIDIA 文档的相关部分?
  • 一个或多或少有根据的猜测是,它会显示与普通 CUDA memcopy 函数相同的行为,因为我很确定在内部,CUBLAS 函数只是使用普通的 CUDA 函数。后者的行为在developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/… 中有详细解释(不幸的是,这个概述部分似乎不再包含在最近的文档中......)
  • @njuffa 我在看 pg。 Cheng, Grossman & Mckercher 在“专业 CUDA 编程”中排名第 269。作者说“如果你想重叠不同的 CUDA 操作,你必须使用非空流。”但后来在该页面上建议 cudaMemcpyAsync 可能可用于默认流。
  • @Marco13 感谢您的链接。这很有趣,但似乎没有涵盖与流的关系。

标签: asynchronous cuda


【解决方案1】:

是的,它具有阻塞行为。

来自programming guide

如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行: ...

任何 CUDA 命令到默认流,

cublasSetMatrixAsync 也不例外。

CUDA 并发的一般规则是,如果需要,不要使用默认流。

如果将来某些内核需要设备上的矩阵,是否有一种简单的方法可以阻止默认流?

发出cudaDeviceSynchronize()

这将强制与该设备关联的任何流中的所有 cuda 设备活动完成,然后才能开始向与该设备关联的任何流发出的任何后续命令。

【讨论】:

  • 谢谢。我想我的用例有点复杂,因为我有多个主机-> 设备传输批处理(比如矩阵 A、B、C...),并且计算也被批处理(opA、opB、opC... )。我只希望opB等待矩阵B,opC等待矩阵C等。有没有办法将默认流中的同步调用与相应的主机->设备传输相匹配?
  • 不要使用默认流。如果您希望 opB 等待 matrixB,则将 opB 发出到正在处理 matrixB 的同一流中。发出给给定流的 CUDA 活动始终是序列化的。如果您希望主机操作等待给定流中的设备操作,请改为发出cudaStreamSynchronize()
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2020-09-16
  • 2011-04-09
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多