2015-02-07 351 views
0

我有一個帶有編譯器和系統B(又名Target)的系統A(aka主機),我想運行一個MPI應用程序。在系統B上沒有編譯器或mpirun。我想這樣做:在系統A上編譯mpirun(來自openmpi),然後在系統B上使用它(在系統A上編譯可執行文件)。我從來沒有編譯過一個不同的平臺。這件事能工作嗎?我如何處理共享庫?我看到mpirun鏈接到:爲不同的平臺編譯mpirun和mpif90(交叉編譯?)

linux-vdso.so.1 => (0x00002aaaaaaab000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a89e00000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003a89600000) 
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a89a00000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003a89200000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003a88e00000) 

我必須將mpirun靜態鏈接到系統A上的庫嗎?我怎麼做?


另外,我想知道我是否可以編譯系統A mpif90,這樣我就可以直接用它來編譯的系統B.程序記住,沒有對系統B沒有編譯器,和我不甘心的目標

安裝它們的 uname -a


對主機的uname -a輸出

Linux host 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux 

輸出

Linux target 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux 

到目前爲止,我已經嘗試使用下面的配置

CC=icc 
FC=ifort 
CXX=icpc 
LDFLAGS=-static-intel 

./configure --prefix=/gpfs/data/garzilli/data/local/openmpi-1.8.4-cc/ --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --enable-static --disable-shared 

我知道,在這種情況下,我不是技術上交叉編譯編譯,因爲主機和建設相吻合,原則上他們可能會有所不同。也許,我是否也應該設置--target,因爲我在編譯一個編譯器?

+0

這兩臺電腦有多大的區別?他們有什麼操作系統(和內核版本)? – 2015-02-07 19:05:23

+0

我在主機和目標上添加了'uname -a'的輸出,你還想知道什麼? – simona 2015-02-07 19:11:30

回答

0

可以在一個平臺上編譯並在另一個平臺上執行。我經常使用ifort和mpif90編譯Fortran二進制文件。我剛剛運行了一個測試,在OpenSUSE 2.6.34內核x86_64上使用ifort編譯器和mpif90編譯了一個可執行文件,並在沒有安裝mpi庫的Amazon Linux內核版本3.14 x86_64上運行它。

問題是,如果沒有mpirun(或mpiexec),您將只能運行該程序的單個實例。因此,如果您必須啓動多個實例,則需要在另一臺計算機(系統B)上使用類似mpirun的啓動多個實例。

+0

你很幸運,服務器是新的而不是舊的。我通常會在HPC集羣上遇到舊版本的GLIBC,並且從更新的桌面發行版中獲取任何二進制文件以在其中工作是一件很痛苦的事情。 – 2015-02-10 12:24:32

+0

但是,然後讓它與本地隊列管理器和Infiniband驅動程序一起工作將非常困難。 – 2015-02-10 12:26:21

+0

我在舊機器上運行過的經驗是,它們可能不是64位,或者它們使用的是舊版本的C庫。據我所知,所提到的兩個版本都使用libc6,它們都是x86_64機器。 – Wes 2015-02-10 12:30:57