已合并
修正核间同步gmWorkspace空间说明 #6616
修正核间同步gmWorkspace空间说明 #6616
已合并
GRJ_XIDUO创建于 22 天前
共 2 个文件变更+28-2
@@ -63,7 +63,20 @@ __aicore__ inline void IBSet(const GlobalTensor<int32_t>& gmWorkspace, const Loc
63 63 
64## 约束说明<a name="section633mcpsimp"></a>64## 约束说明<a name="section633mcpsimp"></a>
65 65 
66-- gmWorkspace申请的空间最少要求为:核数*32Bytes*eventID_max+blockIdx_max*32Bytes+32Bytes(eventID_max和blockIdx_max分别指eventID、blockIdx的最大值)。需要注意的是,如果是AIVOnly模式,核数=GetBlockNum();如果是MIX模式,核数=GetBlockNum()*2。66+- `gmWorkspace`申请的空间须满足以下公式:
67+ 
68+ $$
69+ \text{gmWorkspace空间大小} \geq (\mathrm{eventStride} \times \mathrm{eventID\_max} + \mathrm{blockIdx\_max} + 1) \times 32\text{字节}
70+ $$
71+ 
72+ - `eventID_max`和`blockIdx_max`分别表示共享同一`gmWorkspace`的所有IBSet和IBWait调用中,`eventID`和`blockIdx`可能取到的最大值。`blockIdx_max`不一定等于`blockIdx`合法范围的上限,例如`__mix__(1, 2)`修饰核函数且`numBlocks`为4时,`blockIdx`合法范围为`[0, 7]`;若共享同一`gmWorkspace`的所有调用中只使用`blockIdx = 0`和`blockIdx = 1`,则`blockIdx_max = 1`。
73+ - `eventStride`的取值与模板参数isAIVOnly有关:
74+ - 当`isAIVOnly`为true时,`eventStride = GetBlockNum()`;
75+ - 当`isAIVOnly`为false时,`eventStride = GetBlockNum() × 2`,与AIC:AIV的配比无关。
76+ 
77+ 以下以AIVOnly模式下的多事件同步场景为例,说明上述参数取值和`gmWorkspace`空间大小的计算方法。
78+ 
79+ AIVOnly模式下`GetBlockNum() = 4`,核0作为生产者分别通过`IBSet(sync_gm, sync_buf, 0, 0)`和`IBSet(sync_gm, sync_buf, 0, 1)`通知两个不同同步事件,核2作为生产者通过`IBSet(sync_gm, sync_buf, 2, 0)`通知另一个同步事件。对应的IBWait必须分别传入相同的`blockIdx`和`eventID`,例如`IBWait(sync_gm, sync_buf, 0, 1)`只能等待`IBSet(sync_gm, sync_buf, 0, 1)`设置的同步标志;如果误传为`blockIdx = 1`或`eventID = 0`,会访问另一处同步标志并可能卡死。该场景中`blockIdx_max = 2`、`eventID_max = 1`、`eventStride = 4`,因此`gmWorkspace`至少需要`(4 × 1 + 2 + 1) × 32 = 224`字节。
67- ubWorkspace申请的空间最少要求为:32Bytes。80- ubWorkspace申请的空间最少要求为:32Bytes。
68- 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致核函数(Kernel)“卡死”现象。81- 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致核函数(Kernel)“卡死”现象。
69- IBSet和IBWait配对使用时,除了ubWorkspace其余所有参数都必须相同,否则程序会在IBWait处卡死。82- IBSet和IBWait配对使用时,除了ubWorkspace其余所有参数都必须相同,否则程序会在IBWait处卡死。
@@ -63,7 +63,20 @@ __aicore__ inline void IBWait(const GlobalTensor<int32_t>& gmWorkspace, const Lo
63 63 
64## 约束说明<a name="section633mcpsimp"></a>64## 约束说明<a name="section633mcpsimp"></a>
65 65 
66-- gmWorkspace申请的空间最少要求为:核数*32Bytes*eventID_max+blockIdx_max*32Bytes+32Bytes(eventID_max和blockIdx_max分别指eventID、blockIdx的最大值)。需要注意的是,如果是AIVOnly模式,核数=GetBlockNum();如果是MIX模式,核数=GetBlockNum()*2。66+- `gmWorkspace`申请的空间须满足以下公式:
67+ 
68+ $$
69+ \text{gmWorkspace空间大小} \geq (\mathrm{eventStride} \times \mathrm{eventID\_max} + \mathrm{blockIdx\_max} + 1) \times 32\text{字节}
70+ $$
71+ 
72+ - `eventID_max`和`blockIdx_max`分别表示共享同一`gmWorkspace`的所有IBSet和IBWait调用中,`eventID`和`blockIdx`可能取到的最大值。`blockIdx_max`不一定等于`blockIdx`合法范围的上限,例如`__mix__(1, 2)`修饰核函数且`numBlocks`为4时,`blockIdx`合法范围为`[0, 7]`;若共享同一`gmWorkspace`的所有调用中只使用`blockIdx = 0`和`blockIdx = 1`,则`blockIdx_max = 1`。
73+ - `eventStride`的取值与模板参数isAIVOnly有关:
74+ - 当`isAIVOnly`为true时,`eventStride = GetBlockNum()`;
75+ - 当`isAIVOnly`为false时,`eventStride = GetBlockNum() × 2`,与AIC:AIV的配比无关。
76+ 
77+ 以下以AIVOnly模式下的多事件同步场景为例,说明上述参数取值和`gmWorkspace`空间大小的计算方法。
78+ 
79+ AIVOnly模式下`GetBlockNum() = 4`,核0作为生产者分别通过`IBSet(sync_gm, sync_buf, 0, 0)`和`IBSet(sync_gm, sync_buf, 0, 1)`通知两个不同同步事件,核2作为生产者通过`IBSet(sync_gm, sync_buf, 2, 0)`通知另一个同步事件。对应的IBWait必须分别传入相同的`blockIdx`和`eventID`,例如`IBWait(sync_gm, sync_buf, 0, 1)`只能等待`IBSet(sync_gm, sync_buf, 0, 1)`设置的同步标志;如果误传为`blockIdx = 1`或`eventID = 0`,会访问另一处同步标志并可能卡死。该场景中`blockIdx_max = 2`、`eventID_max = 1`、`eventStride = 4`,因此`gmWorkspace`至少需要`(4 × 1 + 2 + 1) × 32 = 224`字节。
67- ubWorkspace申请的空间最少要求为:32Bytes。80- ubWorkspace申请的空间最少要求为:32Bytes。
68- 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致核函数(Kernel)“卡死”现象。81- 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致核函数(Kernel)“卡死”现象。
69- IBSet和IBWait配对使用时,除了ubWorkspace其余所有参数都必须相同,否则程序会在IBWait处卡死。82- IBSet和IBWait配对使用时,除了ubWorkspace其余所有参数都必须相同,否则程序会在IBWait处卡死。