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);