应用程序非常适合Xeon-phi多核架构

Applications well suited for Xeon-phi many-core architecture

本文关键字:多核 Xeon-phi 非常 应用程序      更新时间:2023-10-16

由此https://software.intel.com/en-us/videos/purpose-of-the-mic-architecture我了解到具有复杂或大量随机内存访问的应用程序不太适合Intel Xeon-phi。这是因为该架构使用61个内核和8个内存控制器。在L1和L2缓存丢失的情况下,最多需要100个周期才能将行读取到内存中,并使其准备好供CPU使用。这样的应用程序称为延迟绑定。

然后,教程提到多核架构(仅Xeon-phi协处理器)非常适合高度并行的同构代码。这里有两个问题:

  1. 什么是同构代码?

  2. 哪些实际应用可以充分受益于MIC架构?

我认为英特尔MIC架构是一个"基于x86的GPGPU",如果你熟悉GPGPU的概念,你会发现你自己熟悉英特尔MIC。


同构集群是具有相同特性的多个执行单元(即cpu)的系统基础结构。例如,拥有四个Intel至强处理器的多核系统是同构的。

一个异构集群是一个具有多个不同功能(如CPU和GPU)的执行单元的系统基础设施。例如,我的联想z510与英特尔i7 Haswell(4个cpu),它的Nvidia GT740M (GPU)和它的英特尔HD Graphics 4600 (GPU)是一个异构系统。

异构代码的一个例子是电子游戏。
电子游戏有一个控制代码,由一个CPU的一个代码执行,控制其他代理的行为,它发送着色器在gpu上执行,物理计算在其他核心或gpu上执行,等等。在这个例子中,你需要编写在CPU上运行的代码(所以它是"CPU感知的")和在GPU上运行的代码(所以它是"GPU感知的")。这实际上是通过使用不同的工具不同的编程语言和不同的编程模型来完成的!

同构代码是不需要注意n不同的编程模型的代码,每个模型对应不同类型的代理。它只是相同的编程模型、语言和工具。看一下这个非常简单的MPI库的示例代码。代码都是用C编写的,它是相同的程序,只是采用不同的流程。


关于应用,嗯,这真的是一个广泛的问题…

如上所述,我认为英特尔MIC是基于x86 ISA的GPGPU(至少是它的一部分)。

一个特别有用的SDK(在你链接的视频中列出)与集群系统一起工作是OpenCL,它可以用于快速处理图像和计算机视觉,基本上用于任何需要相同算法以不同输入运行数十亿次的事情(如加密应用程序/暴力破解)。如果你在网上搜索一些基于OpenCL的项目,你会得到一个想法。

要回答第二个问题,最好是问我们自己"什么不能利用MIC架构?"

我们很快就会发现,一个算法离流处理的概念和相关主题,包括内核的概念越远,它就越不适合MIC。

首先直接回答您的问题—为了最大限度地利用协处理器,您的代码应该能够使用大量线程并且应该矢量化。有多少线程?好吧,你有60个核心(+/-取决于你得到的版本),每个核心4个线程,在许多代码中,每个核心2个线程左右是一个最佳点。有时即使不使用每个核心,也可以获得良好的性能。但是矢量化是非常重要的;在协处理器上,长(512字节)向量是一个很大的速度来源。

现在开始编程。Intel Xeon Phi协处理器使用两种不同的编程方式——卸载和本机编程。

在卸载模型中,你编写一个程序,确定代码的哪些部分有足够的并行性来利用协处理器上的大量内核,并用卸载指令标记这些部分。然后在这些已卸载的部分中,使用某种形式的并行性(如OpenMP)编写代码。(异构)

在本机代码中,您不使用任何卸载指令,而是使用-mmic编译器指令。然后直接在协处理器上运行代码。您编写的代码将使用某种形式的并行性(如OpenMP)来利用协处理器拥有的大量内核。(均匀)

这些编程模型的另一种变体是使用MPI,通常除了OpenMP之外。您可以使用卸载编程模型,在这种情况下,MPI系统中的节点将是系统中的主机节点。(混合)或者,您可以使用本机编程模型,在这种情况下,您可以将协处理器视为系统中的另一个节点。(如果主机和协处理器是节点,则异构;如果只使用协处理器,则是同构的。)

您可能已经注意到,我所说的并没有暗示主机和协处理器有单独的编程风格。您可以进行一些优化,以保持为协处理器编写的代码不会在处理器上运行,但通常,您为协处理器编写的代码也可以通过更改编译器选项在主机上编译并运行。

对于现实世界的应用程序,请参见https://software.intel.com/en-us/mic-developer/app-catalogs