已关闭
[Documentation|文档反馈]: 【开源内测】文档描述和样例代码,不一致。 #1430
gcw_zW7Qh4Jp创建于  8月5日关闭于  8月25日
gcw_zW7Qh4Jp
8月5日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

Document Link(文档链接)

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/programug/Ascendcopdevg/docs/guide/算子实践参考/SIMD算子实现/矩阵编程(高阶API)/算子实现.md

Issues Section(问题文档片段)

image.png
image.png

Existing Issues(存在的问题)

上述截图中的代码,和文中给出的样例链接中的代码差距非常大,或者说完全不一致。
样例源码中的mm.SetTensorA和 mm.IterateAll函数,都需要调用GetBlockIdx()获取core id,从而根据core id 设置矩阵的地址偏移。而文中却没有任何相关的描述。
两者不一致,会让读者很迷惑,不知哪一个做法是正确的做法。请确认后修改,注意保持两者一致。

附录:
样例代码链接和kernel侧代码如下:
https://gitcode.com/cann/asc-devkit/blob/9.1.0/examples/01_simd_cpp_api/00_introduction/02_matrix/matmul_advanced_api/matmul_advanced_api.asc
// SetTensorA/SetTensorB设置当前核参与计算的A、B矩阵起始地址,第二个参数false表示不转置。
// SetTensorA接口要求A地址空间至少覆盖singleM * singleK。本样例中GetTiling得到的tiling结果按M轴分2个核:
// - A偏移 = blockIdx * singleCoreM * Ka,表示跳过前面核已经处理的A矩阵行;
// - B不按M轴分核,两个核都需要完整B矩阵参与K轴累加,因此从bGlobal[0]开始读取。
mm.SetTensorA(aGlobal[GetBlockIdx() * tiling.singleCoreM * tiling.Ka], false);
mm.SetTensorB(bGlobal[0], false);
// IterateAll一次计算当前核负责的singleCoreM * singleCoreN大小的C矩阵块。
// 本样例输出C按[M, N]连续存放,当前核写回偏移为blockIdx * singleCoreM * N。
mm.IterateAll(cGlobal[GetBlockIdx() * tiling.singleCoreM * tiling.N]);
// End用于结束当前Matmul对象的使用并释放内部计算资源;后续如果还有其他Matmul对象,
// 调用End可避免多个Matmul对象之间的资源冲突。

likedislike
pandengpandeng成员
8月5日 将 ca1kw 设为负责人
ca1kw
ca1kw成员
8月5日 评论:

您好,对于该问题正在积极确认修改~

likedislike
ca1kwca1kw成员
8月24日 关联了pull request:修改高阶API算子实现资料
ca1kw
ca1kw成员
8月25日 评论:

您好,对于该问题已经提交pr修改,统一代码示例和样例中保持一致~pr已合入,issue将关闭,如有问题可以再次开启~

likedislike
ca1kwca1kw成员
8月25日 issue状态由 进行中 改变为 已完成
ca1kwca1kw成员
8月25日 关闭了 issue
CANN-robotCANN-robot成员
8月25日 添加了label:resolved