MPI信息传递接口的简称,常用来进行进程间、机器间的通信与并行计算。一般而言,MPI都会部署在*nix系统下,在Windows下面直接编译、配置MPI并不容易。本文利用MS提供的编译好的MPI的版本,介绍如何在Windows原生环境下(不包括MinGW、CygWin),使用VC或QT编译MPI程序。

下载、安装MPI

MS官网提供编译好的MPI安装程序,可以直接下载【传送门】。下载好后,直接安装既可。

使用VS编写MPI程序

1. 新建工程

新建VC控制台工程。

2. 配置路径

“项目右键→属性→配置属性→VC++目录”中,分别将MPI安装路径里的Inc与Lib路径添加到包含目录库目录中。PS:上述Lib路径,32位环境下面是指Lib下面的i386文件夹,64位库则是指amd64文件夹。

3. 配置lib文件

“项目右键→属性→配置属性→链接器→输入→附加依赖项”,添加MPI的lib文件,即msmpi.lib

4. code

在cpp文件中,写入如下代码(找不到stdafx.h的,可以删掉第一句):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdafx.h"
#include <mpi.h>
#include <stdio.h>
#include <string.h>
 
#define BUFSIZE 128
#define TAG 0
 
int main(int argc, char *argv[])
{
char idstr[32];
char buff[BUFSIZE];
int numprocs;
int myid;
int i;
MPI_Status stat;
/* MPI programs start with MPI_Init; all 'N' processes exist thereafter */
MPI_Init(&argc,&argv);
/* find out how big the SPMD world is */
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
/* and this processes' rank is */
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
 
/* At this point, all programs are running equivalently, the rank
distinguishes the roles of the programs in the SPMD model, with
rank 0 often used specially... */
if(myid == 0)
{
printf("%d: We have %d processors\n", myid, numprocs);
for(i=1;i<numprocs;i++)
{
sprintf_s(buff, "Hello %d! ", i);
MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
}
for(i=1;i<numprocs;i++)
{
MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
printf("%d: %s\n", myid, buff);
}
}
else
{
/* receive from rank 0: */
MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
sprintf_s(idstr, "Processor %d ", myid);
strncat_s(buff, idstr, BUFSIZE-1);
strncat_s(buff, "reporting for duty\n", BUFSIZE-1);
/* send to rank 0: */
MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
}
 
/* MPI programs end with MPI Finalize; this is a weak synchronization point */
MPI_Finalize();
return 0;
}

PS:这段代码中,由于VS高版本安全性能的提升,不能使用sprintfstrncat函数,因此,代码中全部被改为了sprintf_sstrncat_s。低版本的VS抱错的话,请自动改回来。

5. 修改调试方式

由于MPI程序要能并行计算,必须由mpiexec.exe启动,不能直接运行程序的exe,因此需要修改程序的运行方式。“项目右键→属性→配置属性→调试”,将命令改为mpiexec工作参数改为$(TargetPath)

6. 生成

不报错即可。生成后结果如下:

使用Qt编写MPI程序

其实严格来说,这讲的是用QtCreator来构建,实际上编译器还是VC的。

1. 新建工程

新建项目→非Qt项目→纯c++语言项目

2. 配置环境变量

可以直接在系统环境变量中配置,也可以在Qt中的“项目→构建与运行→构建变量”中进行。具体设置如下:

  • 添加MPI安装路径里的Inc路径到环境变量include中(不存在则新建这个环境变量,下同);
  • 添加MPI的lib文件所在路径到环境变量lib中。(与前文一样,注意32位与64位的区别)

    3. 修改pro文件

    在项目pro文件,在里面添加下面2行代码,并重新qmake:

    1
    2
    LIBS += -lmsmpi
    DESTDIR = ./

第一句代表链接到msmpi.lib文件。第二句是为了后面更好的运行程序,更改了我们程序生成的路径。

4. code

代码跟前文VS里的一样,只需把第一行去掉

5. 修改调试方式

“项目→构建与运行→运行”设置如下图:

其中,执行的是mpiexec.exe,“MPITest.exe”为程序生成的exe。这一步的目的跟VS中的一样。

6. 构建并运行

运行结果应该跟VS的一样

总结

MPI程序在Win下面跟普通的第三方库并没有太大区别,只是在运行的时候,需要由
mpiexec.exe来启动程序。由本文可以看出,文中提供Win下两种IDE编译MPI程序的方法,大同小异。

参考资料

    1. MPI维基百科
    2. MPICH官网

http://www.chenguanzhou.com/2014/04/29/2014-04-29-win-mpi/

Windows下用VC与QT编译MPI程序入门的更多相关文章

  1. Windows下使用Visual Studio 2010编译ffmpeg全过程

    在visual studio 2010中调用ffmpeg http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html Windows下使用Visual S ...

  2. 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp

    配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...

  3. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法

    QT编译发布程序后报错如缺少dll.“应用程序无法正常启动(0xc000007b)”的可能解决方法 最近项目要用qt,因为初学没有经验,遇到些小问题常常没什么头绪,也查不到解决方法,刚刚还因为低端错误 ...

  4. Windows下使用Visual Studio 2010 编译ffmpeg全过程

    (注意:请务必先阅读:七,后记补充:) ffmpeg是一个开源的多媒体库,使用非常广泛. 在linux下编译ffmpeg非常简单,而在windows下编译就不是那么容易了.一般在windows下使用M ...

  5. 【FFMPEG】Windows下使用Visual Studio 2010编译ffmpeg全过程

    原文  http://www.cnblogs.com/xylc/p/3683203.html 主题 FFmpegWindowsVisual Studio ffmpeg是一个开源的多媒体库,使用非常广泛 ...

  6. windows下使用mingw和msys编译GOTOBLAS和OpenBLAS

    在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...

  7. 配置 Windows 下的 nodejs C++ 模块编译环境

    根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境". 所有需要的安装文件, 我都下载好放到百度云盘了: nod ...

  8. windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创文章,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4535459.html android 程序打包成apk,如果在是命令行方式,一般都要经过如下步骤: 1.用a ...

  9. Windows下Go安装&环境配置&编译运行

    Go下载安装 官方Go下载站点:https://golang.google.cn/ 也可以选择:https://studygolang.com/dl 配置环境变量 常用环境变量 GOROOT GORO ...

随机推荐

  1. python于lxml应用

    首先下载lxml, http://www.lfd.uci.edu/~gohlke/pythonlibs/ ,然后加入引用 from lxml import _elementpath as DONTUS ...

  2. javascript的回调函数 同步 异步

    后一个任务等待前一个任务结束再执行.程序执行顺序与任务排列顺序一致的,同步的. 参考: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%B ...

  3. Qt浅谈之十八:GraphicsView框架事件处理(有源码下载)

    一.简介 GraphicsView支持事件传播体系结构,可以使图元在场景scene中得到提高了已被的精确交互能力.图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景给相应的图形项. ...

  4. WPF MVVM系列文章

    网上搜到了MSDN Magazine上Laurent Bugnion的系列文章. 以下为关于WPF的优秀实践,很有必要阅读. 很吸引人的标题有: IOC Containers and MVVM Mes ...

  5. XBMC 最新版本号错误

    1. Syntax error: "(" unexpected 改动 tools/depends下的makefile.include 将NDK_VER=0x9d

  6. P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址)——充分证明@是取变量(对象)的地址,而不是变量里面的内容,够清楚!

    如图,为什么这样取出来的p,p1的值不一样呢?   165232328群友庾伟洪告诉我:  P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址) ,你想P指向真正的对 ...

  7. Python属性和方法

    关键字:Python 属性 方法原文:http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and ...

  8. Opencv决策树分类器应用

    机器学习在数据挖掘.计算机视觉.搜索引擎.医学诊断.证券市场分析.语言与手写识别等领域有着十分广泛的应用,特别是在数据分析挥着越来越重要的作用.在机器学习中,决策树是最基础且应用最广泛的归纳推理算法之 ...

  9. 浅谈 Swift 中的 Optionals

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  10. 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)

    原文:二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进) 我们知道,目前二维码还很少用于广告招牌的制作.但随着智能手机越来越普及,互联网等网络的应用也越来越广泛,作为连接物理 ...