1_ipcevent_multi_device
描述
本样例展示了在多个Device上通过 IPC Event 进行跨进程任务同步。
- 生产者进程(proc_a):运行在Device 0上,创建一个IPC Event,记录事件并导出句柄到文件,然后等待所有消费者进程完成。
- 消费者进程(proc_b):运行在其他Device(如Device 1、Device 2...)上,每个消费者读取事件句柄,打开事件,在Stream中等待该事件,然后记录事件并通知生产者。
通过这种方式,一个生产者可以同步多个运行在不同Device上的消费者,实现分布式任务协调。
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
编译运行
环境安装详情以及通用运行步骤请见 example 目录下的 README。
本样例至少需要 2 个可用 Device。run.sh 中 CONSUMER_NUM 默认配置为 1,表示生产者使用 Device 0,消费者使用 Device 1;如需启动更多消费者,请根据实际可用 Device 数量调整 CONSUMER_NUM。
CANN RUNTIME API
在该Sample中,涉及的关键功能点及其关键接口,如下所示:
- 初始化
- 调用
aclInit接口进行初始化配置。 - 调用
aclFinalize接口实现去初始化。
- 调用
- Device 管理
- 调用
aclrtSetDevice接口指定用于运算的 Device。 - 调用
aclrtResetDevice接口复位当前运算的 Device,回收 Device 上的资源。
- 调用
- Stream 管理
- 调用
aclrtCreateStream接口创建 Stream。 - 调用
aclrtSynchronizeStream接口阻塞等待 Stream 上的任务完成。 - 调用
aclrtDestroyStream接口销毁 Stream。
- 调用
- Event 管理
- 调用
aclrtCreateEventExWithFlag接口创建支持 IPC 的 Event。 - 调用
aclrtRecordEvent接口记录 Event。 - 调用
aclrtSynchronizeEvent接口阻塞等待 Event 完成。 - 调用
aclrtQueryEventStatus接口查询 Event 状态。 - 调用
aclrtIpcGetEventHandle接口获取 Event 的 IPC 句柄。 - 调用
aclrtIpcOpenEventHandle接口打开 IPC Event。 - 调用
aclrtStreamWaitEvent接口阻塞 Stream,等待 Event 完成。 - 调用
aclrtDestroyEvent接口销毁 Event。
- 调用
示例输出
[INFO] Starting producer on device 0, waiting for 1 consumer(s)...
[INFO] Starting consumer 1 on device 1
[INFO] Consumer 1: IPC event opened on device 1
[INFO] Consumer 1: event received, stream synchronized
[INFO] Consumer 1: event status = 1 (1=completed)
[INFO] Consumer 1 (device 1) finished successfully.
[INFO] Producer: IPC event created on device 0
[INFO] Producer: event status = 1 (1=completed)
[INFO] All 1 consumers have finished.
[INFO] Producer: finished successfully.
[SUCCESS] IPC event multi-device synchronization works correctly.