# autoGemm **Repository Path**: seeventh/auto-gemm ## Basic Information - **Project Name**: autoGemm - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-25 - **Last Updated**: 2026-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AutoGEMM 面向 ARM SVE 架构的高性能 GEMM(矩阵乘法)自动优化框架。 基于 [SC2024 论文](docs/TVM_GEMM_SC2024.pdf) 实现,支持多种 SVE 向量长度(128-bit、256-bit、512-bit)。 ## 项目目标 1. **SVE 优化**:实现 autoGEMM 的 SVE 优化,支持工程化运行 2. **Micro-kernel 生成**:自动生成高性能的 SVE kernel 代码 3. **批量测试**:完整 benchmark 测试框架 4. **DMT 调度**:高效的动态矩阵分块调度算法(计划中) ## 环境要求 - **操作系统**:Linux (ARM64) - **编译器**:GCC 10+ (支持 SVE 指令集) - **Python**:Python 3.x ## 快速开始 ### 1. 指令测试 验证 SVE 指令正确性,显示硬件信息: ```bash cd src export CXX=g++ ./test_all.sh inst ``` 输出示例: ``` === SVE Hardware Information === Vector Length: 128 bits (16 bytes) Float32 elements per vector: 4 SVE supported: Yes SVE2 supported: Yes ``` ### 2. 单个 Kernel 测试 ```bash cd src # 自动检测 SVE 向量长度 ./build.sh 16 16 16 # 指定 SIMD_LANE (16 = 512-bit SVE) ./build.sh 16 16 16 8 4 1000 16 ``` ### 3. 批量 Kernel 测试 ```bash cd src # 完整测试(生成所有有效 tile sizes) ./run_full_benchmark.sh # 快速测试(只测试推荐的 tile sizes) ./run_full_benchmark.sh --quick ``` ## 目录结构 ``` auto-gemm/ ├── src/ │ ├── generators/ # Kernel 生成脚本 │ │ ├── make_c_file_asm_sve.py # SVE kernel 生成器 │ │ ├── make_c_file_asm_neon.py # NEON kernel 生成器 │ │ ├── generate_and_benchmark.py # 批量生成和测试脚本 │ │ ├── generate_all_kernels.py # 批量生成脚本 │ │ └── generate_kernels.sh # Shell 批量生成脚本 │ ├── scripts/ # 运行脚本 │ │ ├── build.sh # 编译脚本 │ │ ├── test_all.sh # 主测试脚本 │ │ ├── run_full_benchmark.sh # 完整 benchmark 脚本 │ │ ├── test_kernel.sh # Kernel 测试脚本 │ │ └── test_instructions.sh # 指令测试脚本 │ ├── tests/ # 测试代码 │ │ ├── test_sve_instructions.cpp # SVE 指令测试 │ │ ├── test_sve_store.cpp # SVE 存储测试 │ │ └── test_perf_model.py # 性能模型测试 │ ├── include/ # 头文件 │ │ ├── test.h # 测试工具 │ │ └── timer.h # 计时器 │ ├── models/ # 性能模型 │ │ └── perf_model.py # 性能预测模型 │ ├── Makefile # 构建配置 │ └── .gitignore ├── autoGemm/ # 参考实现 (submodule) └── docs/ └── TVM_GEMM_SC2024.pdf # 参考论文 ``` ## 参数说明 ### Kernel 生成参数 | 参数 | 说明 | 默认值 | |------|------|--------| | M | 矩阵 A 的行数 | 16 | | N | 矩阵 B 的列数 | 16 | | K | 矩阵 A 的列数 / 矩阵 B 的行数 | 16 | | UNROLL_K | K 维度展开因子 | 8 | | NR | 寄存器数量参数 | 4 | | REPEAT | 性能测试重复次数 | 1000 | | SIMD_LANE | 向量元素数量 | 自动检测 | ### SIMD_LANE 配置 | SVE 向量长度 | SIMD_LANE | 适用硬件 | |-------------|-----------|----------| | 128-bit | 4 | NEON 兼容 | | 256-bit | 8 | 中等 SVE | | 512-bit | 16 | A64FX, Graviton3 | ## Micro-kernel 规格 ### 有效 Tile Sizes 根据论文 Table II 和 32 个向量寄存器约束: | mr | 有效 nr 值 | |----|-----------| | 8 | 4, 8, 12, 16 | | 7 | 4, 8, 12 | | 6 | 4, 8, 12, 16 | | 5 | 4, 8, 12, 16, 20 | | 4 | 4, 8, 12, 16, 20, 24 | | 3 | 4, 8, 12, 16, 20, 24, 28 | | 2 | 4, 8, 12, 16, 20, 24, 28 | **推荐的高 AI tile sizes**: 8×8, 6×12, 5×16, 4×20 ### 512-bit SVE 注意事项 对于 512-bit SVE (SIMD_LANE=16): - `nr` 必须是 16 的倍数:16, 32, 48... - 有效 tiles: 8×16, 6×16, 5×16, 4×16, 4×32 等 ## 测试脚本用法 ```bash # SVE 指令测试 ./test_all.sh inst # Kernel benchmark (默认 16x16x16) ./test_all.sh # 指定矩阵尺寸 ./test_all.sh 32 32 32 # 批量测试 ./test_all.sh batch # 完整 benchmark(生成所有 kernels) ./run_full_benchmark.sh # 快速测试(推荐 tiles) ./run_full_benchmark.sh --quick ``` ## 性能基准 ### 128-bit SVE (SIMD_LANE=4) | 矩阵尺寸 | GFLOPS | 正确性 | |---------|--------|--------| | 8×8×8 | 34.13 | ✅ | | 16×16×16 | 45.01 | ✅ | | 32×32×32 | 45.93 | ✅ | ### 512-bit SVE (SIMD_LANE=16) 待远程节点测试。 ## Benchmark 输出 运行 `./run_full_benchmark.sh` 后生成: ``` benchmark_kernels/ ├── gemm_8x8x8_sve128bit.cpp # 生成的 kernel 源码 ├── gemm_8x8x8_sve128bit # 编译后的二进制 ├── benchmark_results_sve128bit.json # 详细结果 (JSON) └── BENCHMARK_REPORT_sve128bit.md # 测试报告 (Markdown) ``` 报告示例: ``` | Kernel | mr | nr | kc | AI | GFLOPS | Latency(ms) | Status | |--------|----|----|----|----|--------|-------------|--------| | gemm_8x8x16 | 8 | 8 | 16 | 8.0 | 36.57 | 0.000056 | ✅ PASS | | gemm_5x16x16 | 5 | 16 | 16 | 7.62 | 33.25 | 0.000077 | ✅ PASS | ``` ## SVE 指令集 生成的代码使用以下 SVE 指令: | 指令 | 说明 | |------|------| | `ld1rw` | 广播加载标量到向量寄存器 | | `ld1w` | 向量加载 | | `fmla` | 融合乘加 (Fused Multiply-Add) | | `fmul` | 浮点乘法 | | `st1w` | 向量存储 | | `ptrue`/`whilelt` | 谓词寄存器设置 | | `prfm` | 预取指令 | ## 开发进展 详见 [PLAN.md](PLAN.md)。 ### 已完成 - [x] SVE kernel 正确性修复 - [x] SVE 指令测试套件 - [x] SVE 硬件信息显示 - [x] SIMD_LANE 参数动态配置 - [x] 批量 kernel 生成脚本 - [x] 完整 benchmark 测试框架 ### 当前性能策略 - 只关注单线程性能 - OpenBLAS 基线固定为单线程 - DMT 当前不再启用 OpenMP 并行执行路径 - `bench_runner.py` 会在运行前做一次轻量硬件微基准,并在最终汇总表输出 `Model Est`(耗时估计)和 `Model Upper`(roofline 上限)两列 ### 计划中 - [ ] DMT 动态微块调度算法 - [ ] TVM 集成 ## 参考资料 - [TVM GEMM SC2024 Paper](docs/TVM_GEMM_SC2024.pdf) - [autoGEMM 原项目](https://github.com/wudu98/autoGEMM) - [ARM SVE 文档](https://developer.arm.com/architectures/instruction-sets/instruction-set-extensions/sve) ## License 参考 [autoGEMM](https://github.com/wudu98/autoGEMM) 项目许可证。