首页 > 代码库 > windows visual studio 2012下MPI并行环境搭建

windows visual studio 2012下MPI并行环境搭建

因为课程作业的缘故需要编写并行计算的程序,准备写一下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程序

visual studio 2012中新建控制台程序,配置mpi的include和Lib路径。打开应用程序属性->VC目录下进行更改。

配置路径

加入代码:

#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

stackoverflow上的大牛说明产生这个问题的原因在于系统中安装了两个版本的mpi,分别是c:\program files\mpich2\binc:\program files\microsoft hpc pack 2012\bin.

根据上面的方法,我将hpc pack 2012卸载了(因为到处都是MPICH的使用,所以就卸载了微软提供的了),重新运行上面的命令,又产生了问题:

Please specify an authentication passphrase for smpd:

stackoverflow上提供的解决方法是使用wmpiregister进行注册,具体方法参考资料1中提供了,但仍然没有解决该问题。又卸载并重新安装了MPICH这次,直接提示没有mpiexec命令了。我猜想MPICH是由第三方库提供的,而hpc pack 2012是微软自己的东西,因此使用MPICH时需要进行一些环境上的配置,而hpc pack 2012不需要,所以又卸载了MPICH并安装会pc pack 2012。这次再运行mpiexec命令竟然成功了!得到运行10次结果如下:

运行10次结果

从上面结果还可以看出,系统调用不同线程的顺序由系统随机决定的,线程的结束时间无法确定。

一点感想:编程不光是个技术活也是个体力活,很多时候遇到一个问题需要不停的去google寻找解决方法,但我们平时遇到的大部分问题都是有很多人遇到过的,这个过程就要求我们不急不躁,仔细去查找前人的解决方案了。

参考资料:

  1. windows xp下配置MPICH:http://blog.csdn.net/morewindows/article/details/6823436
  2. Error = -1问题的解决方法:http://stackoverflow.com/questions/10977026/mpi-runtime-errorunable-to-read-the-cmd-header-on-the-pmi-context-error-1
  3. authentication问题解决方法:http://stackoverflow.com/questions/13926882/please-specify-an-authentication-passphrase-for-smpd