因为课程作业的缘故需要编写并行计算的程序,准备写一下MPI程序,MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算。MPI的具体实现一般采用MPICH。下面介绍如何在Windows 8系统下visual studio 2012中搭建MPI环境来编写MPI程序。
安装MPI实现库
MPICH官网上给出了windows下的下载地址。可以看出链接到了微软的官网,根据我的版本下载并安装了HPC
Pack 2012 SDK。然而在网上查找资料发现都是关于MPICH2的,所以又下载安装了这个,并根据博客的内容进行了配置。后文的结果是我写的hello
world程序能够成功运行,但前面安装了两次这个过程却给我后面工作带来了很大麻烦。
实现第一个MPI程序
加入代码:
#include "stdafx.h"
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#pragma comment (lib, "msmpi.lib")
int _tmain(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, "Hello World! Process %d of %d on %s\n", myid, numprocs, processor_name);
MPI_Finalize();
return 0;
}
运行得到:
说明程序正确运行。但是从程序运行中看到只运行了一个进程,没有看到所谓的并行运算呀。别着急下一节进行介绍。
MPI并行运算
使用控制台命令调用上面的helloworld.exe程序,得到并行运算结果。输入命令:
mpiexec -n 4 helloworld.exe
结果出现了下面的问题:
ERROR:unable to read the cmd header on the pmi context, Error = -1
*上的大牛说明产生这个问题的原因在于系统中安装了两个版本的mpi,分别是c:\program files\mpich2\bin和c:\program files\microsoft hpc pack 2012\bin.
根据上面的方法,我将hpc pack 2012卸载了(因为到处都是MPICH的使用,所以就卸载了微软提供的了),重新运行上面的命令,又产生了问题:
Please specify an authentication passphrase for smpd:
*上提供的解决方法是使用wmpiregister进行注册,具体方法参考资料1中提供了,但仍然没有解决该问题。又卸载并重新安装了MPICH这次,直接提示没有mpiexec命令了。我猜想MPICH是由第三方库提供的,而hpc pack 2012是微软自己的东西,因此使用MPICH时需要进行一些环境上的配置,而hpc pack 2012不需要,所以又卸载了MPICH并安装会pc pack 2012。这次再运行mpiexec命令竟然成功了!得到运行10次结果如下:
从上面结果还可以看出,系统调用不同线程的顺序由系统随机决定的,线程的结束时间无法确定。
一点感想:编程不光是个技术活也是个体力活,很多时候遇到一个问题需要不停的去google寻找解决方法,但我们平时遇到的大部分问题都是有很多人遇到过的,这个过程就要求我们不急不躁,仔细去查找前人的解决方案了。
参考资料:
- windows xp下配置MPICH:http://blog.csdn.net/morewindows/article/details/6823436
- Error = -1问题的解决方法:http://*.com/questions/10977026/mpi-runtime-errorunable-to-read-the-cmd-header-on-the-pmi-context-error-1
- authentication问题解决方法:http://*.com/questions/13926882/please-specify-an-authentication-passphrase-for-smpd