FunnyWeb

据说这里有很多神奇的东西...

Windows下VS2017配置MPICH2调试环境

2017-11-06 11:26:563922 views

从开始写C#算起,VS2012已经用了五年了,决定体验一波VS2017。Visual Studio Community版本已经对个人用户免费了,而且几乎包含了所有的重要功能,十分的良心。一直感觉VS调试C++的操作十分蛋疼,最近受科研所迫,不得不进一步认识一下这个功能。

MPICH2是MPI(Message-Passing Interface)的一个应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具,在程序设计语言上支持C/C++和Fortran。以下是MPICH2在VS2017下的配置过程。

1、下载安装MPICH2

下载地址:(仿佛1.4版本之后就没有windows的release放出,这应该是windows下的最新版本了)

http://www.mpich.org/static/tarballs/1.4/mpich2-1.4-win-x86-64.msi

使用管理员权限安装

右键开始菜单,选择“命令提示符(管理员)”

在命令窗口中输入“msiexec /i d:\mpich2-1.4.1p1-win-x86-64.msi”

image.png

在安装窗口中一路next即可,最后安装成功。

image.png

2、VS配置

菜单栏->文件->新建->项目

image.png

左侧选择Visual C++,然后选择Windows控制台应用程序,填写名称、位置,点击确定。

右键项目属性

image.png

首先修改平台为x64

image.png

在 配置属性->VC++目录 中添加包含目录和库目录,分别为:

C:\Program Files\MPICH2\include\;

C:\Program Files\MPICH2\lib\;

image.png

在 配置属性->C/C++->预处理器 中加入预处理器定义

MPICH_SKIP_MPICXX

_CRT_SECURE_NO_WARNINGS

image.png

在 配置属性->C/C++->代码生成 中修改运行库为"多线程调试(/MTd)"

image.png

在 配置属性->链接器->输入 中添加附加依赖项“mpi.lib”

image.png

应用修改

3、运行测试

#include "stdafx.h"
#include     
#include     
#include "mpi.h"    

int main(int argc, char *argv[])  // main必须带参数运行  
{
	int myid, numprocs, source;
	MPI_Status status;

	char message[100];

	MPI_Init(&argc, &argv);//完成MPI程序的所有初始化,启动MPI环境,标志并行代码的开始  

	printf("Hello World ! \n");
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*获取进程的id,函数为int MPI_Common_rank(MPI_Comm comm,  int *rank) */
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs); /*获取进程个数,函数为int MPI_Common_size(MPI_Comm comm,  int *size) */
											  /*MPI_COMMON_WORLD为通讯组,一个通讯组是一个进程组和上下文的集合,上下文可以看作为组的超级标签,用于区分不同的通讯组,该参数用于限定参加通讯的进程的范围*/
	printf("I am %d of %d \n", myid, numprocs);

	if (myid != 0) //注意进程为非0  
	{
		strcpy_s(message, "Hello World !");
		MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
		/*先将字符串拷贝到发送缓冲区message中,然后调用MPI_Send语句将它发出,用
		strlen(message)指定消息的长度,用MPI_CHAR指定消息的数据类型1,指明发往进程0, 使
		用的消息标识是99 ,MPI_COMM_WORLD是包含本进程 和接收消息的进程进
		程0 的通信域,发送方和接收方必须在同一个通信域中,由通信域来统一协调和控制消息
		的发送和接收*/
	}
	else
	{
		for (source = 1; source < numprocs; source++)
		{
			MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status);
			printf("%s\n", message);
			/*进程0直接执行接收消息的操作,这里它使用message作为接收缓冲区,由此可见,对于同一个变量在发送进程和接收进程中的作用是不同的,它指定接收消息的最大长度为100,消息的数据类型为MPI_CHAR字符型,接收的消息来自进程source ,而接收消息携带的标识必须为99,使用的通信域也是MPI_COMM_WORLD, 接收完成后的各种状态信息存放在status中,接收完成后它直接将接收到的字符串打印在屏幕上*/

		}
	}
	MPI_Finalize(); // 结束MPI程序的运行,标志并行代码结束,结束除主进程外其它进程  
	return 0;
}

可以看到运行结果

image.png

MPICH2即为配置成功。

此时仍为单核运行,若需要并行,需要通过开始菜单,找到刚刚安装的MPICH中的两个软件

image.png

首先打开wmpiregister,输入用户名密码,点击register,然后点击OK退出

(网上有些教程说要新建一个用户,个人感觉使用当前用户并没有问题)

image.png

然后打开wmpiexec

输入刚才工程生成的exe路径C:\Users\Administrator\Desktop\BioInfo\MPItest\x64\Debug\MPItest.exe

修改Number of processes

勾选run in an separate window

点击执行

image.png

实际测试需要很长时间才能出现运行结果,原因未知。

image.png