跳转至

Ascend C 输出汇编

Vector 示例

typedef short __attribute__((address_space(6))) *ubptr;

void ascendc_vadd(ubptr dst, ubptr src0, ubptr src1) {
    __builtin_cce___vadd(dst, src0, src1, 0);
}

生成汇编:

./bisheng \
  -target hiipu64-hisilicon-cce \
  -Xclang -target-cpu \
  -Xclang dav-c220-vec \
  -O2 -S ascendc_vadd.c -o ascendc_vadd.s

关键输出:

MOV      X3, #0
MOVEMASK MASK[1], X3
MOVEMASK MASK[0], X3
MOV      X3, #257
MOVK     X3, #2049, #1
MOVK     X3, #2056, #2
VADD.s16 [X0], [X1], [X2], X3, MASK
RET

X3 不是简单的 repeat 数;它是由后端构造的打包配置。手写 Vector 指令时应保留或理解这段构造序列。

Cube 示例

typedef int __attribute__((address_space(5))) *l0cptr;
typedef signed char __attribute__((address_space(3))) *l0aptr;
typedef signed char __attribute__((address_space(4))) *l0bptr;

void cube_mmad(l0cptr dst, l0aptr a, l0bptr b) {
    __builtin_cce___mad(dst, a, b, 16, 16, 16, 0, 0);
}
./bisheng \
  -target hiipu64-hisilicon-cce \
  -Xclang -target-cpu \
  -Xclang dav-c220-cube \
  -O2 -S ascendc_mmad.c -o ascendc_mmad.s

关键输出:

MOV     X3, #16
MOVK    X3, #4097, #1
MMAD.s8 [X0], [X1], [X2], X3
RET

优化级别

选项 用途
-O0 -S 查看接近前端 lowering 的代码,便于定位 builtin
-O2 -S 查看实际优化后的指令和寄存器分配
-g -S 需要时保留调试相关汇编标记

建议先用 -O0 找到目标指令,再用最终优化级别重新检查。优化会改变配置值构造、循环、指令调度和同步序列。

查看编译阶段

添加 -v 可以查看驱动调用:

./bisheng -v \
  -target hiipu64-hisilicon-cce \
  -Xclang -target-cpu -Xclang dav-c220-vec \
  -O2 -S kernel.c -o kernel.s

builtin 使用原则

  • __builtin_cce_* 名称覆盖多个架构代际;名称存在不代表 c220 支持。
  • 以实际编译是否通过和最终 .s 为准。
  • MTE、Vector、Cube 的 repeat、stride、mask、shape 和同步参数优先交给 builtin 构造。
  • 不要把其他 CPU 型号生成的后缀直接复制到 dav-c220