我可以只为代码的一部分启用矢量化吗?

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 中启用或使用自动矢量化以及自动并行化?

你能调试自动矢量化循环吗?

以下代码的矢量化有啥好处吗?

C++ 矩阵乘法自动向量化

我可以使用 Numba、矢量化或多处理加速这种空气动力学计算吗?

我可以控制 CountVectorizer 在 scikit learn 中对语料库进行矢量化的方式吗?