2014-06-04 79 views
2

我正在鏈接一個使用OpenMPI內部進程支持構建的庫。使用MPI的鏈接庫,我不知道,發生了什麼後面發生了什麼

我的應用程序正在構建,沒有MPI支持,我鏈接到這個庫。我不知道mpi問題背後發生了什麼。如果庫A從openmpi加載/調用函數,這是否意味着我可以使用runmpi運行我的應用程序以使庫進程自行分發?如果我決定讓應用程序MPI知道並且想要使用mpich2而不是OpenMPI,或者如果我想使用鏈接到mpich而不是openmpi的庫B,庫和我的應用程序是否會在各自的消息空間中運行?通常強制應用程序開發人員明確鏈接mpi實現以使用啓用了mpi的庫?

回答

1

通常的做法是開發人員最終編譯並鏈接所有內容與單個MPI實現。哪裏有依賴於MPI的庫,我通常會在系統上看到每個可用MPI實現的庫的構建。如果你能以某種方式設法鏈接兩個MPI實現,並拿出單獨的MPI_InitMPI_COMM_WORLD定義來在單獨的代碼段中使用,它甚至可以工作。儘管如此,這將是非常脆弱的。不要這樣做。

至於你以前的問題,幾乎可以使用MPI將應用程序調用到庫中,並讓它做正確的事情。首先,代碼將不得不呼叫MPI_Init某處。無論是在客戶端還是完全封裝在圖書館中,都可能有所不同。圖書館將必須知道它應該使用什麼MPI通信器;通常客戶端代碼會通過。最後,客戶端代碼必須考慮到它將在所有MPI進程上運行,而不僅僅是其中之一。因此,如果它執行的任何IO或其他計算應該只發生在一個進程中,那麼您需要相應地設置條件。

+0

感謝您的澄清。另一個問題,雖然有點主觀。如果應用程序不使用MPI,但庫在內部傳遞MPI數據類型,是否有必要要求開發人員確保庫標頭將正確的mpi.h實現*和*鏈接與正確的mpi進行導入,即使我們根本不需要這些(當應該由庫對象加載並在源代碼中而不是在頭文件中處理時,這麼多額外的鏈接)。我正在尋找一些用於報告/更改請求的燃料。 – crasic

+0

如果庫完全使用MPI,則對於整個應用程序而言,編譯和鏈接相同的MPI實現是非常必要的。這正是它在這個領域的工作原理。作爲編寫類似於使用MPI的庫的代碼的人,我會拒絕這樣的錯誤報告/更改請求,因爲它是無效的,而不是值得使用我的努力 – Novelocrat