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
关键输出:
优化级别¶
| 选项 | 用途 |
|---|---|
-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。