Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/programug/Ascendcopdevg/docs/guide/算子实践参考/SIMD算子实现/矩阵编程(高阶API)/算子实现.md
上述截图中的代码,和文中给出的样例链接中的代码差距非常大,或者说完全不一致。 样例源码中的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对象之间的资源冲突。
您好,对于该问题正在积极确认修改~
您好,对于该问题已经提交pr修改,统一代码示例和样例中保持一致~pr已合入,issue将关闭,如有问题可以再次开启~
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(问题文档片段)
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对象之间的资源冲突。