2

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

但在他们在这里给出的例子中,它给出了:

GOMP_CPU_AFFINITY="0 3 2 1"

这里,

thread0连接到---> cpu0

thread1连接到---> cpu3

thread2连接到---> cpu2

thread3连接到---> cpu1

这很清楚。

但是如何同时将 thread0 设置为 core0 和 core2 呢?它的环境变量“GOMP_CPU_AFFINITY”的值是多少?

4

2 回答 2

4

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

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

于 2012-12-27T09:44:17.090 回答
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。

对于不支持类似于英特尔 OpenMP 支持的绑定样式的 OpenMP 运行时,可以改用操作系统调度程序调用来修改每个线程的关联掩码。这会创建不可移植的应用程序,但允许实现一对多的绑定样式。在 Linux 上,必要的调度程序调用是sched_getaffinity(2)sched_setaffinity(2)

于 2012-12-27T16:52:24.673 回答