2012-11-06 130 views
0

我能for循環做簡單的OpenMP中的表單中的我的臺式機/筆記本電腦(什麼,我確實有一個溫和的簡化...)羣集的單個節點上運行OpenMP

#include <stdlib.h> 
#include <stdio.h> 
#include <omp.h> 
%%%% #include other libraries... 

int main(void){ 
. 
. 
. 
%%% declare and initialize variables. 
. 
. 
. 

#pragma omp parallel for collapse(3) shared(tf, p, Fx, Fy, Fz) private(v, i,j,k,t0) 
for (i = 0; i < Nx; i++){ 
for (j = 0; j < Ny; j++){ 
for (k = 0; k < Nz; k++){ 

v[0] = Fx[i][j][k]; 
v[1] = Fy[i][j][k]; 
v[2] = Fz[i][j][k]; 
///My_fn changes v and then I put it back into Fx, Fy, Fz 
My_fn(v, t0, tf, p); 
Fx[i][j][k] = v[0]; 
Fy[i][j][k] = v[1]; 
Fz[i][j][k] = v[2]; 
} 
} 
} 
} 

如果需要,我甚至可以在我的筆記本電腦上指定n_threasds = 1,2,3或4個內核,在頂部添加omp_set_num_threads(n_threads);,我注意到我想要的性能。但是,在使用羣集時,我會對此發表評論。

我有機會到羣集,並希望到集羣,因爲單個節點上運行的代碼具有節點多達48個內核和我的筆記本電腦只有4。當我使用羣集,編譯後,I型到終端

$export OMP_NUM_THREADS=10 
$bsub -n 10 ./a.out 

但程序運行不正常:I輸出到一個文件,看看它花了0秒到運行,和FX,Fy和Fz的的值是它們是什麼,當我開始他們,所以看起來循環甚至沒有運行。

編輯:管理羣集的人員解決了這個問題,並且可能對該羣集非常具體,因此我提醒人們將問題與他們的具體案例聯繫起來。

+0

當你寫* cluster *我想* distributed-memory *。您要採取哪些步驟來確保OpenMP作業僅在羣集的一個節點上運行? –

+0

是的,OpenMP只能在一臺計算機上運行,​​但在有權訪問的集羣上,有許多節點的20 - 46處理器比我的4核心筆記本電腦更好... – db1234

+1

然後,您發送給我們完全錯誤的方向與你給我們的信息。因此,您的問題與羣集無關。我建議關閉這個問題(標題和所有內容都是完全誤導性的),並且正確地重新表達它,然後回來一個新的問題。 –

回答

1

我不確定我是否正確理解您的任務,但我擔心您的想法是OpenMP會自動在集羣上以分佈式方式運行您的應用程序。

OpenMP並不是用於這樣的任務,它假設您在共享內存設置中運行您的代碼。對於分佈式設置(僅通過網絡鏈接連接的處理器),還有其他工具,即MPI。但是,這樣的設置比使用openMP時習慣的#pragma註釋要複雜得多。

+0

是的,OpenMP只能在單臺計算機上運行,​​但在有權訪問的集羣上,有許多節點20 - 46處理器,比我的4核心筆記本電腦更好... – db1234

2

在我看來,這個問題與編程無關,而是在您的羣集上使用批處理系統(又名分佈式資源管理器)。通常的做法是編寫腳本,並在腳本集OMP_NUM_THREADS內設置授予的插槽數。您的批處理系統似乎是LSF(胡亂猜測的基礎上,bsub存在),那麼你大多喜歡有腳本類似的東西(我們稱之爲job.sh):

#BSUB -n 10 

export OMP_NUM_THREADS=$LSB_DJOB_NUMPROC 
./a.out 

然後提交腳本與bsub < job.sh。 LSF導出LSB_DJOB_NUMPROC環境變量中授予作業的插槽數量。通過完成作業,您可以提交具有不同參數的相同作業文件,例如:bsub -n 20 < job.sh。您可能需要向調度程序提示您希望在同一節點上擁有所有插槽。通常可以通過指定-R "span[ptile=n]"來做到這一點。可能有其他的方法來做到這一點,例如一個esub可執行文件,你可能需要指定:

#BSUB -a openmp 

請注意,Stack Overflow是不是在您的管理員存儲羣集文件。你最好問問他們,而不是我們。

1

斯托伊奇是正確的,但我認爲你應該在你的sh文件添加

#BSUB -R "span[hosts=1]"   # run on a single node 

。 ptile選項僅用於指定每個節點的任務數 ,請參見i。Ë

https://doc.zih.tu-dresden.de/hpc-wiki/bin/view/Compendium/PlatformLSF

否則,根據集羣的隊列設置,你也許會

bqueues -l 

任務獲得將每一個節點,這是提供給你拼命地跑。

0

如果節點有24個核心

#PBS -l nodes=1:ppn=24 
在我的系統

。可能在你使用的集羣中會像

#BSUB -l nodes=1:ppn=24 
相關問題