2015-02-07 352 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