GXF 流同步#
GXF 流同步负责在两个 CUDA codelet 之间进行同步,而无需 CPU 等待。当使用两个 CUDA codelet 时,第一个生成数据或触发 CUDA 内核的 CUDA codelet 被称为 signaler(信号发送者)。第二个等待数据或上游 codelet 提交的 CUDA 作业的 CUDA codelet 被称为 waiter(等待者)。信令和等待基于单个同步对象。Signaler 和 waiter 都使用相同的同步对象。CUDA 流与 signaler 和 waiter 相关联。同步对象提供用于信令和等待机制的 API。
Signaler(信号发送者)#
Signaler codelet 在特定 CUDA 流上提交所有工作后,将调用同步对象的 signalSemaphore API。在内部,GXF 流同步将使用栅栏 (fence) 来跟踪 CUDA 流上提交的任务的完成情况。信令在 GPU 上异步发生,signalSemaphore API 立即返回。signalSemaphore 将使用提交工作的同一 CUDA 流。Signaler 还负责分配同步对象,并将相同的对象作为消息实体传递给 waiter。
Waiter(等待者)#
Waiter codelet 将调用 waitSemaphore 并将其自身的工作提交到 signaler codelet 提交工作的同一 CUDA 流,或者它可以使用另一个 CUDA 流。GXF 流同步将等待直到栅栏被发出信号,这确保了 signaler codelet 提交的工作已完成。等待在 GPU 上异步发生,waitSemaphore API 立即返回。
下图描述了 signaler 和 waiter 的概念
图:跨两个 CUDA codelet 的同步
GxfStreamExtension#
用于在两个 CUDA 模块之间进行同步而无需 CPU 等待的扩展。
UUID:
918e6ad7-8e1a-43aa-9b49-251d4b6072b0
版本:
0.5.0
作者:
NVIDIA
许可证:
LICENSE
组件#
nvidia::gxf::GxfStreamSync#
此组件有助于实现跨两个 CUDA codelet 的同步,而无需 CPU 等待。它持有一个同步对象,可供 signaler 和 waiter 使用。
组件 ID: 0011bee7-5d53-43ee-aafa-61485a436bc4
基类型: nvidia::gxf::Component
定义于: gxf/stream/stream_nvscisync.hpp
参数#
signaler(信号发送者)
指示 signaler 类型的参数。
标志: GXF_PARAMETER_FLAGS_NONE
类型: GXF_PARAMETER_TYPE_INT32
waiter(等待者)
指示 waiter 类型的参数。
标志: GXF_PARAMETER_FLAGS_NONE
类型: GXF_PARAMETER_TYPE_INT32
signaler_device_id(信号发送者设备 ID)
Signaler 运行所在的设备 ID。
标志: GXF_PARAMETER_FLAGS_NONE
类型: GXF_PARAMETER_TYPE_INT32
waiter_device_id(等待者设备 ID)
Waiter 运行所在的设备 ID。
标志: GXF_PARAMETER_FLAGS_NONE
类型: GXF_PARAMETER_TYPE_INT32
GXF 流同步工作流程#
Cuda 到 Cuda codelet 的通信通过消息进行。
在 Signaler codelet 中#
将 StreamSync 句柄添加到消息。
获取 streamsync 句柄。
初始化 streamsync
基于 signaler 和 waiter 分配同步对象
为 signaler 和 waiter 设置 CUDA 流
在 CUDA 流上提交 signaler codelet 的工作。
信号量信令 (异步调用)
发布消息
在 Waiter codelet 中#
接收消息
查找 streamsync 句柄
等待信号量 (异步调用)
在 CUDA 流上提交 waiter codelet 的工作。
现在等待将在 GPU 上异步发生
示例#
以下示例描述了如何在应用程序中使用 GXF 流同步。
Yaml 文件#
1---
2name: global
3components:
4- name: cuda_dot_pool
5 type: nvidia::gxf::BlockMemoryPool
6 parameters:
7 storage_type: 1 # cuda
8 block_size: 16384
9 num_blocks: 10
10- name: stream_sync_cuda_to_cuda
11type: nvidia::gxf::StreamSync
12parameters:
13 signaler: 1 # Cuda signaler
14 waiter: 3 # Cuda waiter
15---
16name: stream_tensor_generator
17components:
18- name: cuda_out
19type: nvidia::gxf::DoubleBufferTransmitter
20- name: generator
21type: nvidia::gxf::stream::test::StreamTensorGeneratorNew
22parameters:
23 cuda_tx: cuda_out
24 cuda_tensor_pool: global/cuda_pool
25 stream_sync: global/stream_sync_cuda_to_cuda
26- type: nvidia::gxf::DownstreamReceptiveSchedulingTerm
27parameters:
28 transmitter: cuda_out
29 min_size: 1
30- type: nvidia::gxf::CountSchedulingTerm
31parameters:
32 count: 50
33---
34components:
35- type: nvidia::gxf::Connection
36parameters:
37 source: stream_tensor_generator/cuda_out
38 target: cuda_dotproduct/rx
39---
40name: cuda_dotproduct
41components:
42- name: rx
43type: nvidia::gxf::DoubleBufferReceiver
44parameters:
45 capacity: 2
46- name: tx
47type: nvidia::gxf::DoubleBufferTransmitter
48- type: nvidia::gxf::MessageAvailableSchedulingTerm
49parameters:
50 receiver: rx
51 min_size: 1
52- type: nvidia::gxf::DownstreamReceptiveSchedulingTerm
53parameters:
54 transmitter: tx
55 min_size: 1
56- type: nvidia::gxf::stream::test::CublasDotProductNew
57parameters:
58 rx: rx
59 tx: tx
60 tensor_pool: global/cuda_dot_pool
61---