• Windows下用VC与QT编译MPI程序入门


    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 ", 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 ", 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 ", 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. 修改调试方式

    “项目→构建与运行→运行”设置如下图:
    Demo
    其中,执行的是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/

  • 相关阅读:
    Mybatis类型转换介绍
    简单的快捷方式
    一位资深程序员大牛给予Java初学者的学习路线建议
    题目1014:排名-----------------------此题是一个坑----------------------------------结构体还是用纯c语言不要夹杂c++
    题目1013:开门人和关门人----没有AC掉
    题目1038:Sum of Factorials
    题目1036:Old Bill------简单的模拟
    九度 题目1031:xxx定律
    九度 题目1020:最小长方形
    九度 题目1006:ZOJ问题-----------------我没有A掉
  • 原文地址:https://www.cnblogs.com/findumars/p/6350108.html
Copyright © 2020-2023  润新知