我知道GOMP_CPU_AFFINITY将线程绑定到特定内核。
但在他们在这里给出的例子中,它给出了:
GOMP_CPU_AFFINITY="0 3 2 1"
这里,
thread0连接到---> cpu0
thread1连接到---> cpu3
thread2连接到---> cpu2
thread3连接到---> cpu1
这很清楚。
但是如何同时将 thread0 设置为 core0 和 core2 呢?它的环境变量“GOMP_CPU_AFFINITY”的值是多少?
这份GOMP 参考资料可能会对您有所帮助。要回答您的具体问题 `GOMP_CPU_AFFINITY="0-2:2 ..." 会这样做 - 这意味着“在任何处理器 0-2 上运行,可被 2 整除(即 0 和 2)”。
至少如果您问如何让 thread0 在 core0 或 core2 中的任何一个上运行 - 您实际提出的问题的答案是“您不能”,因为线程只能在任何精确时刻在一个核心上运行,所以 Thread0 不能同时在两个核心上运行。
我猜 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。
对于不支持类似于英特尔 OpenMP 支持的绑定样式的 OpenMP 运行时,可以改用操作系统调度程序调用来修改每个线程的关联掩码。这会创建不可移植的应用程序,但允许实现一对多的绑定样式。在 Linux 上,必要的调度程序调用是sched_getaffinity(2)和sched_setaffinity(2)。