gpt4 book ai didi

gcc - 现代编译器如何使用 mmx/3dnow/sse 指令?

转载 作者:行者123 更新时间:2023-12-02 02:42:23 26 4
gpt4 key购买 nike

我一直在阅读 x86 指令集扩展,它们似乎只在某些非常特定的情况下有用(例如 SSE3 中的 HADDPD - (Horizo​​ntal-Add-Packed-Double))。这些需要特定的寄存器布局,该布局需要故意设置,或者从其之前的一系列指令中发生。像 gcc 这样的通用编译器实际上多久使用这些指令(或其子集),或者它们主要用于手工编码的汇编程序?编译器如何检测何时适合使用 SIMD 指令?

最佳答案

一般来说,很少有编译器使用它们。 GCC 和 Visual Studio 通常无法使用 SIMD 指令。如果启用 SSE 作为编译器标志,它将使用标量 SSE 指令进行常规浮点运算,但通常不要指望自动使用向量化指令。最新版本的 GCC 在某些情况下可能可以使用它们,但我上次尝试时不起作用。英特尔的 C++ 编译器是我所知道的唯一能够自动矢量化某些循环的大型编译器。

但一般来说,您必须自己使用它们。无论是在原始汇编程序中,还是通过使用编译器内在函数。一般来说,我认为内在函数是更好的方法,因为它们更好地允许编译器理解代码,从而安排和优化,但在实践中,我知道 MSVC 至少并不总是从内在函数生成非常有效的代码,所以简单的 asm 可能是最好的解决方案。尝试一下,看看什么有效。但不要指望编译器会为您使用这些指令,除非您 1) 使用正确的编译器,并且 2) 编写可以简单矢量化的相当简单的循环。

2012 年更新
好吧,距离我写这个答案已经过去三年了。 GCC 多年来一直能够自动矢量化(简单)代码,而在 VS2012 中,MSVC终于获得了相同的功能。当然,我的答案的主要部分仍然适用:编译器仍然只能矢量化相当简单的代码。对于更复杂的事情,您只能摆弄内在函数或内联汇编。

关于gcc - 现代编译器如何使用 mmx/3dnow/sse 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/875791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com