应用程序非常适合Xeon-phi多核架构
Applications well suited for Xeon-phi many-core architecture
由此https://software.intel.com/en-us/videos/purpose-of-the-mic-architecture我了解到具有复杂或大量随机内存访问的应用程序不太适合Intel Xeon-phi。这是因为该架构使用61个内核和8个内存控制器。在L1和L2缓存丢失的情况下,最多需要100个周期才能将行读取到内存中,并使其准备好供CPU使用。这样的应用程序称为延迟绑定。
然后,教程提到多核架构(仅Xeon-phi协处理器)非常适合高度并行的同构代码。这里有两个问题:
-
什么是同构代码?
-
哪些实际应用可以充分受益于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架构?"
首先直接回答您的问题—为了最大限度地利用协处理器,您的代码应该能够使用大量线程并且应该矢量化。有多少线程?好吧,你有60个核心(+/-取决于你得到的版本),每个核心4个线程,在许多代码中,每个核心2个线程左右是一个最佳点。有时即使不使用每个核心,也可以获得良好的性能。但是矢量化是非常重要的;在协处理器上,长(512字节)向量是一个很大的速度来源。
现在开始编程。Intel Xeon Phi协处理器使用两种不同的编程方式——卸载和本机编程。
在卸载模型中,你编写一个程序,确定代码的哪些部分有足够的并行性来利用协处理器上的大量内核,并用卸载指令标记这些部分。然后在这些已卸载的部分中,使用某种形式的并行性(如OpenMP)编写代码。(异构)
在本机代码中,您不使用任何卸载指令,而是使用-mmic编译器指令。然后直接在协处理器上运行代码。您编写的代码将使用某种形式的并行性(如OpenMP)来利用协处理器拥有的大量内核。(均匀)
这些编程模型的另一种变体是使用MPI,通常除了OpenMP之外。您可以使用卸载编程模型,在这种情况下,MPI系统中的节点将是系统中的主机节点。(混合)或者,您可以使用本机编程模型,在这种情况下,您可以将协处理器视为系统中的另一个节点。(如果主机和协处理器是节点,则异构;如果只使用协处理器,则是同构的。)
您可能已经注意到,我所说的并没有暗示主机和协处理器有单独的编程风格。您可以进行一些优化,以保持为协处理器编写的代码不会在处理器上运行,但通常,您为协处理器编写的代码也可以通过更改编译器选项在主机上编译并运行。
对于现实世界的应用程序,请参见https://software.intel.com/en-us/mic-developer/app-catalogs
- 如何使用多核代替多核进行编程
- 多核 CPU 上 32 位读取的原子性
- 具有自动跨界的多核处理器上的精确C/C 时钟
- 非CS人员需要了解线程是如何工作的,因为它与多核处理器有关
- Xeon phi卸载模式如何利用线程并行性和矢量化
- 多核线程C++
- 用C++实现多核编程中线程数的获取
- 是具有多核处理器的 c++ 运算符 |= 原子
- 多线程和多核差异
- 这个线程池/多核模拟有什么问题
- 如何在多核系统上实现信号量
- 在低功耗多核微控制器中使用全局变量不好吗?(C++)
- 在多核盒上使用繁忙循环应用程序
- C++:Ubuntu 多核服务器上的 CPU 使用率低
- 如何在QThread中使用OpenMP功能强制使用多核
- 即使在多核上下文中,是否有任何 std::chrono 线程安全保证
- 互斥锁更改是否广播到多核系统上的其他内核
- 在VS2010调试模式下启用多核编译
- pthread_create()在Xeon Phi上每60个线程失败一次(参数无效)
- 应用程序非常适合Xeon-phi多核架构