Open64中的自动向量化通过选项-LNO:simd=(0|1|2)控制。该选项告诉编译器使用后端支持的SIMD指令来向量化循环。向量化的支持分成3个级别:
- 级别0时编译器不进行向量化;
- 级别1时,编译器仅在没有因使用非最佳对齐策略导致性能下降,而且不会出现浮点运算不精确的情况下做向量化;
- 级别2时,编译器会做最激进的向量化。默认的选项是-LNO:simd=1
Open64与自动向量化有关的代码都在 osprey/be/lno/simd.cxx 文件中。Open64的自动向量化目前仅支持X86_64后端。函数void Simd_Phase(WN* func_nd)是自动向量化阶段的入口函数。接着调用函数static void Simd_Walk(WN* wn) 递归地遍历每个PU中的Whirl Node,检查是否满足自动向量化的条件。Open64的自动向量化机制较简单,目前只对没有别名引用的、循环中没有函数调用和Goto语句的最内层循环做向量化。
Open64自动向量化的过程在函数static INT Simd(WN* innerloop)中实现。若成功向量化,则返回1。对于其他后端以及不能成功向量化的返回0。在这个函数中还会对满足前面条件的内层循环继续分析排除不能向量化的循环。首先调用函数static BOOL Simd_Pre_Analysis(WN *innerloop, char *verbose_msg)排除迭代次数太少、迭代变量在循环结束后仍活跃、循环边界过于复杂的循环。再使用函数static BOOL Simd_Analysis(WN *innerloop, char *verbose_msg)排除循环内操作不能向量化、变量形式过于复杂、存在变量依赖环等其他不满足向量化条件的循环。在上述分析的过程中,也在收集能满足向量化条件的语句和循环的信息。
自动向量化的过程分为两个模块:分析并维护数组的对齐 和向量化。分析和维护数组对齐即在编译时,检测数组的对齐信息并对不对齐的部分做出调整。向量化模块则是将循环中的常量和不变量转换为向量类型,再将循环展开,进而将展开后的语句拼接成向量化的Whirl node.

好像使用的限制条件还蛮严格的…
数据并行要考虑的问题太多,而且做完向量化之后可能性能还会下降。有指针之类的,基本没办法做。所以只能增加一堆限制条件,找最简单,最能提高性能的部分去做。
open64 来了一个强劲的对手。
pathscale 好象按照 GPLv3 放出源代码来了,可以和 icc 对抗的东东,什么时候能用它编译我的 gentoo 啊。
http://github.com/path64
下了看了一下,肉眼凡胎,都找不到 c 编译器的位置。
好象前面都是 gcc 在做,后面优化的部分改成 pathscale 了。
pathscale的处理流程和open64是一样的。用gcc做词法语法分析,接下来后端做优化,最后生成.s文件,你可以参考 http://www.lingcc.com/2009/11/19/10024/
pathscale和open64是一个娘生的,所以都差不多。呵呵,不过可能pathscale和open64相比,某些优化有些不同。pathscale主要面向高性能计算机和集群。open64面向普通计算机和服务器居多。
不知道老大对函数式语言有没有了解,能不能点评一下这方面的发展~
呵呵,点评不敢当,也一直想学习学习函数式语言,敬请多多关注。不久就会奉上:)
嗯,期待啊……(*^_^*)
博主表示压力很大:)
Pingback: 多面体模型是编译器循环优化的未来吗? | 编译点滴