2014-10-31 136 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