‘壹’ 【Fortran并行科学计算】——Hello World程序
MPI(message passing interface),是一个消息传递接口。MPI的函数总共有287个。
想实现一个MPI并行计算的程序的话,只要掌握MPI的工作机理和6个简单的MPI函数便可以了,本文介绍4个简单MPI函数:MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。
注意:以下调用格式为Fortran格式,大部分教程都是C语言的MPI介绍,这里以及以后的文章都是以Fortran为基础,尤其要注意Fortran不分大小写。
先给出一个最简单的Hello_world的Fortran + MPI的程序,在此基础上来分析MPI的4个最简单的函数——MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。
MPI_Init用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。
MPI_Finalize则是结束MPI执行环境。
MPI_Comm_rank就是来标识各个MPI进程的,告诉调用该函数的进程“我是谁?”。
MPI_COMM_SIZE用来标识相应进程组中有多少个进程。
2.1. 将以上内容保存为hello_world.f90,上传到服务器的文件夹/home/xldeng/mpi里面:
2.2. 编译hello_world.f90为hello_world,并用ls查看内容:
2.3. 使用服务器里面的命令来调用不同的节点上面的核来计算:
3.1 . 注意程序中的一个小细节:
含义为调用mpi的库函数,因为使用的是Intel MPI + Fortran90,所以调用的方式为:use mpi。Fortran77可能需要 include "mpif.h"。
3.2 . 在2.2节中的mpiifort是ifort的并行使用方法,检验mpiifort的用法:which mpiifort或者是mpiifort -v。
3.3 . 在2.3节中的说明:本程序的运行平台为服务器上,所以使用的是 MPI使用指南 | 武汉大学超算中心 中提供的提交方法。如果在单台服务器上面,可以使用如下命令:
来运行程序。
‘贰’ mpif90是谁的编译器
不是谁的编译器,这只是一段程序。mpif90是可以从不同的编译器编译得到的,而服务器上提供给你的mpicc,mpicxx和mpif90可能只是某一种程序。
‘叁’ 编译vasp出现错误,求帮助,如能帮助,不胜感激
安装环境centOS6.5+Intel parallel studio xe 2013+openmpi+fftw
这是修改过makefile后make出现的错误:
fpp -f_com=no -free -w0 base.F base.f90 -DMPI -DHOST=\\"linuxIFC\\" -DIFC -DCACHE_SIZE=4000 -DPGF90 -Davoidalloc -DNGZhalf -DMPI_BLOCK=8000 -Duse_collective -DscaLAPACK -DRPROMU_DGEMV -DRACCMU_DGEMV
mpif90 -FR -names lowercase -assume byterecl -O2 -ip -I/opt/intel/composer_xe_2013.2.146/mkl/include/fftw -c base.f90
mpif90: error while loading shared libraries: libimf.so: cannot open shared object file: No such file or directory
make: *** Error 127
这是我的修改过的makefile:
1 .SUFFIXES: .inc .f .f90 .F
2 #-----------------------------------------------------------------------
3 # Makefile for Intel Fortran compiler for Pentium/Athlon/Opteron
4 # based systems
5 # we recommend this makefile for both Intel as well as AMD systems
6 # for AMD based systems appropriate BLAS (libgoto) and fftw libraries are
7 # however mandatory (whereas they are optional for Intel platforms)
8 # For Athlon we recommend
9 # ) to link against libgoto (and mkl as a backup for missing routines)
10 # ) odd enough link in libfftw3xf_intel.a (fftw interface for mkl)
11 # feedback is greatly appreciated
12 #
13 # The makefile was tested only under Linux on Intel and AMD platforms
14 # the following compiler versions have been tested:
15 # - ifc.7.1 works stable somewhat slow but reliably
16 # - ifc.8.1 fails to compile the code properly
17 # - ifc.9.1 recommended (both for 32 and 64 bit)
18 # - ifc.10.1 partially recommended (both for 32 and 64 bit)
19 # tested build 20080312 Package ID: l_fc_p_10.1.015
20 # the gamma only mpi version can not be compiles
21 # using ifc.10.1
22 # - ifc.11.1 partially recommended (some problems with Gamma only and intel fftw)
23 # Build 20090630 Package ID: l_cprof_p_11.1.046
24 # - ifort.12.1 strongly recommended (we use this to compile vasp)
25 # Version 12.1.5.339 Build 20120612
26 #
27 # it might be required to change some of li
‘肆’ 安装mpi 在mac 上~ 后来编译很简单的程序。但是出现错误,不知道在安装上出现什么错误了~
mpi装错了
‘伍’ 老大们请问下编译mpi的问题
1、icc
Intel C/C++编译器接受遵守ANSI C/C++ , ISO C/C++ standards,GNU inline ASM for IA-32 architecture标准的输入。与linux下常用的gcc兼容并支持更大的C语言扩展,包括源文件、命令行参数、目标文件。不支持gcc的inline方式的汇编。例,f.c
#include
int main(int argc, char* argv[]){
printf("Hello\n");
return 0;
}
编译:icc -c f.cpp -o f.o
链接:icc f.o -o f
运行:./f
注意,编译与链接都由icc来完成,icc常用命令行参数:
-o 输出文件命名
-I include路径
-L lib路径
-l 包含的lib名
-c 仅生成目标文件(*.o),不链接
-On n=0,1,2,3 编译器优化选项,n=0关闭编译器优化,n=3使用最激进的优化
-c99[-] 打开/关闭 c99规范的支持
详细的请参照icc的manpage.
2、ifort
Intel Fortran编译器支持F77/90/95标准并与CFV(Compaq Visual Fortran)兼容。例,f.f90
program f
print *, "Hello"
stop
end
编译:ifort -c f.f90 -o f.o
链接:ifort f.o -o f
运行:./f
编译与连接同样由ifort来完成,ifort常用命令行参数:
-o 输出文件命名
-I include路径
-L lib路径
-l 包含的lib名
-c 仅生成目标文件(*.o),不链接
-On n=0,1,2,3 编译器优化选项,n=0关闭编译器优化,n=3使用最激进的优化
-std90 使用F90标准编译
-std95 使用F 95标准编译
-f77rtl 编译使用F77运行方式的代码(用于解决特殊问题)
These options optimize application performance for a particular Intel? processor or family of processors. The compiler generates code that takes advantage of features of the specified processor.
Option
Description
tpp5 or G5 Optimizes for Intel? Pentium? and Pentium? with MMX? technology processors.
tpp6 or G6 Optimizes for Intel? Pentium? Pro, Pentium? II and Pentium? III processors.
tpp7 or G7 Optimizes for Intel? Pentium? 4, Intel? Xeon?, Intel? Pentium? M processors, and Intel? Pentium? 4 processors with Streaming SIMD Extensions 3 (SSE3) instruction support.
On Intel? EM64T systems, only option tpp7 (Linux) or G7 (Windows) is valid.
About tpp:
Intel Fortran Compiler Options:
Intel(R) Fortran Compiler Options:
ifort编译器提供了非常多的优化参数
$ ifort --help | more 查看就可以
也可以定位到某个参数
$ifort --help | grep -5 '-mkl'
-5表示显示查找到的行及下面5行的内容。
3、Intel MKL数学库针对Intel系列处理器进行了专门的优化,主要包含的库有:
基本线形代数运算(BLAS)
向量与向量、向量与矩阵、矩阵与矩阵的运算
稀疏线形代数运算
快速傅立叶变换(单精度/双精度)
LAPACK(求解线形方程组、最小方差、特征值、Sylvester方程等)
向量数学库(VML)
向量统计学库(VSL)
高级离散傅立叶变换
编译:
icc multi.c -I/opt/intel/mkl/include –L/intel/mkl/lib –lmpi_ipf –o multi
4、MPI程序编译
消息传递接口(MPI)并行程序设计模型程序的编译命令。例,f.c
include
#include
main(argc,argv)
int argc;
char *argv[];
{
char name[BUFSIZ];
int length;
MPI_Init(&argc,&argv);
MPI_Get_processor_name(name, &length);
printf("%s: hello world\n", name);
MPI_Finalize();
}
编译与连接均使用mpicc,参数与mpicc中定义的编译器相同,这里与icc相同。
mpicc –c hello.c –o hello.o
mpicc hello.o –o hello
运行使用mpirun 命令,将运行需要的节点定义在文件中并在-machinfile中制定。
文件: nodelist
node1
node1
node2
node3
运行:
$mpirun –machefile nodelist –np 4 ./hello
node1: hello world
node1: hello world
node2: hello world
node3: hello world
5、32位向64位的移植
32位程序到64位移植中应注意的常见问题:
数据截断:
由于long类型变量的运算(赋值、比较、移位等)产生。long定义在x86上为32bits,而在ia64上为64bits.容易在与int型变量运算时出现异常。
处理方法:尽量避免不同类型变量间的运算,避免将长度较长的变量赋值到较短的变量中,统一变量长度可以解决这个问题。简单的对于32位转移到64位可以将所有long定义转换为int定义。
‘陆’ 如何在 Oracle Solaris 11 上编译和运行 MPI 程序
要使用 OMPT,需要在系统上安装和运行 Oracle Solaris 11。除了安装过程中使用的 root 权限之外,运行任何 OMPT 实用程序通常无需任何其他特殊权限。
如果您想编译 MPI 程序,则需要安装 Oracle Solaris Studio 12.1 或更高版本。在运行 MPI 程序的节点集群上,可以在其中一个节点上安装 Oracle Solaris Studio 并仅在该节点上编译 openmpi-15 程序包,但在所有节点上都安装该程序包。
要获取 OMPT,请安装 openmpi-15 程序包,该程序包由一个映像包管理系统 (IPS) 信息库托管,您的系统上应配置有该信息库。要验证是否配置了 IPS 信息库,请运行 pkg publisher 命令。
如果尚未 配置 IPS 信息库,请在尝试添加 openmpi-15 程序包之前配置它。否则,程序包添加将失败。
系统应配置了网络访问(如果是通过网络访问 IPS 信息库)或本地配置的从同一系统提供服务的 IPS 信息库。
本文示例使用了本地配置的 IPS 信息库,如 pkg publisher 命令的以下输出所示,该输出指示 IPS 信息库通过 HTTP 托管在 localhost 上。
root@solarix:/usr/share/distro_const# pkg publisher
PUBLISHER TYPE STATUS URI
solaris origin online http://localhost/
验证配置了信息库之后,以 root 身份运行 pkg install openmpi-15 命令添加该分发构造器程序包。然后从 IPS 信息库下载 openmpi-15 程序包并立即安装。
pkg install openmpi-15 命令显示进程的状态,如清单 1 所示,这样便于观察进度。
清单 1:pkg install openmpi-15 命令的输出
root@solarix:~# pkg install openmpi-15
Creating Plan
Packages to install: 2
Create boot environment: No
DOWNLOAD PKGS FILES XFER (MB)
service/picl 0/2 0/1430 0.0/11.9[K
developer/openmpi-15 1/2 1430/1430 11.9/11.9[K
Completed 2/2 1430/1430 11.9/11.9[K
PHASE ACTIONS
Install Phase 1639/1639
PHASE ITEMS
Package State Update Phase 1/2
Package State Update Phase 2/2
Image State Update Phase 1/2
Image State Update Phase 2/2
PHASE ITEMS
Reading Existing Index 1/8
Reading Existing Index 5/8
Reading Existing Index 8/8
Indexing Packages 2/2
安装完 openmpi-15 程序包之后,只需在 PATH 变量中包括 /usr/openmpi/ompi-15/bin,然后就一切准备妥当。
使用 OMPT 编译 MPI 程序
使用 OMPT 编译 MPI 程序有两种方式。您可以使用程序包中包含的编译器包装器(mpicc、mpiCC、mpif77 和 mpif90)或者直接调用编译器。
因为需要包含的 include、library 和 run 路径,建议采用第一种方法。包装器将其不了解的所有选项都传给 Oracle Solaris Studio 编译器,因此您应能够使用包装器实用程序替换 makefile 中编译器的所有实例。
以清单 2 作为示例 MPI 程序,可以使用一行命令编译程序:
mpicc hello.c -o hello.x
清单 2:示例 hello.c 程序
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv) {
int np, me;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&me);
printf("hello from %d of %d\n", me, np);
MPI_Finalize();
return 0;
}
还可以执行两阶段的编译和链接:
mpicc -c hello.c
mpicc hello.o -o hello.x
如果要直接执行编译器而不使用包装器,可以通过向包装器提供 -showme 选项来确定包装器使用的选项:
mpicc -showme hello.c -o hello.x
使用 OMPT 运行 MPI 程序
编译完可执行文件并与 OMPT 库链接之后,可以单独运行该程序或使用并行作业启动器实用程序 mpirun 来运行。
要单独运行程序,只需运行该可执行文件,就跟普通非并行可执行文件一样。但是,随后将由该程序来负责调用相应的 MPI API(如 MPI_Comm_spawn 或 MPI_Comm_spawn_multiple)来生成 MPI 作业的其他进程。
要一开始就创建运行多个进程的 MPI 作业,请使用 mpirun 实用程序。例如,如果您要使用总共 8 个进程在 2 个节点上运行我们的示例 MPI 程序,可以使用以下命令:
mpirun -np 8 -host hostname1,hostname2 hello.x
有几个选项可以与 mpirun 一起用来控制绑定、布局、输出重定向等等。通过执行 mpirun -h 或 man mpirun 可以获取有关这些选项的更多信息。
‘柒’ linux用GCC和mpif90编译程序,出现undefined reference to `..Dm_mpi’错误。请问什么原因呢
是undefined reference to `MPI_Init' 吗?
编译器不知道MPI_Init,您没有定义。
MPI_Init应该是自己定义的一个板子初始化函数,要把这个初始化程序的代码准备好。
不行的话那么您需要include定义MPI_Init的头文件。
‘捌’ mpi并行问题,MPI_Barrier直接报错
这个是正常的。
因为虽然逻辑上的确如此,但是输出是有缓存的,也就是说输出的顺序不一定是逻辑的顺序。。大致是这个意思,,我也不是计算机系的,表述可能不严格。
如果你在mpi_barrier()后加上fflush(stdout)应该输出的就是逻辑的顺序了。。
‘玖’ RedHat服务器要用到mpif90,脚本里和.bashrc里都修改了,但是为什么脚本还是调用默认的gfortran
这个是系统配置有问题, 还没有生效的, 能看看wo 的网名的吗?----->就是专门解决这个问题的!!
‘拾’ linux下,如何覆盖全局环境变量里的可执行文件
在你的自己的home下编译的话,你自己定义的PATH应该可以替代全局PATH。