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

问题描述 投票:20回答:5

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

gcc compiler-construction x86 sse assembly
5个回答
23
投票

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

不过,一般来说,您必须自己使用它们。要么在原始汇编器中,要么通过使用编译器内部函数。一般来说,我会说内在函数是更好的方法,因为它们可以更好地使编译器理解代码,从而进行调度和优化,但实际上,我知道MSVC至少并不总是从内在函数生成非常有效的代码,因此纯asm可能是那里最好的解决方案。实验,看看有什么用。但不要指望编译器为您使用这些指令,除非您1)使用正确的编译器,以及2)编写可以简单向量化的相当简单的循环。

2012年更新好的,自从我写这个答案以来已经过去了三年。 GCC能够自动矢量化(简单)代码已有两年了,在VS2012中,MSVC 获得了相同的功能。当然,我的答案的主要部分仍然适用:编译器仍然只能向量化相当平凡的代码。对于更复杂的事情,您会被困于内在函数或内联汇编。


9
投票
Mono可以使用SIMD扩展名,只要您将其类用于矢量。您可以在这里阅读:http://tirania.org/blog/archive/2008/Nov-03.html

4
投票
如何利用SSE和其他小的向量单元的问题

自动


0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.