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

| 不久前,我在某处读到SSE内在函数可以编译成高效的机器代码,因为编译器将它们与普通函数区别对待。我徘徊在编译器实际上是如何做到的,以及C程序员可以做什么来简化该过程。是否有任何有关如何使用内在函数的指南,这些内在函数使编译器生成高效机器代码的工作更加容易。 谢谢。     
已邀请:
内在函数编译成表示的指令,是否有效取决于其使用方式。 同样,每个编译器对内在函数的处理也有所不同(aka特定于其实现),但是GCC是开源的,因此您可以看到它们如何处理SSE,Open Watcom *,LCC,PCC和TCC *都是开源C编译器,尽管它们没有SSE内在函数,但它们仍应具有内在函数,您可以看到它们如何处理它们。 我认为您所阅读的内容与代码的自动向量化有关,GCC(请参阅此内容)和ICC非常擅长,但它们不如手工优化的代码那么好,至少目前还没有 *可能已更新为支持SSE,最近未检查...     
与Necrolis所写的相反,内部函数可能会编译也可能不会编译为它们表示的指令。对于诸如“ 0”之类的复制或加载指令,尤其如此,因为使用内在函数时,编译器仍负责寄存器的分配和分配。这意味着,如果两个位置可以由同一寄存器表示,则根本不需要将值从一个位置复制到另一位置。在这种情况下,编译器可以选择删除副本。如果从不使用结果,它也可以选择删除其他指令。 查看此博客文章,其中在实践中比较了不同编译器的行为。它是从2009年开始的,因此详细信息可能不再适用。但是,较新的编译器可能会更多而不是更少地优化代码。 对于有效地有效使用内在函数,答案与所有​​其他性能优化相同:度量,度量和度量。确保您实际上正在处理一段热门代码,找出其速度较慢的原因,然后加以改进。您很可能会发现,改善内存访问模式比使用内部函数更为重要。     

要回复问题请先登录注册