admin管理员组

文章数量:1646247

Win10下用GCC+Code::Blocks搭建mpi编译环境

  • 预备知识(一定要看懂)
  • MPI简介(为什么不用MSMPI)
  • Win10下用Code::Blocks搭建MPI开发环境
    • 下载MPICH文件
    • Code::Blocks中配置
    • TestCode
    • 编译运行
    • 更新一下2020.12.04

预备知识(一定要看懂)

可以先读一下以下四篇文章:
C语言编译过程详解:https://wwwblogs/CarpenterLee/p/5994681.html
VS各目录介绍:https://blog.csdn/u012043391/article/details/54972127
GCC编译命令:https://wwwblogs/testlife007/p/6555404.html

(浏览一下就行)Windows环境下的vs2013配置MPI:https://blog.csdn/z909768094/article/details/50926162

MPI简介(为什么不用MSMPI)

隐藏下载地址(下载这个里面的1.4版本以前的!):http://www.mpich/static/tarballs/
MPICH2开发之前有独立的Win10版本,在版本1.4之后,就没有MPICH2的Win安装包了。

mpich2-1.4大概是13年发布的,里面有mpi.h mpi.lib mpi.a,然后之后就可以在微软官网上有了MS-MPI的版本大概14-15年,这时候的软件包中的东西就少了一些,分成了两个下载程序,一个是mpisetup用于运行mpi的.exe文件,另一个就是mpisdk。只包含了mpi.h和.lib文件(没有.a文件)。

可以从mpi的官网看到,最后面的windows下版本是基于MPICH2-1.0.3开发的,现在已经到了MS-MPIv10.0。

目前可以从mpi官网进入微软官网下载ms-mpi,为什么不推荐下载官网的这个,ms-mpi与mpich2少了一些编译要用的文件,这些东西被加到了微软的开发环境中(VS、VC),也就是说你如果想用ms-mpi但是不用visual studio的话,会出很多错

之前文章有讲,.lib , .a, .so文件都是静态链接库,如果用VS就往里面添加.lib,如果用其他编译器的话,就要用.a或.so文件,而ms-mpi里面已经没有.a文件了,这就是为什么不用VS的话,就不用ms-mpi了。

VS自带的编译器是CLang,对C++的语法支持较差,在VS中可以使用Intel compiler(ICC)编译器(我没用过),但是目前没找到在VS中用GCC的方法,所以如果想用gcc+mpi的话,就只能换别的IDE。

但是这样的话用的mpi版本就不是最新的了。。。。不过应该问题不大。

我更推荐在LINUX系统(国产deepin很好用了)下编译MPI程序,就不会有这么多麻烦了,linux下有最新的mpich3.x,不需要VS。
在Linux下下载mpi大礼包以后会送一个mpicc,这是一个编译器,跟gcc一样用,就是不用自己配置文件了。
而Win下的mpi大礼包没有mpicc,mpicc=gcc+mpi配置,所以我们可以自己来搭建。

Win10下用Code::Blocks搭建MPI开发环境

下载MPICH文件

下载这个里面的1.4版本以前的! 就是上面说过的那个链接:http://www.mpich/static/tarballs/
安装,哪儿都行只要你找得到

Code::Blocks中配置

有两个地方可以设置(下面二选一设置就行):

  • 全局设置( 会改变全局的编译器设置,以后所有的程序都会用这个设置)
    Settings->Compiler->Search Directory
    1 在compiler里面添加mpi.h所在目录 例如:安装目录\inlcude
    2 在linker里面添加libmpi.a所在目录 例如:安装目录\lib (其实可以不加,正确添加下一步就行)
    3 在Settings->Compiler->linker setting中添加libmpi.a文件(不是文件夹了) 例如:安装目录\lib\libmpi.a

  • 针对单个项目设置
    在项目处右键有Build Option,按上面同样配置就行。

TestCode

#include "mpi.h"  
#include <stdio.h>  

int main(int argc, char* argv[])
{
    int rank, numproces;
    int namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);//获得进程号
    MPI_Comm_size(MPI_COMM_WORLD, &numproces);//返回通信子的进程数

    MPI_Get_processor_name(processor_name, &namelen);
    fprintf(stderr, "hello world! process %d of %d on %s\n", rank, numproces, processor_name);
    MPI_Finalize();

    return 0;
}

编译运行

x86_64-w64-mingw32-g++.exe -Wall -fexceptions -m64 -g -I"C:\Program Files\MPICH2\include" -c E:\Workspace\mpitest\main.cpp -o obj\Debug\main.o
x86_64-w64-mingw32-g++.exe -L"C:\Program Files\MPICH2\lib" -o bin\Debug\mpitest.exe obj\Debug\main.o  -m64  "C:\Program Files\MPICH2\lib\libmpi.a"

编译可以看到在Build log中可以看到两行命令,结合gcc的命令,如果上面配置不正确可以从这儿检查,其中第二条命令的-m64不是必须有的,我用的是TDM-GCC64位所以就加上了。

编译后有一大堆warning,不用管它,如果没有error能编译成功就行了!!

更新一下2020.12.04

上面是我刚入门并行时候写的,当时经验还是不够,写的可能比较粗糙。
现在给后来人一些建议:

  1. 推荐一个好用的编译器 QtCreator ,codeblock已经很久没有更新了,语法高亮 补全功能都不是很完善。强烈推荐QTCreator,个人感觉比VS好用
  2. 做并行开发的话,就不要在windows下做了,MSMPI+VS的并行程序只能在windows下运行,就选你写完了,找一台windows系统的服务器可能都很不容易,如果规模很大想找windows的集群根本没地方找。而且MPI虽然是标准了,在我使用的过程中,不同mpi的实现还是有很大差别的,如果是msmpi到时候想换成别的mpi可能会不太容易。建议用openmpi或者mpich,intelmpi的话,接口都不一样的。
  3. 祝大家科研顺利,开了个qq小号,1845303506,精力有限,白嫖就别啦 ==、,多看几遍内容都在这里面了,特别是把前面的几个基础内容好好看懂,你就会发现,其实所有的库搭建方式都是一样的,mpi只是个普通的三方库,没有任何特别之处~~

本文标签: 环境gccCodempiblocks