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 的概念

GXF Stream sync

图:跨两个 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---