我知道 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”的价值是什么?
答案 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)。