the*_*oop 20 compiler-construction x86 assembly gcc sse
我一直在阅读x86指令集扩展,它们在某些特定情况下似乎很有用(例如SSE3中的HADDPD - (Horizontal-Add-Packed-Double)).这些需要一个特定的寄存器布局,需要有意设置,或者从它之前的一系列指令中进行.像gcc这样的通用编译器多长时间实际使用这些指令(或其子集),还是主要用于手工编码的汇编程序?编译器如何检测使用SIMD指令的适当位置?
jal*_*alf 23
通常,很少有编译器使用它们.GCC和Visual Studio通常不能使用SIMD指令.如果将SSE作为编译器标志启用,它将使用标量SSE指令进行常规浮点运算,但通常不要指望自动使用向量化的指令.最新版本的GCC可能在某些情况下可以使用它们,但最后我尝试过没有用.英特尔的C++编译器是我所知道的唯一能够自动向量化某些循环的大型编译器.
一般来说,你必须自己使用它们.在原始汇编程序中,或使用编译器内在函数.一般来说,我认为内在函数是更好的方法,因为它们更好地允许编译器理解代码,因此安排和优化,但在实践中,我知道MSVC至少并不总是从内在函数生成非常有效的代码,所以普通的asm可能是那里最好的解决方案.实验,看看有效.但是不要指望编译器为你使用这些指令,除非你1)使用正确的编译器,2)编写可以简单地向量化的相当简单的循环.
2012年更新
好了,自从我写这个答案以来已经过去了三年.GCC已经能够自动矢量化(简单)代码几年了,而在VS2012中,MSVC 最终获得了相同的功能.当然,我的答案的主要部分仍然适用:编译器仍然只能矢量化相当简单的代码.对于任何更复杂的事情,你都会陷入内在函数或内联asm的困境.
只要您将其类用于向量,Mono就可以使用SIMD扩展.你可以在这里阅读:http://tirania.org/blog/archive/2008/Nov-03.html
只要您使用-O3或特定标志,GCC应该进行一些自动矢量化.他们在这里有一个信息页面:http://gcc.gnu.org/projects/tree-ssa/vectorization.html