gcc
编译器的v4系列可以在某些现代CPU(例如AMD Athlon或Intel Pentium / Core芯片)上使用SIMD处理器自动对循环进行矢量化。如何完成?
原始页面提供了有关使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
存在一个Gimple(GCC的中间表示)传递pass_vectorize
。此阶段将在gimple级别启用自动矢量化。
为了启用自动矢量化(GCC V4.4.0),我们需要执行以下步骤:
UNITS_PER_SIMD_WORD
来完成。<target>-modes.def
。该文件必须位于包含机器说明的其他文件所在的目录中。 (根据配置脚本。如果可以更改脚本,则可以将文件放置在您想要的文件所在的任何目录中。)>根据目标体系结构要考虑矢量化的模式。类似地,4个单词将构成一个向量,或者八个半字将构成一个向量,或者两个双字将构成一个向量。需要在<target>-modes.def
文件中提及其详细信息。例如:
VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI /
VECTOR_MODES (INT, 16); / V16QI V8HI V4SI V2DI /
VECTOR_MODES (FLOAT, 8); / V4HF V2SF */
构建端口。可以使用命令行选项-O2 -ftree-vectorize
启用矢量化。