如何使用gcc进行矢量化?

问题描述 投票:18回答:2

gcc编译器的v4系列可以在某些现代CPU(例如AMD Athlon或Intel Pentium / Core芯片)上使用SIMD处理器自动对循环进行矢量化。如何完成?

gcc loops simd vector-processing
2个回答
21
投票

原始页面提供了有关使gcc自动矢量化的详细信息循环,包括一些示例:

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

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

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

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

请注意,-msse也有可能,但是它只会向量化循环使用浮点数,而不是双精度或整数。


编辑,2020-04-03:来自@PeterCordes的评论,如果使用-O3,则可能的话,现代的GCC 8和更高版本应该能够向量化循环:

gcc -O3

8
投票

存在一个Gimple(GCC的中间表示)传递pass_vectorize。此阶段将在gimple级别启用自动矢量化。

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

  1. 提及根据目标体系结构向量中的单词数。这可以通过定义宏UNITS_PER_SIMD_WORD来完成。
  2. 可能的矢量模式通常需要在单独的文件中定义<target>-modes.def。该文件必须位于包含机器说明的其他文件所在的目录中。 (根据配置脚本。如果可以更改脚本,则可以将文件放置在您想要的文件所在的任何目录中。)>
  3. 根据目标体系结构要考虑矢量化的模式。类似地,4个单词将构成一个向量,或者八个半字将构成一个向量,或者两个双字将构成一个向量。需要在<target>-modes.def文件中提及其详细信息。例如:

  4. 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启用矢量化。

© www.soinside.com 2019 - 2024. All rights reserved.