我一直在阅读了关于x86指令集扩展,并且他们只好像在某个相当具体的情况下是有用(如HADDPD - (卧式插件盒装双)在SSE3)。这些要求必须要么故意设置,还是从系列之前的指令发生某个寄存器布局。多久通用编译器GCC一样真正使用这些指令(或其子集),或者他们主要是在手工编码的组装中使用?编译器如何检测其中合适的是使用SIMD指令?

有帮助吗?

解决方案

一般而言,少数编译器使用它们。 GCC和Visual Studio通常arn't能够使用SIMD指令。如果启用SSE作为一个编译器标志,它将使用标量SSE指令定期浮点运算,但一般情况下,不要指望那些矢量被自动使用。 GCC的最新版本也许可以在某些情况下使用它们,但没有工作,最后我试过了。英特尔C ++编译器是唯一的大编译器,我知道的,它能够自动向量化有些循环。

虽然一般情况下,你必须自己使用它们。无论是在原料组装,或通过使用编译器内在。在一般情况下,我会说内在函数更好的办法,因为它们能够更好地让编译器理解代码,因此调度和优化,但在实践中,我知道MSVC至少不总是产生从内在非常高效的代码,所以普通的ASM可能是最好的解决方案在那里。实验,看看有什么效果。但是,不要指望编译器使用这些指令给你,除非你1)使用正确的编译器,以及2)编写能够平凡矢量相当简单的循环。

<强>更新2012 结果 好吧,因为我写这个答案所以三年过去了。 GCC已经能够自动向量化(简单)代码几年,现在,在VS2012,MSVC的最后的获得同样的能力。当然,我的回答的主要部分仍然适用:编译器仍然只能向量化相当琐碎的代码。对于任何更复杂的,你坚持内部函数或内联汇编摆弄。

其他提示

单声道可以只要使用它的类的载体使用SIMD扩展。你可以在这里读到它: http://tirania.org/blog/archive/ 2008 / NOV-03.html

GCC应你正在使用-O3或特定的标志,只要做一些自动向量化。他们在这里有一个信息页面: http://gcc.gnu.org/projects/树-SSA / vectorization.html

的如何利用SSE和其它小载体单位的问题自动(在不脱离在特殊的语言结构或专门福地编译“内在”形式的编程方向)一直编译器的一个主题研究了一段时间。最结果似乎被专用于一个特定的问题域,例如数字信号处理。我还没有跟上关于这一主题的文献,但我的的读取表明,利用向量(SSE)单元仍是一个研究课题,一个人应该有中普通低预期目的编译器在该领域常用的。

建议的搜索术语:的量化编译

如果您使用矢量Pascal编译器,你会得到有效的SIMD代码类型,其SIMD给出了一个优势。基本上,这是长度小于64位的任何东西。 (64个实数它实际上是比较慢做SIMD)。 编译器的最新版本也将自动parallelise翻过芯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top