zoukankan      html  css  js  c++  java
  • Windows和Linux系统下并行计算环境MPI和OpenMP的搭建

    windows平台下在Visual Studio2019配置MPI环境

    MPI下载安装

    MPI windows版本的下载地址:https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi?redirectedfrom=MSDN
    然后点击这里下载:

    图中两个文件都要选择,下载。

    下载完成后,点击这两个文件,都需要进行安装。

    项目配置

    尝试了一下,貌似使用VS配置MPI环境,创建的项目要是Windows桌面向导,其他的项目类型试了会出错误。
    右击项目->属性,进行配置:

    • 右上角->配置管理器->活动解决方案平台,选择:x64;

    • VC++目录->包含目录,添加:“C:Program Files %28x86%29Microsoft SDKsMPIInclude;”

    • VC++目录->库目录,添加:“C:Program Files %28x86%29Microsoft SDKsMPILibx64;”

    • C/C++ -> 预处理器->预处理器定义,添加:“MPICH_SKIP_MPICXX;”

    • C/C++ -> 代码生成 -> 运行库,选择:多线程调试(/MTd);

    • 链接器 -> 输入 -> 附加依赖项,添加:“msmpi.lib;”
      至此,环境就配好了,接下来就可以开始编程了。

    测试

    项目源文件下,新建.cpp文件,写入以下代码:

    #include<stdio.h>
    #include<mpi.h>
    
    int main(int argc, char* argv[]) {
    	int myid, numprocs;
     
    	MPI_Init(&argc, &argv);
    	MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
     
    	printf("%d Hello world from process %d 
    ", numprocs, myid);
     
    	MPI_Finalize();
    	
    	return 0;
    }
    

    让我们来分析一下上面的代码:
    对于SPMD编程,程序员必须知道(1)进程编号,(2)多少个进程,(3)进程通信
    那么MPI久提供了下列函数来回答这些问题:

    • 用MPI_Comm_size 获得进程个数p:
      int MPI_Comm_size(MPI_Comm comm, int *size)
    • 用MPI_Comm_rank 获得进程的一个叫rank的值,该rank值为0到p-1间的整数,相当于进程的ID
      int MPI_Comm_rank(MPI_Comm comm, int *rank)
    • 通信组/通信子: MPI_COMM_WORLD
      一个通信组是一个进程组的集合。所有参与并行计算的进程可以组合为一个或多个通信组。
      执行MPI_Init后,一个MPI程序的所有进程形成一个缺省的组,这个组被写作MPI_COMM_WORLD
      该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围

    下面我们来运行一下,看看结果:
    在控制台该项目(这里的项目名称mpi_test)下的x64/Debug文件目录下打开cmd命令行窗口(Shift+鼠标左键,选择'在此处打开Powershell窗口',输入start cmd),输入mpiexec -n 10 test.exe。
    运行结果如下图:

    Linux下配置MPI编程环境-Ubuntu 18.04

    终端配置过程

    • 在终端上先找到文件所在位置:sudo tar -zxvf mpich-3.3.2.tar.gz

    • 解压完毕,使用ls命令查看便可发现多出了一个mpich-3.3.2目录, 然后进入该目录:cd mpich-3.3.2
      使用ls查看,会发现其中有configure这个文件。

    • 运行命令./configure -prefix=/usr/local/mpich进行软件配置与检查,这里我们只设置安装目录即可。注:prefix参数是表示安装路径。
      可能会报错error: no acceptable C compiler found in $PATH
      要先使用命令sudo apt-get install build-essential安装好需要的编译器
      -configure成功后就开始进行编译和安装了,使用make 2>&1|tee m.txt,进行编译,将错误重定向写入到m.txt中,如下图所示:

      之后就是漫长的等待-_-||,这个速度我甚至一度怀疑是不是我的操作有问题 ̄へ ̄

    • 使用make install进行安装,如下图所示。

    • 配置环境变量sudo vim /etc/profile
      在文件中添加以下内容:

    #set MPI path
    MPI_HOME=/home/thyme/mpich-install/bin 
    PATH=${PATH}:${MPI_HOME}
    export MPI_HOME
    

    其中MPI_HOME后的路径是mpich安装的路径,这里大家要根据自己的情况进行修改的。

    • 测试配置是否成功,如果像下图这样,就说明已经配置成功了。

      不得不吐槽,Ubuntu下配置MPI编程环境真是耗时耗力,中间make编译时,频繁出错,我差点想砸电脑放弃了QAQ。
      然而安装成功,才卖出了一小步,我们接下来还要开启一个虚拟机,在另一个虚拟机上执行以上同样的步骤,至此才搭建了一个最小的集群系统,才能进行并行计算。
      如果只是一般的编程,还是建议大家直接在windows系统下配置,用vs对每次建立的新项目配置一下。

    Windows系统下OpenMP配置

    visual studio2019配置

    项目属性 --> C/C++ --> 语言 --> OpenMP支持,下拉菜单选择“是(/openmp)”,同时要将符合模式设置成“否”,否则编译会报错,如下图所示:

    测试

    在使用具体实例测试之前,我们先来测试一下自己的计算机是几核的。

    #include<omp.h>
    #include<iostream>
    int main()
    {
        std::cout << "parallel begin:
    ";
        #pragma omp parallel
        {
            std::cout << omp_get_thread_num();
        }
        std::cout << "
     parallel end.
    ";
        std::cin.get();
        return 0;
    }
    


    这是我的运行结果,所以说明处理器是8核的。

    OpenMP中使用parallel指令标识代码中的并行段:

    #pragma omp parallel
     
    {
     
          多核并行执行的代码;
     
    }
    

    当编译器发现#pragma omp parallel for后,自动将下面的for循环分成N份,(N为电脑CPU核数),然后把每份指派给一个核去执行,而且多个核之间为并行执行。
    下面是一个小实例:

    #include <iostream>
    int main()
    {
    #pragma omp parallel for
        for (int i=0;i<10;i++)
            std::cout<<i<<std::endl;
        return 0;
    }
    

    控制台输出:

    运行结果:

  • 相关阅读:
    第十一周上机
    第十周上机
    第九周上机
    第八周作业
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于 mykernel 2.0 编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
    码农的自我修养之必备技能 学习笔记
  • 原文地址:https://www.cnblogs.com/CuteyThyme/p/12652273.html
Copyright © 2011-2022 走看看