我可以只为代码的一部分启用矢量化吗?
Posted
技术标签:
【中文标题】我可以只为代码的一部分启用矢量化吗?【英文标题】:Can I enable vectorization only for one part of the code? 【发布时间】:2014-09-17 17:08:56 【问题描述】:有没有办法只为代码的某些部分启用矢量化,比如 pragma 指令?基本上只有在编译代码的某些部分时才启用-ftree-vectorize? Pragma simd 例如不适用于 gcc...
原因是从基准测试中我们看到,使用 -O3(启用矢量化)的时间比使用 -O2 时更差。但是我们希望编译器尝试对代码的某些部分进行矢量化循环。
我可以使用的一种解决方案是将编译器指令限制为一个文件。
【问题讨论】:
通常矢量化应该加速您的代码,如果它已被应用。你确定吗?您是如何发现它减慢了代码速度的? @black 我们正在谈论一个大项目,但是,没有太多要矢量化的地方。 -O3 引入了一些开销,在某些情况下会生成较慢的代码***.com/a/19985801/2436175。在我们的时间基准测试中就是这种情况。全局启用树向量化具有相同的风险,而我可以很好地猜测代码的哪一部分值得要求编译器进行向量化。 【参考方案1】:是的,这是可能的。您可以为整个模块或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。另一方面,function 属性起作用。
【讨论】:
谢谢!我现在正在阅读“属性” :) 顺便说一句,我没有很清楚地解释自己:我们想保留 -O2,并在本地启用矢量化(在某些文件或某些函数上)。 @Antonio,实际上你很清楚。这是我的错,我看错了你的问题。我认为您可以将__attribute__((optimize("tree-vectorize")))
或-O2 -ftree-vectorize
用于整个模块。
@Antonio,我对您启用矢量化所有功能的请求感到有些困惑。你说#pragma GCC optimize("tree-vectorize")
不起作用,但-ftree-vectorize
有什么问题。那不应该做你想做的事吗?
我在一个项目中工作,其中很难为一个文件添加一个特定的标志。所以,如果是文件本身提出了这个请求,那就更好了。
@Antonio,哦,我明白了。我很高兴__attribute__((optimize("tree-vectorize")))
仍然有效。以上是关于我可以只为代码的一部分启用矢量化吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Microsoft Visual Studio 2017 或 2019 中启用或使用自动矢量化以及自动并行化?