2011-03-28 29 views
5

如果我需要「並行」運行很多串行程序(因爲問題很簡單但很耗時 - 我需要爲同一個程序讀取許多不同的數據集),如果我只使用一個節點,則解決方案很簡單:。我所做的只是在每個命令之後繼續提交帶有&符號的串行作業,例如在作業腳本中:PBS批處理系統是否跨節點移動多個串行作業?

./program1 & 
./program2 & 
./program3 & 
./program4 

這將自然地運行在不同的處理器上的每個串行程序。這適用於登錄服務器或獨立工作站,當然也適用於只需要一個節點的批量作業。

但是如果我需要運行同一程序的110個不同實例來讀取110個不同的數據集呢?如果我使用提交110 ./program#命令的腳本提交給多個節點(比如14),那麼批處理系統會在不同節點上的不同處理器上運行每個作業,還是會嘗試將它們全部運行在同一個節點上, 8核心節點?

我試圖使用一個簡單的MPI代碼來讀取不同的數據,但會導致各種錯誤,110個進程中有100個成功,其他崩潰。我也考慮過作業陣列,但我不確定我的系統是否支持它。

我已經在個別數據集上廣泛測試了串行程序 - 沒有運行時錯誤,並且我沒有超過每個節點上的可用內存。

回答

5

不,PBS不會自動在各節點之間爲您分配作業。但這是一件很常見的事情,你有幾個選擇。

  • 最簡單和最一些爲advantagous你的方法就是一堆任務爲1個節點大小的塊,並提交這些捆綁作爲單獨的作業。這會讓你的工作更快開始;一個單節點的作業通常會比(比方說)14節點作業更快地進行計劃,這是因爲計劃中的單個節點的孔數多於14個。如果所有作業的時間大致相同,因爲那時做這個部門很簡單。

  • 如果您確實想在一項工作中完成所有工作(比如簡化簿記),您可能有權訪問pbsdsh命令,也可能無法訪問該命令;有一個很好的討論here。這使您可以在作業中的所有處理器上運行單個腳本。然後編寫一個腳本,查詢$ PBS_VNODENUM以查明它是哪個nnodes * ppn作業,並運行相應的任務。

  • 如果不是pbsdsh,Gnu parallel是另一種可以極大地簡化這些任務的工具。這就像xargs,如果你熟悉它,但會並行運行命令,包括在多個節點上運行。所以你要提交你的(比如說)14節點作業,並讓第一個節點運行一個gnu並行腳本。好的是,即使作業的長度不一樣,它也會爲你安排時間。我們在系統上爲用戶提供的使用gnu並行處理這些事情的建議是here。請注意,如果您的系統上沒有安裝gnu parallel,並且出於某種原因您的系統管理員不能這樣做,您可以將它設置在您的主目錄中,這不是一個複雜的構建。

+0

非常感謝,我現在正在實施您的一些建議。 – 2011-03-28 17:04:07

+0

Gnu並行+1 - 一個奇妙的工具。 – Owen 2014-08-29 04:15:05

2

您應該考慮job arrays

簡單地說,你在你的shell腳本插入#PBS -t 0-109(其中範圍0-109可以是你想要的任何整數的範圍,但你說你有110個數據集)和扭矩:

  • 運行腳本的110個實例,使用您指定的資源(在#PBS標記的腳本中或在提交時作爲參數)分配每個
  • 爲每個作業分配一個從0到109的唯一整數到環境變量PBS_ARRAYID

假設您有權訪問代碼中的環境變量,您可以告訴每個作業在數據集編號PBS_ARRAYID上運行。