2013-03-04 69 views
1

我有一個具有不同輸入參數的程序,它們應該在程序中執行相同的功能。如何使每組輸入參數在網格中的不同處理器上工作?如果你有任何想法,請幫助。會真的幫助很多!程序使用C++在不同的處理器中改變輸入參數

+0

你是什麼意思「在網格中的不同處理器上工作」? – Pradheep 2013-03-04 09:58:35

+0

通過不同的處理器,你的意思是像Athlon-64和Intel iCore7,還是你的意思是PowerPC和x86?你想改變什麼,爲什麼? [另一個XY問題,你試圖解決問題X,認爲Y是解決方案,並詢問如何做Y] – 2013-03-04 09:59:32

+0

由不同的處理器我的意思是,在網格環境中的不同節點。我正試圖在各種計算機之間分發這些工作以便快速計算。所以,我想讓每組輸入參數在每個節點上運行。我清楚了嗎? – BLACK 2013-03-04 10:10:01

回答

0

您需要指定您使用的並行範例。 MPI,OpenMP等等。

通常應用的方法是使用一些通信通道,並將參數向量從「主」進程發送到所有其他通道。

當它們相同時廣播參數是最常見的,但主要任務可以迭代一組參數,並通過1對1通信器將每個參數發送給彼此的任務。

有時參數是在一個或一組文件中準備的,每個任務讀取它自己的設置參數。

一切都取決於您的應用程序部署的網站和工作規模。即當你在超級計算機上有一百萬個工作任務時,文件方法可能是一個壞主意。

+0

任務是相同的,但參數不同,需要運行相同的任務。你能不能用更簡單的語言來解釋一下,我是編程初學者! – BLACK 2013-03-04 10:14:03

+0

程序已經與Open MP並行使用,以使用節點中的所有線程。但現在我試圖讓程序本身在不同的節點上運行。所以,如果我沒有錯,我們將分佈式內存和共享內存模型結合起來。 – BLACK 2013-03-04 10:18:06

+0

你用什麼系統將任務發送到網格節點?任務之間有任何溝通嗎?你似乎不知道發生了什麼。你說任務是一樣的,只有不同的參數。那麼,我想他們之間沒有任何溝通,並且介紹這樣做會矯枉過正。另一方面,你說你建議你使用分佈式內存。這是什麼? – luk32 2013-03-04 10:35:17

1

這取決於您使用的羣集資源管理器。大多數支持所謂的陣列作業,其中運行同一作業的許多實例,並且參數(通常是當前作業的簡單整數索引)通過環境傳遞。這就是我們所說的窮人的並行計算平臺:)

因爲我只廣泛用於的Sun Grid Engine(現Oracle網格引擎,也Open Grid SchedulerSon of Grid Engine名下的開源叉存在)和平臺LSF(現在IBM LSF,也可以作爲非常類似的開源openlava作業調度程序),我只能寫關於它們(以及關於Torque的某種程度)。

隨着SGE陣列作業可能看起來是這樣的:

#!/usr/bin/env zsh 
#$ -cwd 
#$ -N jobname 
#$ -t 1-100 
## Other resource requirements 
#$ -l h_rt=0:30:00 
#$ -l h_mem=1200M 
#$ -pe openmp 12 

export OMP_NUM_THREADS=12 
density=$((SGE_TASK_ID * 0.06))  # zsh specific 
/path/to/executable -d density < input_${SGE_TASK_ID} > output_${SGE_TASK_ID} 

這裏-t 1-100參數qsub創造了100個任務,編號爲1100陣列作業。 SGE傳遞SGE_TASK_ID環境變量中的當前任務編號。您可以使用它來選擇適當的輸入文件,或者可以使用它來計算其他輸入參數。 SGE會自動將作業的輸出和錯誤文件與任務ID一起後綴。請注意,在$(())中使用浮點文字似乎是zsh特定的。在轉矩

陣列作業準確創建的相同的方式經由-t參數SGE。扭矩之前的版本2.3 -t接受一個參數 - 任務的數量,然後從0這個數減1號任務,扭矩2.3一個開始可以像SGE指定範圍:

#!/usr/bin/env zsh 
#PBS -N jobname 
#PBS -l nodes=1,walltime=00:30:00 
#PBS -t 1-100 

cd ${PBS_O_WORKDIR} 

export OMP_NUM_THREADS=12 
density=$((PBS_ARRAYID * 0.06))  # zsh specific 
/path/to/executable -d density < input_${PBS_ARRAYID} > output_${PBS_ARRAYID} 

與上海黃金交易所的主要區別是任務ID環境變量名爲PBS_ARRAYID。請參見扭矩手冊中​​的Job Submission部分。

隨着LSF陣列作業可能看起來是這樣的:

#!/usr/bin/env zsh 

#BSUB -J jobname[1-100] 
# Have separate error file for each job 
#BSUB -e error_%I 
# Other resource requirements, e.g. 
#BSUB -W 0:30 
#BSUB -M 1200 
#BSUB -n 1 
#BSUB -x 

export OMP_NUM_THREADS=12 
density=$((LSF_JOBINDEX * 0.06))  # zsh specific 
/path/to/executable -d density < input_${LSF_JOBINDEX} > output_${LSF_JOBINDEX} 

下面附加的範圍內規範[1-100]後的作業名稱創建一個數組的工作。 LSF通過LSF_JOBINDEX環境變量傳遞任務ID。您可以完全按照與SGE情況相同的方式使用它。

+1

非常感謝您給我們的回覆。 – BLACK 2013-03-19 15:22:21

+0

你是說你在SGE ARRAY JOBS中,每個SGE_TASK_ID都可以在網格的不同節點上工作嗎?或者我應該指定它在某個地方使用不同的節點?以及如何使用不同任務的SGE_TASK_ID來計算程序中的不同輸入參數? – BLACK 2013-03-19 16:18:05

+0

提交和陣列作業就好像有許多具有相同作業文件的作業一樣被提交。由SGE根據可用資源和各個作業實例的要求(在陣列作業中,所有實例具有相同的資源需求)決定在哪裏執行每個實例。 SGE爲你提供工作號碼,你必須把它翻譯成有用的東西。我已經向你展示了一個例子。 – 2013-03-19 19:53:55

相關問題