假设我在主机上运行了一个c / c ++应用程序。主机CPU上运行的线程很少,Xeon Phi核心上运行着50个线程。
如何确保这些50中的每一个都在其自己的Xeon Phi核心上运行,并且永远不会从核心缓存中清除(假设代码足够小)。
有人可以概述一个非常一般的想法如何做到这一点以及哪个工具/ API更适合(对于C / C ++代码)?
在主机线程聚合器和50个Phi线程之间交换数据的最快方法是什么?
鉴于实际的并行性将非常有限 - 这个应用程序将更像51线程平面应用程序,并具有一些基本的多线程数据同步。
我可以使用传统的C / C ++编译器来创建这样的应用程序吗?
答案 0 :(得分:3)
您提出了几个问题:
是的,您可以使用传统的C程序并使用常规Intel C / C ++ / Fortran编译器(称为Intel Composer XE)进行编译,以便生成能够运行的二进制文件Intel Xeon Phi协处理器采用“本机”/“对称”或“卸载”模式。在最简单的情况下 - 你只需用-mmic重新编译你的C / C ++程序,并在Phi上“原生”地“按原样”运行它。
使用哪种API?使用 OpenMP4.0 标准或 Intel Cilk Plus 编程模型(实际上是一组适用于C / C ++的编译指示或关键字)。 OpenCL,Intel TBB和OpenACC也是可能的,但OpenMP和Cilk Plus能够表达线程,矢量化和卸载(即Xeon Phi编程必不可少的3件事),无需重新分解或重写“传统的C / C ++ / Fortran”程序
线程固定:可以通过 OpenMP affinity (请参阅下面的MIC_KMP_AFFINITY的更多详细信息)或Intel TBB亲和力来实现。
在主机和目标Phi之间交换数据的最快方法是...避免任何交换 - 例如使用MPI对称方法。但是,您似乎特别询问“卸载”编程模型,因此使用asynchronous offload可以获得最佳性能。同时,同步卸载在编程方面理论上更简单,但在可实现的性能方面更差。
总的来说,你倾向于提出几个一般性的问题,所以我建议从一开始就开始 - 即看看以下约10页的Dr. Dobbs manual或给予英特尔'intro document。
线程固定是更高级的主题,同时对你来说似乎“最有趣”,所以我将明确解释更多: