如何使用gcc进行矢量化?

时间:2009-01-03 16:22:31

标签: gcc loops simd vector-processing

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

2 个答案:

答案 0 :(得分:21)

原始页面提供了有关让gcc自动进行矢量化的详细信息 循环,包括几个例子:

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

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

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

gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5

请注意,-msse也是可能的,但它只会向量化循环 使用花车,而不是双打或整体。

答案 1 :(得分:8)

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

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

  1. 根据目标架构提及向量中的单词数。这可以通过定义宏UNITS_PER_SIMD_WORD
  2. 来完成
  3. 可能需要在单独的文件<target>-modes.def中定义可能的矢量模式。此文件必须驻留在包含计算机描述的其他文件所在的目录中。 (根据配置脚本。如果您可以更改脚本,则可以将文件放在您希望的目录中。)
  4. 根据目标体系结构考虑进行矢量化的模式。比如,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 */

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