经过安装MPICH构建MPI编程环境,从而进行并行程序的开发。MPICH是MPI(Message-Passing Interface)的一个应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具。MPICH的开发与MPI规范的制订是同步进行的,所以MPICH最能反映MPI的变化和发展。linux
open mpi 和mpich都是mpi的应用。它们都是采用MPI标准,在并行计算中,实现节点间通讯的开源软件。各自有各自的函数,指令和库。而MPICH2是MPICH的一个版本。(通常来讲,open mpi 更适合Mac,mpich更适合linux。)编程
『win10:【教程】http://blog.csdn.net/wr132/article/details/48285789windows
【共享网盘:安装包32-64】http://pan.baidu.com/s/1qWGFXQs』 api
win7中安装软件都须要管理员权限,而在安装MPICH2的时候须要始终以同一个用户以管理员的身份安装。不然, mpiexec在具体执行的时候,会出现要求要求管理员权限的错误。网络
MPICH2下载地址:http://www.mcs.anl.gov/research/projects/mpich2/多线程
win7下smpd.exe这个组件没有自动运行安装,须要你在管理员的帐户下运行,进行安装注册。方法就是:以管理员身份运行cmd,改变路径到到MPICH2的路径下找bin,进入以后,smpd -install -phrase pwd;ide
后面具体的配置过程在网上能够找到,记录一下:函数
1)而后用VS建立一个C++的Win32控制台空项目,加入你的资源文件。
2)打开项目属性对话框。
3)进入配置属性
1>配置为Debug和Release的时候,“C/C++”选项卡里面的“代码生成”选项卡,选择“运行时库”为“多线程(/MT)”;
2>配置为全部配置的时候,“C/C++”选项卡里面的“常规”选项卡,为“附加包含目录”加入目录“C:\Program Files\MPICH2\Include”;
3>配置为全部配置的时候,“连接器”选项卡里面的“常规”选项卡,为“附加库目录”加入目录“C:\Program Files\MPICH2\Lib”;
4>配置为全部配置的时候,“连接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“mpi.lib fmpich2.lib”。
5>配置为Debug的时候,“连接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“cxxd.lib”;
6>配置为Release的时候,“连接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“cxx.lib”。
7>上面库文件中mpi.lib是用于C语言库,cxx.lib是用于C++语言库(cxxd.lib是debug版本),fmpich2.lib是用于Fortran语言库,可根据使用状况相应增减。
8>进入常规->(项目默认值)MFC的使用,右边选择->在静态库中使用 MFC,可以使生成的.exe文件拷贝到其它电脑也能单独运行。
4)配置完成,能够编译并运行你的并行程序了。工具
这个过程在官网上也有说明:性能
http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.3.2-windevguide.pdf
最后,因为mpiexec执行是经过port进行线程间交换数据的,因此若是遇到问题,还要注意配置防火墙配置。除了一些第三方防火墙,好比360防火墙要设置外,也不要设置windows自身带的防火墙。若是不会设置,最简单的方法就是将防火墙通通关闭。在不使用mpiexec的时候再打开防火墙。
问题:未解析外部符号“符号”
代码引用连接器在库和目标文件中找不到的东西(如函数,变量或标签)。
【http://blog.csdn.net/tianguokaka/article/details/43409707】
该网友基本上讲的是他在使用MFC函数库时与默认库冲突了,因此要先连接(在连接器配置)你要使用的。
而后我又查了一下什么样的冲突,多是两个库存在使用相同名称的函数等,产生使用时指代不明或不能实现相应效果,【http://bbs.csdn.net/topics/120098536】里面有人建议使用bll动态库,或者从新包装库,或者使用函数指针加载并执行(即每次使用函数时都要指明出处)、或者只用名字空间。
而后又查了一下MFC,有人问::做用,有人答:::取全局做用域,对于MFC而言加了的是调用win api,不加的是调用mfc的库。通常调用win api的参数中会多个窗口或者DC句柄。
#include "mpi.h"
#include <cstdio>
#include < math.h>
int main(int argc, char* argv[])
{
int myid,numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);/**//*程序初始化*/
MPI_Comm_rank(MPI_COMM_WORLD,&myid);/**//*获得当前进程号*/
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);/**//*获得总的进程数*/
MPI_Get_processor_name(processor_name,&namelen);/**//*获得机器名*/
fprintf(stderr," Process %d of %d SAY HELLO TO MPI on %s\n",
myid, numprocs, processor_name);
MPI_Finalize();/**//*结束*/
return 0;
}
附:【http://stackoverflow.com/questions/2427399/mpich-vs-openmpi】
一个关于MPICH的常见投诉是它不支持InfiniBand,而OpenMPI则不支持。 然而,MVAPICH和英特尔MPI(二者都是MPICH衍生产品)支持InfiniBand,所以若是有人愿意将MPICH定义为“MPICH及其衍生产品”,则MPICH具备极其普遍的网络支持,包括InfiniBand和专有 互连如Cray Seastar,Gemini和Aries以及IBM Blue Gene(/ L,/ P和/ Q)。 OpenMPI也支持Cray Gemini,但它不是Cray不支持的。 最近,MPICH经过netmod支持InfiniBand,但MVAPICH2具备普遍的优化,使其成为几乎全部状况下的首选实现。
MPICH已是MPI标准的每一个单独版本的第一个实现,从MPI-1到MPI-3。 OpenMPI最近只支持MPI-3,我发现一些平台上的一些MPI-3功能是有缺陷的。 此外,OpenMPI仍然没有对MPI_THREAD_MULTIPLE的总体支持,这对于某些应用程序相当重要。 它可能在某些平台上支持,但一般不能假定工做。 另外一方面,MPICH已经对MPI_THREAD_MULTIPLE已经有多年的总体支持。
平台评估
1. Mac OS:OpenMPI和MPICH都应该工做正常。 若是你想要一个支持全部MPI-3或MPI_THREAD_MULTIPLE的发行版本,你可能须要MPICH。 若是你在Mac笔记本电脑上运行,绝对没有理由考虑MPI性能。
2. Linux与共享内存:OpenMPI和MPICH应该工做很好。 若是你想要一个支持全部MPI-3或MPI_THREAD_MULTIPLE的发行版本,你可能须要MPICH。 我不知道两个实现之间的任何显着的性能差别。 若是操做系统容许,它们都支持单拷贝优化。
3. Linux与Mellanox InfiniBand:使用OpenMPI或MVAPICH2。 若是你想要一个支持全部MPI-3或MPI_THREAD_MULTIPLE的发行版本,你须要MVAPICH2。 我发现MVAPICH2性能很是好,但没有与InfiniBand上的OpenMPI进行直接比较,部分是由于性能对我最重要的功能(RMA aka单方面)已经在OpenMPI中每次我尝试 使用它们。
4. Linux与Intel / Qlogic True Scale InfiniBand:我没有在这方面的OpenMPI的任何经验,但基于MPICH的英特尔MPI是这个网络的支持产品,MVAPICH2也支持它。
5. Cray或IBM超级计算机:MPI在这些机器上自动安装,而且在两种状况下都基于MPICH。
6. Windows:除了经过Linux虚拟机以外,我在Windows上运行MPI绝对没有意义,可是Microsoft MPI和Intel MPI都支持Windows而且基于MPICH。
二者都是标准兼容的,因此从正确的角度来看,你使用哪个都没关系。 除非有一些功能,如特定的调试扩展,你须要,而后基准和选择哪个更快你的应用程序的硬件上。 还要考虑有其余MPI实现可能提供更好的性能或兼容性,例如MVAPICH(能够有最好的InfiniBand性能)或英特尔MPI(普遍支持的ISV)。