Open64中的自动向量化支持

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.

相关文章:

This entry was posted in open64, 编译技术 and tagged , , , , . Bookmark the permalink.

12 Responses to Open64中的自动向量化支持

  1. baozii says:

    好像使用的限制条件还蛮严格的…

    • erlv says:

      数据并行要考虑的问题太多,而且做完向量化之后可能性能还会下降。有指针之类的,基本没办法做。所以只能增加一堆限制条件,找最简单,最能提高性能的部分去做。

  2. srs says:

    open64 来了一个强劲的对手。

    pathscale 好象按照 GPLv3 放出源代码来了,可以和 icc 对抗的东东,什么时候能用它编译我的 gentoo 啊。

    http://github.com/path64

    • srs says:

      下了看了一下,肉眼凡胎,都找不到 c 编译器的位置。

    • srs says:

      好象前面都是 gcc 在做,后面优化的部分改成 pathscale 了。

    • erlv says:

      pathscale和open64是一个娘生的,所以都差不多。呵呵,不过可能pathscale和open64相比,某些优化有些不同。pathscale主要面向高性能计算机和集群。open64面向普通计算机和服务器居多。

  3. baozii says:

    不知道老大对函数式语言有没有了解,能不能点评一下这方面的发展~

    • erlv says:

      呵呵,点评不敢当,也一直想学习学习函数式语言,敬请多多关注。不久就会奉上:)

  4. baozii says:

    嗯,期待啊……(*^_^*)

  5. Pingback: 多面体模型是编译器循环优化的未来吗? | 编译点滴

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>