我可以在 Xeon Phi (Knights Landing) 处理器上编译 Go 程序吗?

Posted

技术标签:

【中文标题】我可以在 Xeon Phi (Knights Landing) 处理器上编译 Go 程序吗?【英文标题】:Can I compile Go programs on Xeon Phi (Knight's Landing) processors? 【发布时间】:2021-01-20 01:17:30 【问题描述】:

我是一个业余爱好者,喜欢在 Go 中运行我自己的程序,而且随着 Xeon Phi 处理器变得更老,它们也变得非常便宜。如此便宜,我可以从 2015/16 年开始以 的价格建造一台双插槽机器

我正在尝试找出是否可以在这些上运行 Go 程序。从我所见,this thread 说他们不会运行(并尝试 gccgo),但它说它不会运行,因为它部分运行在 x87 ISA 上。令人困惑的是,在 Go 发行说明 they say they're dropping x87 support in 1.16 中,暗示过去曾支持它。我在其他线程中看到所有程序都将在兼容层上运行,但这是一个非常慢的层,只能访问 CPU 缓存的一小部分。

我觉得我离我的元素越来越远了;我想知道使用 Xeon Phi 的人是否知道它是否会运行 Go 代码?或者只是一般情况下,在启动 Ubuntu(或FreeBSD, something that I've seen done and is listed in motherboard specs)之后,哪些事情不会起作用,哪些会起作用?

感谢所有帮助!

【问题讨论】:

普通 FP 数学应该使用标量 SSE 指令,而不是 x87。我不知道 Go,但除非它具有“long double”类型或等效类型,否则 64 位代码应该没有理由使用 x87 FPU。当然,KNL 是 x86-64,包括一个 x87 FPU,所以它可以运行但性能很差,因为它的 x87 FPU 没有完全流水线化所有指令,例如每 2 个周期 1 个 fmul。 @PeterCordes 重新阅读后,我认为我输入错误。从第一个链接有人解释说“不,我认为你应该编译并期望它工作。Knight's Corner 处理器基于 x86-64 基础,是的,但实际上它有自己的浮点指令集——没有 x87,没有 AVX,没有 SSE,没有 MMX ......哦,然后你可以在 Knight's Landing (KNL) 出来的时候扔掉所有的东西。它使用 AVX-512F 作为它的浮点指令set" 但即使这样也可能是错误的,因为我不知道他们是在谈论处理器还是协处理器 嗯那又怎样?你会在编译期间处理......我=cornfused。如果您想模拟 x86 浮点,例如x87 那么这也是可能的,但速度较慢...... 哦,您说的是基于 KNC(Knight's Corner)的早期 Xeon Phi。是的,那是不同的,它在基于 P5-Pentium 的内核中只有自己的 AVX-512 变体/前身,可能没有其他 FP 硬件。您的标题和标签显示 Knight's Landing,即 silvermont + AVX + AVX2 + AVX-512,包括所有基线 x86-64,就像普通 Silvermont 一样(直到并包括 SSE4.1,以及x87)。 Agner Fog 的指令表具有 x87 指令的 KNL 时序,例如 fmul,所以这绝对证明它是有效的。 agner.org/optimize/instruction_tables.pdf 那你很好,就像我说的那样。 KNL 支持 AVX-512F(与subsets of AVX512 they both have 的Skylake-AVX512 兼容),但它也支持x87、SSE 和AVX,因此它可以运行尚未编译的代码以使用AVX- 512.见en.wikipedia.org/wiki/Xeon_Phi。只有 KNC 遗漏了进行 FP 数学的“传统”方法。 【参考方案1】:

您将骑士登陆的担忧建立在关于骑士角落的这句话上:

Knight's Corner 处理器基于 x86-64 基础,是的,但实际上它有自己的浮点指令集——没有 x87、没有 AVX、没有 SSE、没有 MMX……哦,然后你就可以在 Knight's Landing (KNL) 出来的时候扔掉所有的东西。

“把所有东西都扔掉”是指所有的担忧和不相容。 KNL 基于 Silvermont 并且完全兼容 x86-64(包括 x87、SSE 和 SSE2 用于执行 FP 数学的两种标准方法)。它支持 AVX-512F、AVX-512ER 和 a few other AVX-512 extensions,以及 AVX 和 AVX2 以及最高 SSE4.2 的 SSE。很像 Skylake-server CPU,除了一组不同的 AVX-512 扩展。

这样做的目的正是解决您担心的问题:因此任何遗留二进制文件都可以在 KNL 上运行。为了从中获得良好的性能,您希望在执行繁重工作的循环中运行使用 AVX-512 向量进行向量化的代码,但 Linux 发行版的其余部分中的所有周围代码和其他程序或任何可以正常运行的程序使用任何 x87 和/或 SSE 的沼泽标准代码。


Knight's Corner(第一代商业 Xeon Phi)在基于 P5-Pentium 的内核中拥有自己的 AVX-512 变体/前身,没有其他 FP 硬件。

Knight's Landing(第二代商业 Xeon Phi)基于 Silvermont,带有 AVX-512,是第一个可以充当“主机”处理器(可启动)而不仅仅是协处理器。

这种“主机”模式是包含足够硬件来解码和执行 x87 和 SSE 的另一个原因:如果您在 KNL 上运行整个系统,您更有可能希望为非性能敏感的任务,而不仅仅是专门为它编译的二进制文件。

不过,它的 x87 性能并不是很好:就像每 2 个时钟 (https://agner.org/optimize) 一个标量 fmul。与每时钟 2 个 SSE mulsd(0.5c 接收吞吐量)相比。其他 SSE/AVX 数学具有相同的 0.5c 吞吐量,包括 AVX-512 vfma132ps zmm 在一条指令中执行 16 倍单精度融合乘加运算。

所以希望 Go 的编译器不会过多地使用 x87。在 64 位模式(C 编译器及其数学库使用)中进行标量数学的正常方法是 SSE,在 XMM 寄存器中。 x86-64 C 编译器仅将 x87 用于 long double 等类型。

【讨论】:

@haxonek:如果这回答了您的问题,您可以使用投票箭头下的复选标记接受它。【参考方案2】:

是的:

至强融核是英特尔设计和制造的一系列 x86 众核处理器。它旨在用于超级计算机、服务器和高端工作站。它的架构允许使用标准编程语言和应用程序编程接口 (API),例如... 另见https://en.wikipedia.org/wiki/Xeon_Phi

如果您可以在 x86 处理器上编译 go,那么您将能够在英特尔制造的特定 x86 处理器上编译。

至强不是安腾 :)

在这样的系统上你也可以编译 go 你只需要提供一个合适的 c 编译器...

是什么让您认为否则您将无法编译继续说... Atari 或 Arduino?

如果你能详细说明,也许我可以进一步改进我糟糕的答案。

【讨论】:

嗯,我越是研究它,我就越觉得我可能会将协处理器与常规处理器混淆。也就是说,我认为浮点数学的完成方式存在某种问题(AVX-512F?),我不确定这是否会完全禁止,破坏性能,或者只是一个非问题. 有志者事竟成,你问的是编译而不是性能,我相信你会做到的:)

以上是关于我可以在 Xeon Phi (Knights Landing) 处理器上编译 Go 程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 xeon-phi 上引导自定义内核

在 Xeon Phi 上为双打操作面具

无法解释的 Xeon-Phi 开销

是否可以将字符串数组卸载到 Xeon Phi

我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?

Xeon Phi 中的分散/聚集