问题标签 [cuda-streams]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 跨并发内核执行的 CUDA 全局原子操作
我的 CUDA 应用程序对卷执行关联缩减。本质上,每个线程都会计算以原子方式添加到全局内存中同一输出缓冲区的重叠位置的值。
是否可以使用不同的输入参数和相同的输出缓冲区同时启动这个内核?换句话说,每个内核将共享相同的全局缓冲区并以原子方式写入它。
所有内核都在同一个 GPU 上运行。
machine-learning - 使用 PyTorch 与模型的正向传递并行执行另一个模型
我正在尝试对 PyTorch 中的 ResNet-18 模型进行一些更改,以调用另一个辅助训练模型的执行,该模型将每个 ResNet 块末尾的 ResNet 中间层输出作为输入,并在推理期间进行一些辅助预测相。
我希望能够在一个块的计算之后与下一个 ResNet 块的计算并行进行辅助计算,以减少整个流水线在 GPU 上执行的端到端延迟。
从功能的角度来看,我有一个可以正常工作的基本代码,但是辅助模型的执行与 ResNet 块的计算是串行的。我通过两种方式验证了这一点 -
通过添加打印语句并验证执行顺序。
通过检测原始 ResNet 模型(例如时间 t1)和辅助模型(例如时间 t2)的运行时间。我的执行时间目前是 t1+t2。
原始 ResNet 块代码(这是 BasicBlock,因为我正在尝试 ResNet-18)。完整代码可在此处获得
这是我的修改,它以串行方式工作-
可以理解的是,上面的代码会导致辅助模型的执行与下一个块之间存在数据依赖关系,因此事情会连续发生。我尝试的第一个解决方案是检查打破这种数据依赖性是否会减少延迟。我尝试通过允许辅助模型执行但在满足条件时不让辅助预测返回来这样做(请注意,这会破坏功能,但这个实验纯粹是为了理解行为)。本质上,我所做的是——
然而,这并没有奏效,在进一步研究后,我在Stack Overflow 链接上偶然发现了 CUDA 流。我尝试通过以下方式结合 CUDA 流的想法来解决我的问题 -
但是,Nvidia Visual Profiler 的输出仍然表明所有工作仍在默认流上完成,并且仍在序列化。请注意,我确实使用小型 CUDA 程序验证了我正在使用的 CUDA 版本支持 CUDA 流。
我的问题-
为什么打破数据依赖性不会导致 PyTorch 并行调度计算?我认为这是 PyTorch 中动态计算图的重点。
为什么使用 CUDA 流不会将计算委托给非默认流?
是否有替代方法可以与 ResNet 块计算异步/并行执行辅助模型?
cuda - CUDA 图形流捕获与thrust::reduce
当我试图捕获流执行以构建 CUDA 图时,调用会thrust::reduce
导致运行时错误cudaErrorStreamCaptureUnsupported: operation not permitted when stream is capturing
。我已经尝试将归约结果返回给主机和设备变量,并且我正在通过thrust::cuda::par.on(stream)
. 有什么方法可以将thrust
函数执行添加到 CUDA 图中?
cuda - 在 CUDA 中使用两个循环重叠传输和内核执行
我想以这样的形式重叠数据传输和内核执行:
在这种情况下可以重叠吗?目前只有 HtoD 传输与内核执行重叠。第一次 DtoH 传输在最后一次内核执行之后执行。
cuda - 是否可以手动设置用于一个 CUDA 流的 SM?
默认情况下,内核将使用设备的所有可用 SM(如果有足够的块)。但是,现在我有 2 个流,一个计算密集型和一个内存密集型,我想分别限制用于 2 个流的最大 SM(设置最大 SM 后,一个流中的内核将使用最大 SM,比如计算密集型的 20SMs 和内存密集型的 4SMs),是否可以这样做?(如果可能,我应该使用哪个 API)
c++ - CUDA C++ 重叠 SERIAL 内核执行和数据传输
因此,本指南在这里展示了重叠内核执行和数据传输的一般方法。
但是,内核是串行的。所以它必须处理 0->1000,然后 1000->2000,... 简而言之,在重叠数据传输时正确执行此内核的顺序是:
- 复制[a->b] 必须在内核[a->b] 之前发生
- kernel [a->b] 必须发生在 kernel[b->c] 之前,其中 c > a, b
不使用可以做到这一点cudaDeviceSynchronize()
吗?如果没有,最快的方法是什么?
cuda - CUDA cudaMemcpyAsync 使用单个流来托管
我有一个内核,它使用单个流来感受两个参数(dev_out_1 和 dev_out_2)的数据。我想将设备中的数据并行复制回主机。我的要求是使用单个流并并行复制回主机。
您如何处理此类问题?
cuda - 将 __constant__ 内存与 MPI 和流一起使用
如果我有一个__constant__
价值
非阻塞流上的 MPI 等级可能会也可能不会初始化:
这是:
- 在内核中同时被多个 MPI 等级访问是否安全?即,排名是否共享相同的实例
val
或 MPI 语义(它们都有一个私有副本)是否仍然有效? - 如果以上是安全的,那么由多个 MPI rank 初始化是否安全?
cuda - 重用 cudaEvent 序列化多个流
假设我有一个结构:
一个功能:
以及以下场景(狮子、女巫和衣柜也适合某个地方):
以上安全吗?即如果它本身不起作用,它stream2
仍然会等待完成它的“工作”吗?stream1
结果记录是否会cudaEvent
反映这一点,stream3
直到stream1
完成才开始?