我有一个带编译器的系统A(又名主机)和一个系统B(又名Target),我想运行一个MPI应用程序。在系统B上没有编译器或mpirun。我想执行以下操作:在系统A上编译mpirun(来自openmpi),然后在系统B上使用它(在系统A上编译可执行文件)。我从未编译过不同的平台。这件事有用吗?如何处理共享库?我看到mpirun链接到:
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
输出
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
目标
上uname -a
的输出
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 :(得分:0)
可以在一个平台上编译并在另一个平台上执行。我经常使用ifort和mpif90编译Fortran二进制文件。我刚刚运行了一个测试,我在OpenSUSE 2.6.34内核x86_64上使用ifort编译器和mpif90编译了一个可执行文件,并在没有安装mpi库的Amazon Linux内核版本3.14 x86_64上运行它。
问题是如果没有mpirun(或mpiexec),您将只能运行该程序的单个实例。因此,如果您必须启动多个实例,则需要在其他计算机(系统B)上使用类似mpirun的功能来启动多个实例。