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

C++ openmp是否可以在同一个cpu(核心)上运行不同的线程,c++,c,openmp,C++,C,Openmp,假设我有两个核心。让我们将它们表示为core1和core2。如果我使用openmp并行化我的程序,将生成两个线程。openmp实现是否可以将core1上的两个线程分配给Execute,而不是core1和core2上的两个线程?在第一种情况下,我们将失去并行性 我正在使用icc附带的英特尔openmp。默认情况下,是否可以在同一cpu(核心)上运行不同的线程 谢谢。可以指示OpenMP运行时对可用的CPU内核执行线程的特定绑定(或英特尔术语中的固定)。OpenMP 4.0附带了以抽象和可移植的方式

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

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


谢谢。

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

  • 英特尔编译器的
    KMP\u亲缘关系
    -请参阅
  • GOMP\u CPU\u AFFINITY
    适用于GCC(英特尔处于兼容模式)-请参阅

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

操作系统将调度线程,而不是OpenMP,是的,多个线程完全有可能在同一个内核上运行。如何以抽象和可移植的方式在OpenMP 4.0中设置线程关联性?请参阅OpenMP4.0规范。我猜它是通过
proc\u bind
设置的。是时候升级到GCC 4.x开始使用OpenMP4.0了(我现在或多或少放弃了MSVC)。GCC 4.9应该为大多数OpenMP 4.0结构提供支持。