0

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

我如何确保这 50 个中的每一个都在其自己的 Xeon Phi 内核上运行,并且永远不会从内核缓存中清除(假设代码足够小)。

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

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

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

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

4

1 回答 1

3

你提出了几个问题:

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

  2. 使用哪个 API?使用OpenMP4.0标准或Intel Cilk Plus编程模型(实际上是一组适用于 C/C++ 的编译指示或关键字)。OpenCL、英特尔 TBB 和可能的 OpenACC 也是可能的,但 OpenMP 和 Cilk Plus 具有表达线程、矢量化和卸载(即至强融核编程必不可少的 3 件事)的能力,而无需重构或重写“传统 C/C++/Fortran”程序.

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

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

总体而言,您倾向于问几个一般性问题,所以我建议从一开始就开始 - 即查看大约 10 页的 Dobbs 博士手册或英特尔的介绍文档


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

于 2014-04-15T17:34:59.593 回答