英特尔的“残缺AMD”功能(2019年)

2020-08-29 04:52:20

英特尔正在为各种用途生产C++和Fortran编译器以及几个高度优化的函数库。使用英特尔编译器和函数库的软件程序员并不总是意识到,使用这些工具生产的软件在AMD上或通过处理器执行时,运行速度可能会低于必要的速度。代码可能包含几个不同的版本,每个版本都针对特定的指令集扩展(如SSE2、AVX或AVX512)进行了优化。所谓的CPU调度器根据运行它的CPU来选择要运行的代码版本。CPU调度器可能是公平的,也可能是不公平的。公平的CPU调度器将根据CPU支持的指令集扩展选择最佳代码版本。只有当CPU在英特尔CPU上运行时,不公平的CPU调度器才会检测CPU的品牌并选择最佳代码路径。当在另一个品牌的CPU上运行时,即使CPU与更好的版本兼容,它也会选择慢速通用版本。不公平的CPU调度员在第三方程序员不知情的情况下出现在他们生产的软件中,引发了很多争议和法律诉讼。我们甚至看到基于基准软件的英特尔和AMD处理器之间的基准比较具有误导性,这些软件包含不公平的CPU调度器。有关这一主题的长篇讨论帖子可以在https://www.agner.org/optimize/blog/read.php?i=49.上的本博客的较旧版本中看到。本帖是对这一讨论的摘要,并回顾了最重要的结论。链接和详细信息可以在原始帖子中找到。几年前,当我开始测试英特尔的编译器时,我很快发现它有一个偏向的CPU调度器。早在2007年1月,我就向英特尔投诉CPU调度器不公平。我与英特尔工程师就这个问题进行了长时间的通信,他们一直否认这个问题,我也不断地提供更多的证据。他们说:CPU调度,加上优化,旨在优化英特尔和AMD处理器的性能,以提供最佳结果。这显然是我们的目标,除了一个例外,我们相信我们现在就在那里。一个例外是我们的9.x编译器在AMD处理器上不支持SSE3,因为AMD处理器与我们的编译器的发布时间不同(我们的编译器是在AMD支持SSE3之前开发的)。未来的10.x编译器将在本季度进入测试版,大约在今年年中发布,既然我们已经有时间调整和调整以适应新的AMD处理器,它将解决这个问题。

这听起来不错,但事实是CPU调度器不支持AMD处理器中的更高指令集,至今仍不支持(英特尔编译器版本19)。我后来发现,其他人也向英特尔提出了类似的投诉,得到了类似的无用答案(参见旧博客文章中的链接)。我还发现英特尔CPU调度器不仅检查供应商ID字符串和支持的指令集。它还检查了特定的处理器型号。事实上,它将无法识别未来家族号不同于6的英特尔处理器。当我向英特尔工程师提到这一点时,他们回答说:您提到,如果没有编译器更新,我们将不支持未来具有非6家族名称的英特尔处理器。是的,这是正确的,也是有意的。我们的编译器生成的代码,我们有很高的信心将在未来继续运行。这样做的效果是不会对未来的英特尔或AMD或其他处理器做出任何假设。你已经注意到我们可以更有攻击性。我们认为这对我们的客户来说是不明智的,他们希望他们的代码(用我们的编译器构建)能够在很长一段时间内继续运行的安全级别。您建议的方法虽然听起来合理,但对于我们高度优化的编译器来说还不够保守。我们的经验指导我们保守地发布代码,并在有机会验证新的英特尔和新的AMD处理器的功能时更新编译器。这意味着我们对新处理器的生产版本支持存在一定的滞后。

换句话说,他们声称他们是针对特定的处理器型号进行优化,而不是针对特定的指令集进行优化。如果是真的,这给了英特尔不能正确支持AMD处理器的理由。但这也意味着,每当市场上出现新的英特尔处理器时,所有使用英特尔编译器的软件开发商都必须重新编译代码,并向客户分发新版本。三年后,我尝试在最新的英特尔处理器上运行用旧版本的英特尔编译器编译的程序。您已经猜到了:它仍然运行最佳代码路径。但原因更难猜测:英特尔对新处理器上的CPUID系列编号进行了操控,使得它们在旧的英特尔软件中看起来像是已知的型号。也许英特尔&#的最初设计

切勿依赖基准测试,除非已知基准测试代码是开源的,并且无需使用任何英特尔工具即可编译。