| fix error offset in alltoallmm.
Co-authored-by: qq_43844249<fanglin17@huawei.com>
# message auto-generated for no-merge-commit merge:
!6131 merge fix-bug-alltoallmm into master
fix error offset in alltoallmm.
Created-by: qq_43844249
Commit-by: qq_43844249
Merged-by: cann-robot
Description: ## 描述
<!--在这里详细描述你的改动,包括改动的原因和所采取的方法。-->
# 代码检视报告
## 检视概要
| 统计项 | 数值 |
| ------ | ---- |
| **分支名称** | fix-bug-alltoallmm |
| **提交哈希** | c6adcb86feb3a585f7ec0090cc1ded7f85d2f197 |
| **提交信息** | fix error offset. |
| **变更文件** | 1 个 |
| **变更行数** | 1 行(+1, -1) |
| **检视条款** | 17 条(TOPK 5 条 + CPP-SECURE 12 条) |
| **发现问题** | 0 个(变更部分通过检视) |
| **潜在风险** | 2 个(需人工确认) |
**核心结论**:本次提交修复了 ProcessTail 函数中 x1ScaleOffset 计算错误,从使用 tileM 改为使用 tailM,修复逻辑正确。代码整体符合安全编码规范,TOPK 问题清单中未发现明显违规。
---
## TOPK 问题清单检视结果
### TOPK-3: 生命周期内使用局部变量指针,避免野指针 [适用: All]
**检视结果**:✅ 通过
**分析**:代码中无局部变量指针返回问题,所有指针均在作用域内有效使用。
---
### TOPK-6: 必须考虑nan/inf/+0/-0等特殊值和边界值处理 [适用: All]
**检视结果**:✅ 通过
**分析**:本次变更代码主要为地址偏移计算(整数乘法),不涉及浮点运算或特殊值处理场景。
---
### TOPK-8: gm内存偏移或大小必须用int64表示 [适用: All]
**检视结果**:✅ 通过
**分析**:变更代码(第 269 行)使用 uint64_t 进行偏移计算:
```cpp
pipeLineContext_.computationContext->additionalData.x1ScaleOffset =
static_cast<uint64_t>(mc2Tiling_.tailM) * tempScaleKBytes;
```
符合规范要求,防止大地址空间溢出。
---
### TOPK-10: 可整数计算时不允许转浮点数计算 [适用: All]
**检视结果**:✅ 通过
**分析**:代码中全部使用整数类型进行偏移计算,无不必要的浮点转换。
---
### TOPK-12: 宏定义中临时变量命名不能和外部变量冲突 [适用: All]
**检视结果**:✅ 通过
**分析**:代码中无宏定义,不存在此风险。
---
## C++ 安全编码规范检视结果
### CPP-SECURE-2.1: 有符号整数运算不溢出 [适用: All]
**检视结果**:✅ 通过
**分析**:代码中使用 uint64_t 进行乘法运算(第 235-236 行、第 255-256 行),防止溢出:
```cpp
uint64_t tailMMultiRankK = static_cast<uint64_t>(mc2Tiling_.tailM) * rankForComm_;
uint64_t tileCntMultitileMMultiRankK =
static_cast<uint64_t>(mc2Tiling_.tileCnt) * static_cast<uint64_t>(mc2Tiling_.tileM) * rankForComm_;
```
---
### CPP-SECURE-2.3: 除法/余数运算除零保护 [适用: All]
**检视结果**:✅ 通过
**分析**:CeilDiv 函数(第 21-27 行)有除零保护:
```cpp
template <typename T1, typename T2>
__aicore__ inline T1 CeilDiv(T1 a, T2 b)
{
if (b == 0) {
return 0;
}
return (a + b - 1) / b;
}
```
---
### CPP-SECURE-3.5: 指针使用前判空 [适用: All]
**检视结果**:✅ 通过
**分析**:Process 函数(第 114-122 行)有指针判空保护:
```cpp
if (pipeLine_ == nullptr || tilingData_ == nullptr) {
return;
}
if (mc2Tiling_.rankDim == 0) {
return;
}
```
---
### 其他条款检视结果
| 规范编号 | 规范名称 | 检视结果 | 说明 |
| -------- | -------- | -------- | ---- |
| 1.1 | 保证静态类型安全 | ✅ 通过 | 使用正确的类型转换 |
| 1.2 | 保证内存安全 | ✅ 通过 | 无内存越界访问 |
| 1.3 | 禁止使用未定义行为 | ✅ 通过 | 无 UB 操作 |
| 2.2 | 无符号整数运算不回绕 | ✅ 通过 | 使用 uint64_t 防止回绕 |
| 3.1 | 禁止使用未初始化的变量 | ✅ 通过 | 成员变量在 Init 中初始化 |
| 3.3 | 数组索引校验 | ✅ 通过 | 无数组索引访问 |
| 4.1 | 外部输入合法性校验 | ✅ 通过 | TilingData 已校验 |
| 4.2 | 内存操作长度校验 | ✅ 通过 | 偏移量计算安全 |
| 10.10 | 敏感信息使用后清零 | ✅ 通过 | 无敏感信息处理 |
---
## 变更代码正确性分析
### 变更内容
**修改前**:
```cpp
pipeLineContext_.computationContext->additionalData.x1ScaleOffset =
static_cast<uint64_t>(mc2Tiling_.tileM) * tempScaleKBytes;
```
**修改后**:
```cpp
pipeLineContext_.computationContext->additionalData.x1ScaleOffset =
static_cast<uint64_t>(mc2Tiling_.tailM) * tempScaleKBytes;
```
### 修复逻辑分析
**ProcessTile 函数(主块处理)**:使用 tileM 计算 x1ScaleOffset(第 217-223 行)
**ProcessTail 函数(尾块处理)**:应使用 tailM 计算 x1ScaleOffset
**修复原因**:
- tileM 表示主块的 M 维度大小
- tailM 表示尾块的 M 维度大小
- ProcessTail 处理尾块,应使用尾块的参数计算偏移
**修复正确性**:✅ 修复逻辑正确
---
## 潜在风险提示(需人工确认)
### 风险1:x1Scale 起始地址计算一致性
**位置**:第 266-267 行
```cpp
pipeLineContext_.computationContext->additionalData.x1Scale =
transX1ScaleGM1_ + mc2Tiling_.tileCnt * mc2Tiling_.tileM * tempScaleKBytes;
```
**风险描述**:
此处使用 tileCnt * tileM 计算 x1Scale 的起始偏移(表示所有主块的总大小),而 x1ScaleOffset 使用 tailM(表示尾块的大小)。需确认:
1. transX1ScaleGM1_ 的数据布局是否为主块数据连续排列,尾块数据紧随其后?
2. 如果尾块数据布局与主块不同,x1Scale 的起始地址计算是否需要调整?
**严重级别**:Suggestion(建议)
**建议**:人工确认 transX1ScaleGM1_ 的内存布局设计,确保 ProcessTail 的地址计算与实际数据布局一致。
---
### 风险2:cGM 输出地址计算一致性
**位置**:第 261 行
```cpp
pipeLineContext_.computationContext->baseData.cGM =
y_ + static_cast<uint64_t>(mc2Tiling_.tileCnt) * mc2Tiling_.tileM * mc2Tiling_.rankN * sizeof(DTYPE_Y);
```
**风险描述**:
此处使用 tileCnt * tileM 计算输出矩阵 Y 的起始偏移,需确认:
1. 输出矩阵 Y 的布局是否为主块数据在前,尾块数据在后?
2. 与 x1Scale 的地址计算是否保持一致的布局逻辑?
**严重级别**:Suggestion(建议)
**建议**:人工确认 Y 矩阵的内存布局,确保 ProcessTail 的地址计算正确。
---
## 总结与建议
### 整体评价
本次提交是一个正确的 bug 修复,解决了 ProcessTail 函数中 x1ScaleOffset 计算使用错误参数(tileM 应为 tailM)的问题。代码整体符合 TOPK 问题清单和 C++ 安全编码规范,未发现严重安全风险。
### 改进建议
1. **代码审查建议**:
- 人工确认 transX1ScaleGM1_ 和 Y 矩阵的内存布局设计,确保 ProcessTail 的所有地址计算与实际数据布局一致
- 建议在代码注释中说明数据布局设计,提高可维护性
2. **后续测试建议**:
- 增加边界值测试用例(如 tailM 较小、tileCnt 较大等场景)
- 验证修复后的算子输出精度和功能正确性
### 核间同步说明
根据用户提供的信息,调用的 process 代码已经保证了同步,不需要添加 AscendC::SyncAll() 等同步机制。因此 TOPK-11(通信算子融合需核间同步)不适用本次检视。
---
**报告生成时间**:2026-05-30
**报告状态**:已完成检视,建议人工确认潜在风险
## 关联的Issue
<!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000-->
<!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。-->
## 测试
<!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。-->
## 文档更新
<!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。-->
## 类型标签
<!-- [x] 表示选中 -->
- [x] 🐛 Bug 修复
- [ ] ✨ 新特性
- [ ] ⚡ 性能优化
- [ ] ♻️ 重构
- [ ] 🧪 测试
- [ ] 📦 构建/CI
- [ ] 🔧 配置变更
- [ ] 📝 文档更新
- [ ] ⬆️ 依赖升级
- [ ] 🔒 安全修复
- [ ] 🧹 代码清理
- [ ] ❓ 其他,请描述:
See merge request: cann/ops-transformer!6131 | 3 天前 |