已关闭
[Documentation|文档反馈]:软件仿真的核间同步接口参数含义及组合使用约束说明不完整 #1847
GRJ_XIDUO创建于  23 天前关闭于  5 天前
GRJ_XIDUO
GRJ_XIDUO成员
23 天前 创建

Document Link(文档链接)

Issues Section(问题文档片段)

IBSet和IBWait

参数说明中将两个工作空间笼统描述为公共缓存:

gmWorkspace:外部存储核状态的公共缓存。
ubWorkspace:存储当前核状态的公共缓存。

blockIdx和eventID的说明为:

blockIdx:表示等待核的idx号,取值范围:[0,核数-1]。
eventID:用来控制当前核的set、wait事件。

约束说明中仅简单给出:

分离模式下,使用该接口进行两个核间的同步时,仅对AIV核生效。
IBSet接口的gmWorkspace缓存的值需要初始化为0。

InitDetermineComputeWorkspace

参数说明和初始化约束为:

gmWorkspace:临时空间,初始化核间同步的共享内存。
ubWorkspace:临时空间,用于操作gmWorkspace。
与IBSet/SyncAll不同,该接口输入参数gmWorkspace缓存的值不需要初始化为0。

WaitPreBlock和NotifyNextBlock

参数说明将gmWorkspace和ubWorkspace统一描述为临时空间,约束中仅要求预先调用初始化接口:

使用接口前,请确保已经调用InitDetermineComputeWorkspace接口,初始化共享内存。

资料没有说明三个接口传入的gmWorkspace和ubWorkspace之间必须保持怎样的对应关系。

Existing Issues(存在的问题)

1. gmWorkspace和ubWorkspace的用途不明确

五个接口对工作空间使用“公共缓存”或“临时空间”等笼统且不统一的表述,未说明其存储位置和具体作用:

  • IBSet和IBWait的gmWorkspace位于Global Memory,由多个AIV共享,用于存储核间同步标志;ubWorkspace位于当前AIV的Unified Buffer,用于搬入、读取、修改同步标志,并在需要时将修改结果写回gmWorkspace。
  • 顺序执行接口的gmWorkspace用于保存多个AIV共享的核间顺序执行状态;ubWorkspace除暂存从Global Memory搬入或待写回的数据外,还保存当前AIV的同步轮次状态。

现有描述无法让开发者判断两块空间是否由各AIV共享、其中保存什么数据,以及接口对数据执行了读取还是写入操作。

2. IBSet和IBWait的blockIdx含义不准确

资料将blockIdx描述为“等待核的idx号”,容易被理解为调用IBWait的消费者索引。根据接口的同步标志寻址及样例用法,该参数实际表示同步标志对应的逻辑AIV索引,即被等待核(生产者、调用IBSet的核)的逻辑AIV索引;配对的IBSet和IBWait必须传入相同的blockIdx。

此外,合法索引范围由算子调用时设置的逻辑AI Core核数numBlocks和AIV配比决定,并不等于“实际参与本次同步的核数”。例如,使用__mix__(1, 2)修饰核函数且numBlocks为4时,逻辑AIV索引范围为[0, 7];即使本次同步只使用逻辑AIV 0和1,参数的合法范围仍不会缩小为[0, 1]。

3. eventID容易与SetFlag/WaitFlag的硬件事件ID混淆

IBSet和IBWait的形参名称同样为eventID,但它表示用于软件同步标志寻址的逻辑事件编号,与blockIdx共同区分同一对生产者和消费者之间的不同同步事件,不是SetFlag/WaitFlag硬件指令使用的核内流水同步事件ID。因此,SetFlag/WaitFlag中硬件事件ID的0-7取值限制不能直接套用到该参数。

现有资料既未说明两者的本质区别,也未说明该参数应使用非负整数并建议从0开始连续编号,容易导致开发者错误限制取值或误解同步机制。

4. 未充分说明AIC侧调用行为

在相关分离架构上,IBSet、IBWait、InitDetermineComputeWorkspace、WaitPreBlock和NotifyNextBlock的同步逻辑仅在AIV侧生效。在AIC中调用时,接口会直接结束,不会设置或等待同步标志,也不会初始化、通知或执行核间同步。

原版IBSet和IBWait资料只写“分离模式下,使用该接口进行两个核间的同步时,仅对AIV核生效”;原版WaitPreBlock和NotifyNextBlock资料将“仅对AIV核生效”与两个接口之间的指令限制写在同一条约束中;原版InitDetermineComputeWorkspace资料未说明AIC侧调用行为。五个页面均未明确说明AIC调用会直接结束以及各接口不会产生的具体效果,开发者可能误以为调用仍会建立AIC与AIV之间的同步关系。

5. IBSet和IBWait对gmWorkspace初始值的要求不够醒目

gmWorkspace中的核间同步标志必须在首次同步前初始化为0,但原约束位于列表末尾,且未说明违反约束的后果:

  • 初始值为1时,IBWait可能将残留值误判为生产者已经完成操作,从而提前结束等待并破坏同步顺序。
  • 初始值为其他非预期值时,IBSet和IBWait可能均无法满足退出条件而持续等待,导致程序卡死。

该要求会直接影响功能正确性,建议同时在gmWorkspace参数说明和约束说明开头强调。

6. InitDetermineComputeWorkspace对两个入参的初始化要求说明不完整

原版资料仅说明“该接口输入参数gmWorkspace缓存的值不需要初始化为0”,没有说明调用者是否需要预先初始化ubWorkspace,也没有说明接口内部会对两个入参执行什么初始化操作。根据实现,调用者不需要预先初始化gmWorkspace和ubWorkspace;接口会将gmWorkspace中的核间同步状态初始化为0,并将ubWorkspace中的同步轮次状态初始化为1。资料需要补充这两项实际行为,避免开发者自行初始化ubWorkspace或误判其中状态值的含义。

7. 三个顺序执行接口缺少共享同一组存储空间的约束

InitDetermineComputeWorkspace、WaitPreBlock和NotifyNextBlock组合使用时:

  • 三个接口的gmWorkspace必须指向同一块Global Memory。
  • 三个接口的ubWorkspace必须指向当前AIV上的同一块Unified Buffer,通常应向三个接口传入同一组变量。

WaitPreBlock需要从gmWorkspace读取初始化接口初始化或NotifyNextBlock写入的核间同步状态;NotifyNextBlock需要从ubWorkspace读取初始化接口设置或前一次NotifyNextBlock更新的同步轮次状态。如果传入不同的存储空间,接口之间无法共享完整状态,可能导致执行顺序错误或程序卡死。

建议在三个接口页面中使用一致的文字说明该组合使用约束,保证任意一个接口页面都可以独立提供完整信息。

likedislike
GRJ_XIDUOGRJ_XIDUO成员
23 天前 添加了label:documentation
GRJ_XIDUOGRJ_XIDUO成员
23 天前 将 GRJ_XIDUO 设为负责人
GRJ_XIDUOGRJ_XIDUO成员
23 天前 修改了issue 的描述
GRJ_XIDUOGRJ_XIDUO成员
23 天前 修改了issue 的描述
NUAA_wqyNUAA_wqy
21 天前 关联了pull request:[docs] 补全核间同步接口(IBSet/IBWait/InitDetermineComputeWorkspace/WaitPreBlock/NotifyNextBlock)的工作空间与参数说明
GRJ_XIDUO
GRJ_XIDUO成员
20 天前 评论:

您好,感谢反馈文档问题。

已确认上述资料问题都需修改描述,预计于2026年10月9日前完成修复。

likedislike
GRJ_XIDUOGRJ_XIDUO成员
19 天前 删除了关联的pull request:修正核间同步软件同步接口资料说明
GRJ_XIDUOGRJ_XIDUO成员
18 天前 关联了pull request:修正核间同步软件同步接口资料说明
GRJ_XIDUO
GRJ_XIDUO成员
14 天前 评论:

您好,修复问题的PR已合入:
https://gitcode.com/cann/asc-devkit/pull/6590

likedislike
GRJ_XIDUOGRJ_XIDUO成员
14 天前 issue状态由 进行中 改变为 已完成
GRJ_XIDUOGRJ_XIDUO成员
14 天前 关闭了 issue
GRJ_XIDUOGRJ_XIDUO成员
14 天前 issue状态由 已完成 改变为 进行中
GRJ_XIDUOGRJ_XIDUO成员
14 天前 重新打开了 issue
GRJ_XIDUOGRJ_XIDUO成员
5 天前 issue状态由 进行中 改变为 已完成
GRJ_XIDUOGRJ_XIDUO成员
5 天前 关闭了 issue