编译器如何处理SSE(或任何)内在函数?

时间:2011-04-15 13:03:03

标签: c++ c optimization sse intrinsics

不久之前,我在某处读到SSE内部函数编译成高效的机器代码,因为编译器将它们与普通函数区别对待。我正在徘徊实际上编译器是如何做到的,以及C程序员可以做些什么来促进这个过程。有没有关于如何使用内部函数的指导方针,使编译器能够更轻松地生成高效的机器代码。

感谢。

2 个答案:

答案 0 :(得分:6)

内在函数编译成代表的指令,这是否有效取决于它们的使用方式。

另外,每个编译器对内在函数的处理方式略有不同(又称其特定于实现),但GCC是开源的,因此您可以看到它们如何处理SSE,Open Watcom *,LCC, PCC和TCC*都是开源C编译器,虽然我们没有SSE内在函数,但它们仍然应该有内在函数,你可以看到它们如何处理它们。

我认为你所读到的内容与代码的自动矢量化有关,GCC(见this)和ICC非常擅长,但它们不如手工优化代码好,至少还没有< / p>

*可能已经更新了对SSE的支持,最近没有检查过......

答案 1 :(得分:5)

与Necrolis所写的内容相反,内在函数可能会或可能不会编译成它们所代表的指令。对于诸如_mm_load_pd之类的复制或加载指令尤其如此,因为编译器在使用内在函数时仍然负责寄存器分配和赋值。这意味着如果两个位置可以由相同的寄存器表示,则根本不需要将值从一个位置复制到另一个位置。在这种情况下,编译器可以选择删除副本。如果从未使用过结果,它也可以选择删除其他指令。

查看this blog post,在实践中比较不同编译器的行为。它是从2009年开始的,因此细节可能不再适用。但是,较新的编译器可能会更多地优化您的代码,而不是更少。

至于实际使用内在函数,答案与所有​​其他性能优化相同:测量,测量和测量。确保你实际上正在处理一段热门代码,找出它为什么慢,然后改进它。您很可能会发现改进内存访问模式比使用内在函数更重要。

相关问题