我正在編寫一個程序(使用C++ 11),可以選擇使用MPI並行運行程序。該項目使用CMake進行配置,如果CMake無法找到並自動禁用MPI,並顯示關於它的警告消息。使用mpirun/mpiexec運行時檢測不使用MPI
但是,我擔心用戶配置和編譯HPC羣集上的程序的完全合理的用例,忘記加載MPI模塊,並且沒有注意到警告。同樣的用戶可能會嘗試運行該程序,注意找不到mpirun
,包括MPI模塊,但忘記重新編譯。如果用戶然後用mpirun
運行程序,這將會起作用,但是程序會運行多次而沒有任何並行化,因爲MPI在編譯時被禁用。爲了防止用戶認爲程序並行運行,我想在這種情況下讓程序顯示錯誤消息。
我的問題是:如何檢測我的程序是否正在並行運行而不使用MPI庫函數(因爲MPI在編譯時被禁用)? mpirun
只是多次啓動程序,但並沒有告訴它啓動的進程是關於它們並行運行的,據我所知。
我想過讓程序編寫一些測試文件,然後檢查是否該文件已經存在,但不同之處在於,這可能會非常棘手做到因併發的問題,有沒有保證mpirun
甚至會推出共享文件系統的節點上的各種進程。
我還考慮過使用系統變量在兩個進程之間進行通信,但據我所知,沒有系統獨立的方式來做到這一點(並且,這可能會導致併發問題,因爲沒有辦法協調各個進程之間的系統調用)。
所以目前我已經沒有想法了,我非常感謝任何可能幫助我實現這一目標的建議。首選的解決方案應該獨立於操作系統,儘管只有UNIX的解決方案已經有很大的幫助。
'ldd'命令可用於檢查程序是否鏈接到MPI庫。例如,請參閱https://cc.ulb.ac.be/hpc/Howto_hydra/compile_mpi.php。也許程序可以自己'ldd'(使用'argv [0]')並解析'mpicc --show'的輸出以查看模塊是否已經加載......如果結果不兼容,程序可以顯示一個錯誤。必須有最乾淨的方法來做到這一點... – francis
只需在開頭顯示一個大胖橫幅:「這是FOOBAR在串行模式下運行」。細心的用戶會注意到。 –