如何将单个应用程序的特定线程卸载到特定的Xeon Phi核心?

假设我在主机上运行了一个c / c ++应用程序。 主机CPU上运行的线程很少,Xeon Phi内核上运行50个线程。

我怎样才能确保这些50中的每一个都运行在自己的Xeon Phi核心上,并且永远不会从核心缓存中清除(考虑到代码足够小)。

有人可以概述一个非常笼统的想法如何做到这一点以及哪个工具/ API更适合(对于C / C ++代码)?

在主机线程聚合器和50个Phi线程之间交换数据的最快方法是什么?

鉴于实际的并行性将非常有限 – 这个应用程序将更像51线程平面应用程序与一些基本的multithreading数据同步。

我可以使用传统的C / C ++编译器来创建这样的应用程序吗?

你提出了几个问题:

  1. 是的,你可以使用传统的C程序并使用常规的英特尔C / C ++ / Fortran编译器 (称为英特尔编写器XE)进行编译 ,以便生成能够在英特尔至强融合协处理器上以“本机”/“运行”的二进制文件。对称“或”卸载“模式。 在最简单的情况下 – 你只需用-mmic重新编译你的C / C ++程序并在Phi上“原生”地“按原样”运行它。

  2. 使用哪种API? 使用OpenMP4.0标准或Intel Cilk Plus编程模型(实际上是一组适用于C / C ++的编译指示或关键字)。 OpenCL,Intel TBB和OpenACC也是可能的,但OpenMP和Cilk Plus能够表达线程,矢量化和卸载(即Xeon Phi编程必不可少的3件事),无需重新分解或重写“传统的C / C ++ / Fortran”程序。

  3. 线程固定:可以通过OpenMP亲和力 (请参阅下面的MIC_KMP_AFFINITY的更多详细信息)或英特尔TBB亲和力来实现。

  4. 在主机和目标Phi之间交换数据的最快方法是…避免任何交换 – 例如使用MPI对称方法。 但是,您似乎专门询问“卸载”编程模型,因此使用异步卸载可以实现最佳性能。 同时, 同步卸载在编程方面理论上更简单,但在可实现的性能方面更差。

总的来说,你倾向于提出几个一般性的问题,所以我建议从一开始就开始 – 即看看以下〜10页的Dobbs博士手册或给出英特尔的介绍文件 。


线程固定是更高级的主题,同时对你来说似乎是“最有趣的”,所以我将明确解释更多:

  • 如果使用OpenMP4.0标准并行化代码,则可以使用针对Xeon Phi的MIC_KMP_AFFINITY / MIC_KMP_PLACE_THREADS和针对主机CPU的KMP_AFFINITY / KMP_PLACE_THREADS实现所需的行为。
  • 很可能你正在寻找这个特定的设置:MIC_KMP_PLACE_THREADS = 50c,1t
  • 我见过人们提到PHI_KMP_AFFINITY而不是MIC_KMP_AFFINITY。 我相信他们是别名,但没有尝试自己。
  • 在Xeon Phi上使用50个线程通常不是最好的主意。 最好尝试120左右的线程
  • 有关Xeon Phi亲和力的更多详细信息,请参阅以下3篇文章: http : //www.prace-project.eu/Best-Practice-Guide-Intel-Xeon-Phi-HTML#id-1.6.2.3和https:// software.intel.com/en-us/articles/best-known-methods-for-using-openmp-on-intel-many-integrated-core-intel-mic-architecture和https://software.intel.com/ EN-US /用品/ OpenMP的线程亲和性控制