文件最后提交记录最后更新时间
【task】更新license Co-authored-by: yuantao<taoyuan15@h-partners.com> # message auto-generated for no-merge-commit merge: !399 merge master into master 【task】更新license Created-by: yuantao_ Commit-by: yuantao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> ## 原因 <!--说明此次改动的目的、解决的问题等,应与类型标签匹配 --> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/catlass!3995 个月前
[bugfix]文档低错整改以及images目录更新为figures Co-authored-by: sunhao_hw<sunhao203@huawei.com> # message auto-generated for no-merge-commit merge: !517 merge docs into master [bugfix]文档低错整改以及images目录更新为figures Created-by: sunhao_hw Commit-by: sunhao_hw Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 按照开源规范,将docs/images目录更名为docs/figures目录。并进行低错整改 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> ## 原因 <!--说明此次改动的目的、解决的问题等,应与类型标签匹配 --> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/catlass!5172 个月前
【task】更新license Co-authored-by: yuantao<taoyuan15@h-partners.com> # message auto-generated for no-merge-commit merge: !399 merge master into master 【task】更新license Created-by: yuantao_ Commit-by: yuantao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> ## 原因 <!--说明此次改动的目的、解决的问题等,应与类型标签匹配 --> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/catlass!3995 个月前
README.md

OptimizedMatmul Example Readme

代码组织

├── 06_optimized_matmul
│   ├── CMakeLists.txt     # CMake编译文件
│   ├── README.md
│   └── optimized_matmul.cpp # 主文件

功能介绍

matmul矩阵乘,相比00_basic_matmul样例替换dispatchPolicy为MmadAtlasA2Preload,并增加输入矩阵的padding前处理,提升数据搬入性能。

使用示例

  • 获取代码之后编译相应的算子可执行文件,可参考quickstart
  • 执行算子
# 编译指定用例
bash scripts/build.sh 06_optimized_matmul
cd output/bin
# 可执行文件名 |矩阵m轴|n轴|k轴|Device ID
# Device ID可选,默认为0
./06_optimized_matmul 256 512 1024 0

执行结果如下,说明精度比对成功。

Compare success.

说明

样例里当前padding动作使用的是PADDING_NZ,也可以替换为PADDING_BLOCK_ND来测试性能表现

  • PADDING_NZ 代码位置如下
    constexpr PaddingTag paddingTagA = (std::is_same_v<LayoutA, layout::zN> || std::is_same_v<LayoutA, layout::nZ>)
                                           ? PaddingTag::NO_PADDING
                                           : PaddingTag::PADDING_NZ;
    constexpr PaddingTag paddingTagB = (std::is_same_v<LayoutB, layout::zN> || std::is_same_v<LayoutB, layout::nZ>)
                                           ? PaddingTag::NO_PADDING
                                           : PaddingTag::PADDING_NZ;

基于PADDING_NZ策略的UB上的COMPUTE_LENGTH为48KB

static const uint32_t COMPUTE_LENGTH_A = 48 * 1024 / sizeof(ElementA);
static const uint32_t COMPUTE_LENGTH_B = 48 * 1024 / sizeof(ElementB);
  • PADDING_BLOCK_ND 替换PADDING_BLOCK_ND的代码修改如下,当输入矩阵非NZ格式时使能,会将矩阵按照L1TileShape对齐来做padding
    constexpr PaddingTag paddingTagA = (std::is_same_v<LayoutA, layout::zN> || std::is_same_v<LayoutA, layout::nZ>)
                                           ? PaddingTag::NO_PADDING
-                                          : PaddingTag::PADDING_NZ;
+                                          : PaddingTag::PADDING_BLOCK_ND;
    constexpr PaddingTag paddingTagB = (std::is_same_v<LayoutB, layout::zN> || std::is_same_v<LayoutB, layout::nZ>)
                                           ? PaddingTag::NO_PADDING
-                                          : PaddingTag::PADDING_NZ;
+                                          : PaddingTag::PADDING_BLOCK_ND;

基于PADDING_BLOCK_ND策略的UB上的COMPUTE_LENGTH为96KB

-static const uint32_t COMPUTE_LENGTH_A = 48 * 1024 / sizeof(ElementA);
-static const uint32_t COMPUTE_LENGTH_B = 48 * 1024 / sizeof(ElementB);
+static const uint32_t COMPUTE_LENGTH_A = 96 * 1024 / sizeof(ElementA);
+static const uint32_t COMPUTE_LENGTH_B = 96 * 1024 / sizeof(ElementB);