1

假设我有两个核心。让我们将它们表示为 core1 和 core2。如果我使用 openmp 来并行化我的程序,将生成两个线程。openmp 实现是否可以将 core1 上的两个线程都分配给执行,而不是在 core1 和 core2 上执行?在第一种情况下,我们将失去并行性。

我正在使用 icc 中包含的 Intel openmp。默认情况下,是否可以在同一个 cpu(core) 上运行不同的线程

谢谢。

4

1 回答 1

3

可以指示 OpenMP 运行时将线程与可用 CPU 内核进行特定绑定(或用 Intel 的术语固定)。OpenMP 4.0 提供了以抽象和可移植的方式指定这一点的规定,而当前的 OpenMP 实现提供了自己的特定机制来做到这一点:

  • KMP_AFFINITY对于英特尔编译器 - 见这里
  • GOMP_CPU_AFFINITY对于 GCC(和兼容模式下的英特尔) - 请参见此处

除非设置了这些,否则两个运行时都默认为无绑定,并且操作系统可以自由地分派它认为合适的线程,例如,它可能会在单个内核上分派两个线程。后者不太可能,除非有其他需要大量 CPU 时间的正在运行的进程。大多数操作系统调度程序仍然倾向于不断迁移线程和进程,因此建议您使用绑定机制以获得最大性能。

于 2013-05-25T09:16:04.203 回答