如何使用gcc进行矢量化?

cas*_*der 17 gcc loops simd vector-processing

gcc编译器的v4系列可以在一些现代CPU上使用SIMD处理器自动矢量化循环,例如AMD Athlon或Intel Pentium/Core芯片.这是怎么做到的?

cas*_*der 21

原始页面提供了有关使gcc自动向量化循环的详细信息,包括以下几个示例:

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

虽然示例很棒,但事实证明,使用最新GCC调用这些选项的语法似乎有所改变,现在看:

总之,以下选项适用于带有SSE2的x86芯片,给出了已经向量化的循环日志:

gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
Run Code Online (Sandbox Code Playgroud)

注意-msse也是一种可能性,但它只使用浮点数而不是双精度数或整数来向量化循环.

  • `-ftree-vectorizer-verbose=5` 是旧语法,现在需要使用新语法[参见](http://stackoverflow.com/questions/30305830/understanding-gcc-4-9-2-auto -向量化输出) (3认同)
  • **GCC 在 `-O3` 启用自动矢量化。更喜欢那个。**(现在默认情况下它不启用循环展开;理想情况下使用 `-fprofile-generate` + `-fprofile-use` 来展开热循环。)也更喜欢 `-O3 -march=native - ffast-math` 仅在为您自己的计算机编译时。另请参阅 [C 循环优化最终分配的帮助](//stackoverflow.com/q/32000917),了解 GCC 自动矢量化和使用非古代 gcc 自动并行化的一些示例。 (3认同)
  • GCC 是否有更多关于矢量化的更新文档? (2认同)

Gan*_*ian 8

有一个gimple(GCC的中级代表)通过pass_vectorize.此过程将启用gimple级别的自动矢量化.

要启用自动向量化(GCC V4.4.0),我们需要执行以下步骤:

  1. 根据目标体系结构提及向量中的单词数.这可以通过定义宏来完成UNITS_PER_SIMD_WORD.
  2. 可能需要在单独的文件中定义可能的矢量模式<target>-modes.def.此文件必须驻留在包含计算机描述的其他文件所在的目录中.(根据配置脚本.如果您可以更改脚本,则可以将文件放在您希望它所在的任何目录中).
  3. 根据目标体系结构考虑进行矢量化的模式.比如,4个单词将构成一个向量,或者8个半字将构成一个向量或两个双字将构成一个向量.有关详细信息需要在<target>-modes.def文件中提及.例如:

    VECTOR_MODES (INT, 8);     /*       V8QI V4HI V2SI /
    VECTOR_MODES (INT, 16);    /
    V16QI V8HI V4SI V2DI /
    VECTOR_MODES (FLOAT, 8);   /
               V4HF V2SF */

  4. 建立端口.可以使用命令行选项启用矢量化-O2 -ftree-vectorize.