我正在尝试将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不起作用:
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.
答案 0 :(得分:0)
使用openmp 4.0,可以设置每个并行区域的亲和力
#pragma omp parallel proc_bind(close)
使用嵌套并行性,也可以在外部区域使用proc_bind(spread)
来进行粗粒化。