Windows下VS2017配置MPICH2调试环境
从开始写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”
在安装窗口中一路next即可,最后安装成功。
2、VS配置
菜单栏->文件->新建->项目
左侧选择Visual C++,然后选择Windows控制台应用程序,填写名称、位置,点击确定。
右键项目属性
首先修改平台为x64
在 配置属性->VC++目录 中添加包含目录和库目录,分别为:
C:\Program Files\MPICH2\include\;
C:\Program Files\MPICH2\lib\;
在 配置属性->C/C++->预处理器 中加入预处理器定义
MPICH_SKIP_MPICXX
_CRT_SECURE_NO_WARNINGS
在 配置属性->C/C++->代码生成 中修改运行库为"多线程调试(/MTd)"
在 配置属性->链接器->输入 中添加附加依赖项“mpi.lib”
应用修改
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; }
可以看到运行结果
MPICH2即为配置成功。
此时仍为单核运行,若需要并行,需要通过开始菜单,找到刚刚安装的MPICH中的两个软件
首先打开wmpiregister,输入用户名密码,点击register,然后点击OK退出
(网上有些教程说要新建一个用户,个人感觉使用当前用户并没有问题)
然后打开wmpiexec
输入刚才工程生成的exe路径C:\Users\Administrator\Desktop\BioInfo\MPItest\x64\Debug\MPItest.exe
修改Number of processes
勾选run in an separate window
点击执行
实际测试需要很长时间才能出现运行结果,原因未知。