我是否可以仅为代码的一部分启用矢量化?

时间:2014-09-17 17:08:57

标签: c++ gcc sse pragma

有没有办法只为代码的某些部分启用矢量化,比如pragma指令?基本上只有在编译代码的某些部分时才启用了-ftree-vectorize?例如,Pragma simd不适用于gcc ...

原因是从基准测试中我们看到-O3(这使得矢量化)的时间比-O2更差。但是有一部分代码我们希望编译器尝试向量化循环。

我可以使用的一个解决方案是将编译器指令限制为一个文件。

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。您可以为整个模块或individual功能禁用它。 You can't however do this for particular loops

对于个别功能使用 __attribute__((optimize("no-tree-vectorize")))

对于整个模块-O3,自动启用-ftree-vectorize。我不确定如何在启用后将其停用,但您可以使用-O2。如果您想使用除-O3之外的所有-ftree-vectorize,请执行此操作

gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O3-opts | grep enabled

然后包含除-ftree-vectorize以外的所有选项。

编辑:我在手册页中看不到-fno-tree-vectorize,但无论如何都可以,因此您可以-O3 -fno-tree-vectorize

编辑: OP实际上想要为特定功能或整个模块启用矢量化。在这种情况下,可以使用单个函数__attribute__((optimize("tree-vectorize")))和整个模块-O2 -ftree-vectorize

编辑(来自Antonio):从理论上讲,有一个pragma指令可以对所有后续函数进行树形矢量化

#pragma GCC optimize("tree-vectorize")

但似乎不能使用我的g ++编译器,可能是因为这里提到的bug: How to enable optimization in G++ with #pragma。另一方面,函数属性起作用。