使用 GCC 强制自动矢量化

Posted

技术标签:

【中文标题】使用 GCC 强制自动矢量化【英文标题】:Forcing Automatic vectorization with GCC 【发布时间】:2013-02-06 16:22:56 【问题描述】:

这是我非常简单的问题。使用 ICC,我知道可以使用 #pragma SIMD 来强制对编译器选择不进行矢量化的循环进行矢量化。 GCC中有类似的东西吗?或者,是否有计划在未来的版本中添加此功能?

相当相关,用 Graphite 强制矢量化怎么样?

感谢您考虑我的要求 法比奥

【问题讨论】:

【参考方案1】:

只要允许 gcc 使用 SSE/SSE2/etc 指令,编译器通常会在意识到它“值得”时生成向量指令。像编译器中的大多数事情一样,这需要程序员的一些运气/计划/小心,以避免编译器认为“这可能不安全”或“这太复杂了,我无法弄清楚发生了什么”。但通常情况下,如果您使用的是相当现代的 gcc 版本(4.x 版本都应该这样做),那么它会成功。

您可以通过添加-msse-msse2(等等,用于以后的SSE 扩展)使编译器使用SSE 或SSE2 指令。 -msse2 在 x86-64 中是默认的。

但是,我不知道您可以通过任何方式强制执行此操作。编译器要么会这样做,因为它很高兴这是一个好的解决方案,要么不会。

抱歉,无法回答有关 Graphite 的问题。

【讨论】:

是的,我知道你的意思。我只想强制对一些循环进行矢量化,因为如果我使用 ICC 这样做,我会得到一些性能改进。所以,我很想看看 GCC 的反应。但我需要发现它是否可能以及如何强制矢量化。还是谢谢。 @user2047635 如果您认为自己可以比编译器做得更好,那么您不妨自己手动使用内在函数对其进行矢量化。 或者更好,但是,一直用汇编程序编写它 - 这样,您可以 100% 控制哪些指令按什么顺序出现,哪些寄存器在哪里使用等等。 你说得对。但事情并非如此简单。我正在研究一类共享特定功能的程序,即行程次数非常少的循环嵌套。因此,使用内在函数意味着构建一个编译器/代码翻译器/生成器(你可以随意调用它)来生成它们,这比我为进行我目前正在做的转换而必须构建的要复杂得多(到目前为止,手动,出于实验目的)到循环。 你真的看过 gcc 编译器产生了什么吗?

以上是关于使用 GCC 强制自动矢量化的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcc 进行自动矢量化?

gcc、clang 和 msvc 的 C++ 自动矢量化要求

在 GCC 的函数中禁用特定循环的自动矢量化

gcc中的数组与指针自动矢量化

GCC 自动矢量化对运行时没有影响,即使在所谓“有利可图”的情况下也是如此

gcc 自动矢量化(未处理的数据参考)