目录

InfiniCore MetaX 后端适配 —— 参赛文件包

参赛者:LindseyMei 目标仓库:InfiniTensor/InfiniCore GPU:MetaX C500 64GB + MACA 3.3.0.15 包生成日期:2026-07-01


一句话概述

本文件包统一整理了为 InfiniCore 算子库向 MetaX(沐曦)GPU 后端迁移的 4 个算子sigmoidquickgelusoftmaxlp_norm,以及一项 elementwise 模板向量化优化。四个算子均已在真机 C500 上完成编译、单测、精度对拍和性能测试,并分别提交独立 PR;向量化优化为共享 elementwise 模板增加 16 字节向量快路径,使 silu 等大张量性能提升 3–4 倍。


提交材料汇总

算子 / 优化 PR 状态 GitLink issue
sigmoid #1338 CLOSED(未合并) #214
quickgelu #1343 MERGED #216
softmax #1347 MERGED #218
lp_norm #1359 MERGED #220
elementwise 向量化 #1353 MERGED #219

说明:所有 PR 的 GitLink issue 均已创建,链接见上表。


技术路线

InfiniCore 算子按 src/infiniop/ops/<op>/<backend>/ 组织。四个算子原有 cpu/cuda/nvidia/ 后端,唯独缺 MetaX。本次补齐遵循统一模式:

  1. 直接复用已有 cuda/kernel.cuh 中的内核函子;
  2. 通过对应 MetaX 描述符模板接入 MetaX 后端;
  3. operator.cc 中增加 5 处 #ifdef ENABLE_METAX_API 设备分派;
  4. quickgelu 额外补充缺失的 test/infiniop/quickgelu.py 及 ctypes 注册;
  5. lp_norm 对共享 cuda/kernel.cuh 做最小 MACA 可移植性适配(CUDART_VERSION 分支排除 MetaX)。

没有使用 triton / ninetoothed(九齿),完全绕开本环境会失败的 AOT 编译;也无需改动 xmake 构建脚本(xmake/metax.lua 自动 glob ops/*/metax/*.maca)。

elementwise 向量化优化 则在共享 elementwise/metax/elementwise_metax.h 中增加 16 字节向量快路径,所有满足连续、对齐、同 dtype 的 127 个 elementwise 算子自动受益。


各算子详情

sigmoid

  • 类型:逐元素激活函数
  • 新增文件
    • src/infiniop/ops/sigmoid/metax/sigmoid_metax.h
    • src/infiniop/ops/sigmoid/metax/sigmoid_metax.maca
  • 修改文件src/infiniop/ops/sigmoid/operator.cc
  • 支持类型:BF16 / F16 / F32 / F64
  • 单测python3 test/infiniop/sigmoid.py --metaxTest passed!
  • 性能:详见 logs/sigmoid/PERFORMANCE.md

quickgelu

  • 类型:逐元素激活函数
  • 新增文件
    • src/infiniop/ops/quickgelu/metax/quickgelu_metax.h
    • src/infiniop/ops/quickgelu/metax/quickgelu_metax.maca
    • test/infiniop/quickgelu.py
  • 修改文件
    • src/infiniop/ops/quickgelu/operator.cc
    • src/infiniop/ops/quickgelu/cuda/kernel.cuh__nv_bfloat16cuda_bfloat16,提升可移植性)
    • src/infiniop/ops/quickgelu/nvidia/quickgelu_nvidia.cu(同步改用 cuda_bfloat16
    • test/infiniop/libinfiniop/op_register.py(注册 ctypes 绑定)
  • 支持类型:BF16 / F16 / F32 / F64
  • 单测python3 test/infiniop/quickgelu.py --metaxTest passed!
  • 性能:详见 logs/quickgelu/PERFORMANCE.md

softmax

  • 类型:归约算子(axis-wise)
  • 新增文件
    • src/infiniop/ops/softmax/metax/softmax_metax.h
    • src/infiniop/ops/softmax/metax/softmax_metax.maca
  • 修改文件src/infiniop/ops/softmax/operator.cc
  • 支持类型:BF16 / F16 / F32
  • 单测python3 test/infiniop/softmax.py --metaxTest passed!
  • 性能:详见 logs/softmax/PERFORMANCE.md

lp_norm

  • 类型:归约算子(p-范数归一化)
  • 新增文件
    • src/infiniop/ops/lp_norm/metax/lp_norm_metax.h
    • src/infiniop/ops/lp_norm/metax/lp_norm_metax.maca
  • 修改文件
    • src/infiniop/ops/lp_norm/operator.cc
    • src/infiniop/ops/lp_norm/cuda/kernel.cuh(MetaX 可移植性适配)
  • 支持类型:BF16 / F16 / F32
  • 单测python3 test/infiniop/lp_norm.py --metaxTest passed!
  • 性能:详见 docs/lp_norm_PERF.md

elementwise 向量化优化

  • 类型:共享 elementwise 模板性能优化
  • 修改文件src/infiniop/elementwise/metax/elementwise_metax.h
  • 效果:silu 大张量 F16 从 ~64 Gelem/s 提升至 ~244 Gelem/s(约 3.8×),F32 从 ~59 Gelem/s 提升至 ~177 Gelem/s(约 3.0×)
  • 回归测试silu/add/mul/reciprocal/gelu/swiglu/clip 均通过
  • 性能报告docs/elementwise_vec_PERF.md
  • 设计文档docs/vectorization_plan.md

公共验证结果

检查项 sigmoid quickgelu softmax lp_norm elementwise vec
编译通过(xmake -y -j4
安装成功(xmake install -y
单测/回归通过(--metax ✅ Test passed! ✅ Test passed! ✅ Test passed! ✅ Test passed! ✅ silu/add/mul/…
clang-format 合规
真机环境 MetaX C500 / MACA 3.3.0.15 MetaX C500 / MACA 3.3.0.15 MetaX C500 / MACA 3.3.0.15 MetaX C500 / MACA 3.3.0.15 MetaX C500 / MACA 3.3.0.15

性能数据总览

所有性能数据均采用独立脚本 + 显式 torch.cuda.synchronize() 计时,避免 harness 计时不同步导致的异常数值。

sigmoid(逐元素,大张量 out-of-place)

Shape Elements dtype lib (ms) torch (ms) lib/torch lib 带宽 (GB/s)
16384² 268.4M F16 4.218 1.179 3.58× 255
16384² 268.4M F32 4.582 1.442 3.18× 469
16384² 268.4M BF16 4.212 1.289 3.27× 255

详见 logs/sigmoid/PERFORMANCE.md

quickgelu(逐元素,大张量 out-of-place)

Shape Elements dtype lib (ms) torch (ms) lib/torch lib 带宽 (GB/s)
16384² 268.4M F16 4.212 2.955 1.43× 255
16384² 268.4M F32 4.571 5.045 0.91× 470
16384² 268.4M BF16 4.211 3.069 1.37× 255

详见 logs/quickgelu/PERFORMANCE.md

softmax(沿 axis=1,out-of-place)

Shape rows dimsize dtype lib (ms) torch (ms) lib/torch lib 带宽 (GB/s)
4096² 4096 4096 F16 0.274 0.065 4.21× 245
4096² 4096 4096 F32 0.274 0.101 2.72× 489
16384² 16384 16384 F16 2.747 0.733 3.75× 391
16384² 16384 16384 F32 2.907 2.919 1.00× 739
16384² 16384 16384 BF16 2.946 0.773 3.81× 364

详见 logs/softmax/PERFORMANCE.md

lp_norm(沿 axis=-1 或 axis=3,out-of-place)

Shape axis p dtype lib (ms) lib 吞吐 (Gelem/s) lib 带宽 (GB/s)
16384² -1 2 F16 5.570 48.19 192.8
16384² -1 2 F32 5.714 46.98 375.8
16384² -1 2 BF16 5.847 45.91 183.6
(12, 16, 512, 512) 3 2 F32 1.224 41.13 329.0

详见 docs/lp_norm_PERF.md

elementwise 向量化(silu,连续对齐大张量)

Shape dtype 标量 (Gelem/s) 向量 (Gelem/s) speedup
16384² F16 63.79 243.98 3.82×
16384² F32 58.94 177.01 3.00×
16384² BF16 63.77 215.44 3.38×

详见 docs/elementwise_vec_PERF.md


关键发现

  1. 功能正确:四个算子均通过完整单测,与 torch 对拍一致;向量化优化通过 silu/add/mul/reciprocal/gelu/swiglu/clip 等回归测试。
  2. 真实可用吞吐
    • 逐元素算子 sigmoid / quickgelu 大张量 ~58–64 G元素/秒;
    • softmax ~61–98 G元素/秒(随 dimsize 增大而提升);
    • lp_norm ~46–48 G元素/秒(归约型,带宽受限);
    • 向量化后 silu 达 ~177–244 G元素/秒,提升 3–4 倍。
  3. F16/BF16 共性瓶颈:未向量化的逐元素算子受通用模板标量访存影响,F16/BF16 带宽约为 torch 的 30–70%;softmax / lp_norm 因额外归约开销更低。向量化优化显著缓解了该问题。
  4. F32 表现更好:数据宽度 4 字节,已接近带宽上限;quickgelu 因计算更重甚至略快于 torch,softmax 在最大 dimsize 下与 torch 持平,lp_norm F32 达 ~375 GB/s。
  5. 完整数据与各算子详细分析见 logs/<op>/PERFORMANCE.mddocs/lp_norm_PERF.mddocs/elementwise_vec_PERF.md
InfiniCore-Metax-Contributions/
├── LINKS.md                          # 所有 PR / issue 链接汇总
├── README.md                         # 本文件
├── patch/                            # 可 git apply 的改动 patch
│   ├── feat-metax-sigmoid.patch
│   ├── feat-metax-quickgelu.patch
│   ├── feat-metax-softmax.patch
│   └── lp_norm_metax.patch
├── src/                              # 各算子改动源文件
│   ├── sigmoid/
│   │   ├── sigmoid_metax.h
│   │   ├── sigmoid_metax.maca
│   │   └── operator.cc
│   ├── quickgelu/
│   │   ├── quickgelu_metax.h
│   │   ├── quickgelu_metax.maca
│   │   ├── operator.cc
│   │   ├── kernel.cuh
│   │   ├── quickgelu_nvidia.cu
│   │   └── op_register.py
│   ├── softmax/
│   │   ├── softmax_metax.h
│   │   ├── softmax_metax.maca
│   │   └── operator.cc
│   └── lp_norm/
│       ├── lp_norm_metax.h
│       ├── lp_norm_metax.maca
│       ├── kernel.cuh
│       └── operator.cc
├── test/                             # 测试脚本
│   ├── quickgelu.py
│   └── lp_norm.py
├── bench/                            # 性能测试脚本
│   ├── sigmoid_bench.py
│   ├── torch_sigmoid_baseline.py
│   ├── quickgelu_bench.py
│   ├── softmax_bench.py
│   ├── torch_softmax_baseline.py
│   ├── lp_norm_bench.py
│   └── vec_bench.py
├── logs/                             # 单测/性能原始日志与报告
│   ├── sigmoid/
│   │   ├── PERFORMANCE.md
│   │   ├── sigmoid_test.log
│   │   ├── sigmoid_perf_large.csv
│   │   ├── sigmoid_profile_raw.log
│   │   ├── sigmoid_bench_large_raw.log
│   │   └── torch_baseline_raw.log
│   ├── quickgelu/
│   │   ├── PERFORMANCE.md
│   │   ├── test.log
│   │   ├── quickgelu_perf_large.csv
│   │   ├── 04_profile.log
│   │   ├── 05_bench_large.log
│   │   └── 06_torch_baseline.log
│   ├── softmax/
│   │   ├── PERFORMANCE.md
│   │   ├── softmax_perf_large.csv
│   │   ├── 10_test_softmax.log
│   │   ├── 11_profile_softmax.log
│   │   ├── 12_torch_softmax_baseline.log
│   │   └── 13_softmax_bench.log
│   └── 11_build_lp_norm.log
└── docs/                             # 方案、进度、GitLink issue 草稿
    ├── PROGRESS.md
    ├── 竞赛工作方案.md
    ├── vectorization_plan.md
    ├── elementwise_vec_PERF.md
    ├── lp_norm_PERF.md
    ├── gitlink_issue_1353_draft.md
    ├── gitlink_issue_1359_draft.md
    ├── GPUApps_issue_sigmoid.md
    ├── GPUApps_issue_quickgelu.md
    ├── GPUApps_issue_softmax.md
    ├── GPUApps_issue_lp_norm.md
    └── GPUApps_issue_elementwise_vec.md

复现方法

cd /data/workspace/InfiniCore
source /data/workspace/env_infinicore.sh

# 编译(必须 -j4 + 后台,否则 128 并行 mxcc 会 OOM)
nohup xmake -y -j4 > build.log 2>&1 &
xmake install -y

# 单测
python3 test/infiniop/sigmoid.py --metax
python3 test/infiniop/quickgelu.py --metax
python3 test/infiniop/softmax.py --metax
python3 test/infiniop/lp_norm.py --metax

# 性能测试(在 bench/ 目录)
PYTHONPATH=/data/workspace/InfiniCore/test/infiniop:$PYTHONPATH python3 bench/sigmoid_bench.py --profile --metax
PYTHONPATH=/data/workspace/InfiniCore/test/infiniop:$PYTHONPATH python3 bench/quickgelu_bench.py --profile --metax
PYTHONPATH=/data/workspace/InfiniCore/test/infiniop:$PYTHONPATH python3 bench/softmax_bench.py
PYTHONPATH=/data/workspace/InfiniCore/test/infiniop:$PYTHONPATH python3 bench/lp_norm_bench.py
PYTHONPATH=/data/workspace/InfiniCore/test/infiniop:$PYTHONPATH python3 bench/vec_bench.py
python3 bench/torch_sigmoid_baseline.py
python3 bench/torch_softmax_baseline.py
关于
694.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号