2015-11-03 75 views
0

我使用openMP庫使我的代碼並行。我需要在我大學的HPC(16個節點)上運行代碼。當我運行代碼時,HPC會將不同刀片的節點隨機分配給我的程序。我不知道節點是否有共享內存,但代碼正常執行。我的問題:在羣集上使用OpenMP

  1. 是應該的代碼,如果內存分配給我的錯誤,而不是共享或它運行正常,但產生錯誤的數據?

  2. 有沒有辦法知道我的代碼使用的節點是否具有共享內存?

(我知道我可以使用MPI使用的代碼是在分佈式內存,但目前我沒有對的時間。)

回答

2

OpenMP的是,在上面運行的並行編程模型共享內存系統只能通過線程的方式,除非使用特殊的通信調用(如MPI,系統套接字調用或PGAS編程模型),否則不能與其他節點通信。 OpenMP應用程序執行正常的事實是正常的,因爲您始終可以在節點中創建線程。

關於你的問題:

1)OpenMP運行時只會看到一個節點中的共享資源,不是所有的資源的節點之外。這意味着OpenMP二進制文件不會擴展到HPC羣集的其他節點(同樣,除非您使用MPI)。關於計算資源,除非您通過OMP_NUM_THREADS環境變量顯式請求不同數量的線程,否則OpenMP運行時將創建與處理器一樣多的線程。

2)您的代碼將始終在線程之間共享內存,這是由於線程描述的原因。維基百科可以在同一進程中存在https://en.wikipedia.org/wiki/Thread_(computing)

的多個線程,執行 同時(在別人面前一個起點完成)並共享資源 如內存,而不同的進程不共享這些資源 。

+0

這是否意味着理論上我可以在單個內核上運行儘可能多的線程? –

+1

是的,你可以做到這一點。這就是所謂的超額認購。通過產生更多的MPI進程,也可以單獨使用MPI,而不是集羣中可用的處理器數量。這就是說,如果所有線程同時運行,超額認購可能會導致性能低下,因爲沒有足夠的計算資源用於所有線程(或MPI應用程序中的進程)。 – Harald

+0

爲了完整起見,有DSM解決方案,它允許在多個羣集節點上運行未經修改的OpenMP應用程序:[請參閱此處](http://stackoverflow.com/q/13475838/1374437)。 –