我想要将OpenMP线程绑定到CPU。已经尝试了两种方法。第一个是sched_setaffinity
。每次线程分叉时,我调用sched_setaffinity
将OpenMP线程绑定到CPU。看来每次绑定都太昂贵了。是否真的需要每次绑定或绑定一次?第二个是GOMP_CPU_AFFINITY
。我设置了GOMP_CPU_AFFINITY=0-7
和OMP_NUM_THREADS=4
。两个节点用于计算。每个节点有2个芯片,每个芯片有4个内核。我在每个节点放置一个进程,每个进程分叉4个线程。如果GOMP_CPU_AFFINITY
未设置,则OpenMP会加快该程序的速度。如果GOMP_CPU_AFFINITY
设置,以下是返回和OpenMP不起作用:OpenMP线程亲和力与GOMP_CPU_AFFINITY和sched_setaffinity
OMP: Warning #123: Ignoring invalid OS proc ID 1.
OMP: Warning #123: Ignoring invalid OS proc ID 2.
OMP: Warning #123: Ignoring invalid OS proc ID 3.
OMP: Warning #123: Ignoring invalid OS proc ID 4.
OMP: Warning #123: Ignoring invalid OS proc ID 5.
OMP: Warning #123: Ignoring invalid OS proc ID 6.
OMP: Warning #123: Ignoring invalid OS proc ID 7.
输出看起来好像OpenMP运行时将您的系统看作只有一个CPU。什么编译器和操作系统是什么? – 2014-10-31 18:03:25
@HristoIliev我今天也得到了这个,Intel Fortran 14和GOMP_CPU_AFFINITY =“0-7:2”。奇怪的是,我正在经常使用这种设置,现在只是从家里匆匆而过。 – 2014-11-01 20:57:45
@VladimirF,如果你的shell会话在cgroups容器内的某种程度上被限制在一个非常窄的CPU掩码内,就可能发生这种情况。我根本无法想出其他合理的解释。 – 2014-11-02 00:19:20