2014-10-31 1050 views
1

我想要将OpenMP线程绑定到CPU。已经尝试了两种方法。第一个是sched_setaffinity。每次线程分叉时,我调用sched_setaffinity将OpenMP线程绑定到CPU。看来每次绑定都太昂贵了。是否真的需要每次绑定或绑定一次?第二个是GOMP_CPU_AFFINITY。我设置了GOMP_CPU_AFFINITY=0-7OMP_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. 
+2

输出看起来好像OpenMP运行时将您的系统看作只有一个CPU。什么编译器和操作系统是什么? – 2014-10-31 18:03:25

+0

@HristoIliev我今天也得到了这个,Intel Fortran 14和GOMP_CPU_AFFINITY =“0-7:2”。奇怪的是,我正在经常使用这种设置,现在只是从家里匆匆而过。 – 2014-11-01 20:57:45

+0

@VladimirF,如果你的shell会话在cgroups容器内的某种程度上被限制在一个非常窄的CPU掩码内,就可能发生这种情况。我根本无法想出其他合理的解释。 – 2014-11-02 00:19:20

回答

0

使用OpenMP 4.0,可以设置亲和力每个并行区域

#pragma omp parallel proc_bind(close) 

嵌套并行性,还可以在使用proc_bind(spread)外部区域先做粗粒刨削。

+0

OP是使用GCC 4.6.0,它只支持OpenMP 3.0。 – 2014-11-10 09:51:43