1)基本概念
SLP向量化的目的是结合同一循环迭代内的多个计算操作,将多条标量计算合并为一条向量计算,在减少计算指令执行次数的同时,减少Code Size和寄存器压力。这个优化在LLVM中是默认开启状态,如果想要关闭可以使用 -fno-slp-vectorize 选项。SLP向量化的转换逻辑如下图,我们可以看到循环的迭代次数并没有发生变化,但是单次迭代内的四个标量运算合并成了一个向量运算。
上面不是循环展开后做的向量化吗?这个很正常吧?
2)SLP向量化的潜在目标计算需要满足两点:无数据依赖和相同操作。多条计算之间的操作数和结果不能有依赖关系,才能保证可以使用向量化并行执行。这些计算的运算符(如:加/减/乘/除)也需要相同。
3)示例:
A[i] = B[i] + 15;
A[i + 1] = B[i + 1] + 20;
上面也好理解,其实跟下标也有关系。
4)总结
本文介绍了一种编译器中常用的优化技术——自动向量化。自动向量化技术可以在中间代码层面,针对硬件的特性或用户的指示,对代码中的循环根据特定长度进行切分并将循环中的原标量计算操作替换为硬件支持的向量计算操作,发挥硬件的向量计算单元算力。熟悉自动向量化优化及诊断可以为提升目标代码性能提供非常大的帮助。
这个好像没有什么特别台,其实看下里面的汇编代码 就知道行不行。