c++ - 我可以只对一部分代码启用矢量化吗?

标签 c++ gcc sse pragma

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

原因是从基准测试中我们看到使用 -O3(启用矢量化)时序比使用 -O2 更差。但是我们希望编译器尝试对某些代码部分进行矢量化循环。

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

最佳答案

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

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

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

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++ 编译器,可能是因为这里提到的错误: How to enable optimization in G++ with #pragma .另一方面,函数属性起作用。

关于c++ - 我可以只对一部分代码启用矢量化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25896472/

相关文章:

c++ - Qt如何打开SQL Compact Server文件.sdf

多态性和指针 vector 的c++问题

c++ - 在 iOS 中启用异常

c - 在代码中查找变长数组

c++ - 我在 g++ 中的(简单)代码链接,在 clang 中没有链接

sse - 在整数向量上使用 _mm_shuffle_ps 的含义

c++ - 对 vtable 的 undefined reference ...

c++ - boost fibers work_stealing 屏障导致段错误

gcc - 如何在编译时检测SSE/SSE2/AVX/AVX2/AVX-512/AVX-128-FMA/KCVI可用性?

c - SSE 将整数加载到 __m128