c++ - 我应该汇集 CUDA 流吗?
问题描述
创建和销毁 CUDA 流的操作有多轻量级?例如,对于 CPU 线程,这些操作很繁重,因此它们通常会汇集 CPU 线程。我也应该汇集 CUDA 流吗?或者每次我需要它时创建一个流然后销毁它是否很快?
解决方案
来自 NVIDIA 的指导是您应该汇集 CUDA 流。下面是马嘴里的一句话,https ://github.com/pytorch/pytorch/issues/9646 :
在 PyTorch master 中创建、保留和销毁 CUDA 流是有成本的。尤其是:
- 跟踪 CUDA 流需要原子引用计数
- 销毁 CUDA 流可以(很少)导致隐式设备同步
- 例如,引用计数问题已被提出作为扩展流跟踪以允许向后流的问题,并且显然最好避免隐式设备同步,因为它会导致经常意外的性能下降。
对于静态框架,推荐的最佳实践是预先创建所有需要的流,并在工作完成后销毁它们。这种模式并不立即适用于 PyTorch,但每个设备的流池会达到类似的效果。
推荐阅读
- python - TypeError: __init__() 得到了一个意外的关键字参数'after'
- nsnotifications - 使用 Frida 挂钩 postNotificaiton
- c# - 我如何以某个 char 值划分一个字符串,然后得到这个除法的最后一个字?
- python - Jupiter Notebook 中的“没有名为 matplotlib 的模块”错误
- c - 有谁知道这段代码有什么问题?这根本不起作用
- python - 如何将 Python 列表中的所有元素插入到 SQLAlchemy 列的各个行中?
- c - 编译C文件没问题,但是exe文件什么都不显示
- javascript - Nextjs 在使用 babel-plugin-styled-components 时抛出类名不匹配错误
- node.js - Mongo Aggregation $group by _id 和 date
- sql-server - 登录失败。登录来自不受信任的域,不能与集成身份验证 Access vba 一起使用