http://www-unix.mcs.anl.gov/mpi/mpich/
mpi是多点接口(multipointinterface)的简称
对mpi的定义是多种多样的,但不外乎下面三个方面,它们限定了mpi的内涵和外延:
1、mpi是一个库,而不是一门语言。许多人认为,mpi就是一种并行语言,这是不准确的。但是,按照并行语言的分类,可以把fortran+mpi或c+mpi看作是一种在原来串行语言基础之上扩展后得到的,并行语言mpi库可以被fortran77/c/fortran90/c++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别;
2、mpi是一种标准或规范的代表,而不特指某一个对它的具体实现,迄今为止,所有的并行计算机制造商都提供对mpi的支持,可以在网上免费得到mpi在不同并行计算机上的实现,一个正确的mpi程序可以不加修改地在所有的并行机上运行;
3、mpi是一种消息传递编程模型,并成为这种编程模型的代表。事实上,标准mpi虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的;
解释来源于《高性能计算之并行编程技术——mpi并行程序设计》都志辉编著
4、mpi是多点接口(multipointinterface)的简称,是西门子公司开发的用于plc之间通讯的保密的协议。mpi通讯是当通信速率要求不高、通信数据量不大时,可以采用的一种简单经济的通讯方式。mpi通信可使用plcs7-200/300/400、 *** 作面板tp/op及上位机mpi/profibus通信卡,如cp5512/cp5611/cp5613等进行数据交换。mpi网络的通信速率为19.2kbps~12mbps,最多可以连接32个节点,最大通讯距离为50m,但是可能通过中断器来扩展长度。
解释来源于《西门子工业网络通信指南》(上册)崔坚主编
OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和 *** 作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。OpenMP采用可移植的、可扩展的模型,为程序员提供了一个简单而灵活的开发平台,从标准桌面电脑到超级计算机的并行应用程序接口[1]。消息传递界面/接口(英语:Message Passing Interface,缩写MPI)是一个并行计算的应用程序接口(API),常在超级电脑、电脑簇等非共享内存环境程序设计[2]。
下面是我在使用他们的过程中,对这两种API优缺点的认识。
OpenMP的优点:
- OpenMP相对于MPI而言更容易使用。
- OpenMp对原串行代码改动较小,可以保护代码原貌。
- 代码更容易理解和维护
- 允许渐进式并行化
OpenMP的缺点 :
- 所有线程共享内存空间,硬件制约较大
- 目前主要针对循环并行化
MPI的优点:
- 无论硬件是否共享内存空间,都可以使用。(但是线程间不共享内存空间)
- 与OpenMP相比,可以处理规模更大的问题
- 每个线程有自己的内存和变量,这样不用担心
MPI的缺点:
- 算法上经常有较大改动(建立communication等)
- 较难使用
- 性能上会受到通信网络的影响
1、iccIntel 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定义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)