2017-01-27 32 views
3

我正在編寫一個程序(使用C++ 11),可以選擇使用MPI並行運行程序。該項目使用CMake進行配置,如果CMake無法找到並自動禁用MPI,並顯示關於它的警告消息。使用mpirun/mpiexec運行時檢測不使用MPI

但是,我擔心用戶配置和編譯HPC羣集上的程序的完全合理的用例,忘記加載MPI模塊,並且沒有注意到警告。同樣的用戶可能會嘗試運行該程序,注意找不到mpirun,包括MPI模塊,但忘記重新編譯。如果用戶然後用mpirun運行程序,這將會起作用,但是程序會運行多次而沒有任何並行化,因爲MPI在編譯時被禁用。爲了防止用戶認爲程序並行運行,我想在這種情況下讓程序顯示錯誤消息。

我的問題是:如何檢測我的程序是否正在並行運行而不使用MPI庫函數(因爲MPI在編譯時被禁用)? mpirun只是多次啓動程序,但並沒有告訴它啓動的進程是關於它們並行運行的,據我所知。

我想過讓程序編寫一些測試文件,然後檢查是否該文件已經存在,但不同之處在於,這可能會非常棘手做到因併發的問題,有沒有保證mpirun甚至會推出共享文件系統的節點上的各種進程。

我還考慮過使用系統變量在兩個進程之間進行通信,但據我所知,沒有系統獨立的方式來做到這一點(並且,這可能會導致併發問題,因爲沒有辦法協調各個進程之間的系統調用)。

所以目前我已經沒有想法了,我非常感謝任何可能幫助我實現這一目標的建議。首選的解決方案應該獨立於操作系統,儘管只有UNIX的解決方案已經有很大的幫助。

+0

'ldd'命令可用於檢查程序是否鏈接到MPI庫。例如,請參閱https://cc.ulb.ac.be/hpc/Howto_hydra/compile_mpi.php。也許程序可以自己'ldd'(使用'argv [0]')並解析'mpicc --show'的輸出以查看模塊是否已經加載......如果結果不兼容,程序可以顯示一個錯誤。必須有最乾淨的方法來做到這一點... – francis

+0

只需在開頭顯示一個大胖橫幅:「這是FOOBAR在串行模​​式下運行」。細心的用戶會注意到。 –

回答

0

基本上,您希望運行檢測是否正在由您的非MPI代碼路徑中的mpirun等運行。有一個非常類似的問題:How can my program detect, whether it was launch via mpirun已經提出了一種非便攜式解決方案。

檢查由mpirun設置的環境變量。參見例如: http://www.open-mpi.org/faq/?category=running#mpi-environmental-variables

作爲另一種選擇,你可以得到process id of the parent process和它的process name並將其與已知的MPI發射的二進制文件,如orted,slurmstepd,hydra?? 的列表進行比較。不幸的是,一切都是不可移植的。

由於啓動本身並沒有被MPI標準明確定義,因此無法通過標準的方法來檢測它。

1:只有從我的記憶中,請不要逐字列出。


從一個用戶體驗的角度,我認爲,處處呈現出明確的信息,如何在程序正在運行,如:

連續運行FancySimulator。如果您將此視爲mpirun的一部分,請使用FANCYSIM_MPI = True重建FancySimuilator。

與120個MPI進程並行運行FancySimulator。

「解決」 問題。獲得120條亂碼的用戶將很有希望注意到。