大家好,我之前购买了X60的8核RISC-V CPU,想问问怎么用clang自动向量化C代码?不想用RISC-V intrinsic写代码,要加哪些编译参数会有比较好的向量化效果?
我的clang版本是20.0.0。本地已经有riscv-toolchain的环境, 是按照riscv toolchain GitHub官网编译的环境。之前有看到spacemit的工具链压缩包,想问问这个和按照官网的代码编译有什么区别?
谢谢。
大家好,我之前购买了X60的8核RISC-V CPU,想问问怎么用clang自动向量化C代码?不想用RISC-V intrinsic写代码,要加哪些编译参数会有比较好的向量化效果?
我的clang版本是20.0.0。本地已经有riscv-toolchain的环境, 是按照riscv toolchain GitHub官网编译的环境。之前有看到spacemit的工具链压缩包,想问问这个和按照官网的代码编译有什么区别?
谢谢。
Q0:怎么用clang自动向量化C代码?
clang可以添加以下选项实现自动向量化:
-O2/3/fast -march=rv64gcv1p0 -fvectorize -fvectorize-slp
Q1:clang要加哪些编译参数会有比较好的向量化效果?
X60的硬件VLEN=256,因此推荐:-mllvm --riscv-v-vector-bits-min=256
可能会产生更高性能的向量化代码,但是现在工具链的自动向量器生成的性能水平仍然远远不及人工手写和intrinsic,而且循环的实现方式对于自动向量化产生的代码性能影响也很大,这方面可以参考这个帖子:Almost same execution time when enabling auto-vectorization or not
因此对于Q1我们仍在探索实验阶段,后续可能为用户推出一系列spacemit硬件相关的自动向量化性能优化的选项建议。
Q3:spacemit工具链 跟GitHub上开源的工具链有哪些区别?
前者支持了我们自定义的ai指令,添加了更细粒度的调度模型以及其他一些有益于性能的优化改动(clang通过-mcpu选项自动开启)。
clang 编译器自动向量化是在中端IR 中实现,代价模型的分析粒度相对没有那么精细,可能存在自动向量化实现流程中,代价模型分析并不完善
1.你可以尝试自己去配置展开因子和向量化因子去调整
### pragma 表达形式
#pragma clang loop vectorize_width(2) interleave_count(2)
### 编译器选项
-mllvm -force-vector-interleave=4 -mllvm -force-vector-width=2
-mllvm -force-tail-folding-style=data-with-evl -mllvm -prefer-predicate-over-epilogue=predicate-dont-vectorize
感谢您的回复!!
太感谢您啦!!