openmp是否有可能在同一个cpu(核心)上运行不同的线程

时间:2013-05-25 08:03:24

标签: c++ c openmp

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

可以指示OpenMP运行时对线程执行特定的绑定(或以英特尔术语固定)到可用的CPU内核。 OpenMP 4.0附带了以抽象和可移植的方式指定它的规定,而当前的OpenMP实现提供了它们自己的特定机制:

  • KMP_AFFINITY适用于英特尔编译器 - 请参阅here;
  • GLC的
  • GOMP_CPU_AFFINITY(兼容模式下的英特尔) - 请参阅here

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