使用OpenMP将线程绑定到特定的CPU核心

时间:2012-12-27 04:58:19

标签: c++ linux parallel-processing cpu openmp

我知道 GOMP_CPU_AFFINITY 会将线程绑定到特定核心。

但是在示例中他们给出了here,它给出了:

GOMP_CPU_AFFINITY =“0 3 2 1”

下面,

thread0 附加到--->的 CPU0

thread1 附加到--->的 CPU3

thread2 附加到--->的 CPU2

thread3 附加到--->的 CPU1

这很清楚。

但是如何将thread0同时设置为core0和core2?环境变量“GOMP_CPU_AFFINITY”的价值是什么?

2 个答案:

答案 0 :(得分:4)

GOMP reference可能会对您有所帮助。要回答你的具体问题`GOMP_CPU_AFFINITY =“0-2:2 ......”会这样做 - 它意味着“在任何处理器0-2上运行,可被2整除(即0和2)”。

至少如果你问如何让thread0在core0或core2上运行 - 你实际问的问题有“你不能”的答案,因为一个线程只能在一个核心上以任何精确的方式运行及时,所以Thread0不能同时在两个核上运行。

答案 1 :(得分:1)

我猜测CPU 0和2是相同物理内核的超线程,以及CPU 1和3.英特尔的OpenMP库允许将每个线程绑定到两个超线程,设置类似于:

KMP_AFFINITY="granularity=core,compact"

不幸的是,GCC(通过libgomp)和Sun / Solaris Studio都不允许一对多或多对多的线程到cpu绑定样式。设置GOMP_CPU_AFFINITY(GCC)或SUNW_MP_PROCBIND(Sun / Solaris Studio)允许将每个线程绑定到特定CPU但不绑定到一组CPU。

对于不支持类似于Intel OpenMP支持的绑定样式的OpenMP运行时,可以使用OS调度程序调用来修改每个线程的关联掩码。这会创建非便携式应用程序,但允许实现一对多的绑定样式。在Linux上,必要的调度程序调用是sched_getaffinity(2)sched_setaffinity(2)