ubuntu16.04一步一步安裝配置mpich

mpi在高性能並行計算中具備重要的地位,做爲消息通訊最爲流行的編程模型,MPI並行庫雖然有着衆多缺陷,可是也知足大部分節點間通訊的功能需求。搭建服務集羣主要使用linux服務器並安裝配置mpi環境,大部分能搜到的配置方法要麼年代久遠閱讀困難、要麼未能詳細講清楚配置的過程。 筆者在此以ubuntu16.04爲例,主要根據官方的README文件來完成mpich-3.2的安裝配置。php


1. 安裝前的準備工做linux

須要安裝下載的東西:
在官網下載mpich-3.2(stable release)放置到/home/[username]/donwload目錄下([username]指某個特定的用戶名),運行如下命令解壓。shell

$ tar xzf mpich-3.2.tar.gz

檢查是否有C/C++/fortran編譯器並搞清楚所用系統的shell(默認爲bash)編程

$ gcc --version
$ g++ --version
$ gfortran --version
$ echo $SHELL

若是上述均檢查經過了,則開始下一部分,不然應該使用sudo apt-get install XXX來安裝好編譯器。ubuntu


2. 安裝配置過程ruby

進入解壓文件:bash

$ cd mpich-3.2

建立mpi的安裝路徑,咱們統一使用/home/[username]/mpich-install文件夾來存放安裝文件。服務器

$ mkdir /home/XXX/mpich-install

配置mpich-3.2中的configue文件。因爲不一樣的linux系統使用的shell不一樣,所以配置安裝指令不盡相同。主要有csh和bash兩種類型的shell,ubuntu默認使用bash,下面的命令只有bash下的,csh下的命令請閱讀mpi-3.2中的README文件。app

指定安裝文件夾dom

$ ./configure --prefix=/home/<USERNAME>/mpich-install 2>&1 | tee c.txt

構建make文件

$ sudo make 2>&1 | tee m.txt

若是上一步構建出錯,運行如下命令從新構建

$ make clean
$ make V=1 2>&1 | tee m.txt

運行makefile進行安裝

$ sudo make install 2>&1 | tee mi.txt

將其加入bash環境變量

$ PATH=/home/<USERNAME>/mpich-install/bin:$PATH ; export PATH

檢查mpicc和mpiexec兩個程序是否加入到環境變量

$ which mpicc
$ which mpiexec

tips:爲了在多機上運行MPI,須要保證全部機器上的安裝路徑、配置保持一致。


3. 啓動運行過程

MPICH使用一個叫作process manager的管理器來啓動MPI程序,啓動程序使用剛纔提到的mpiexec
來啓動。在mpich-3.2中有一個examples文件夾,裏面有有些例程能夠在你不懂MPI編程以前先體驗一下。其中一個典型的CPI程序是用來計算π的值、
代碼以下:

/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */

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

double f(double);

double f(double a)
{
    return (4.0 / (1.0 + a*a));
}

int main(int argc,char *argv[])
{
    int    n, myid, numprocs, i;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime = 0.0, endwtime;
    int    namelen;
    char   processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Get_processor_name(processor_name,&namelen);

    fprintf(stdout,"Process %d of %d is on %s\n",
        myid, numprocs, processor_name);
    fflush(stdout);

    n = 10000;          /* default # of rectangles */
    if (myid == 0)
    startwtime = MPI_Wtime();

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    h   = 1.0 / (double) n;
    sum = 0.0;
    /* A slightly better approach starts from large i and works back */
    for (i = myid + 1; i <= n; i += numprocs)
    {
    x = h * ((double)i - 0.5);
    sum += f(x);
    }
    mypi = h * sum;

    MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    if (myid == 0) {
    endwtime = MPI_Wtime();
    printf("pi is approximately %.16f, Error is %.16f\n",
           pi, fabs(pi - PI25DT));
    printf("wall clock time = %f\n", endwtime-startwtime);         
    fflush(stdout);
    }

    MPI_Finalize();
    return 0;
}

運行這個MPI程序的方法:

本地機上運行時須要指定進程數量 [number]

$ mpiexec -n <number> ./examples/cpi

指定[number]=4時運行結果以下:

$ mpiexec -n 4  ./examples/cpi
Process 0 of 4 is on nianjunzou-NX581
Process 1 of 4 is on nianjunzou-NX581
Process 2 of 4 is on nianjunzou-NX581
Process 3 of 4 is on nianjunzou-NX581
pi is approximately 3.1415926544231239, Error is 0.0000000008333307
wall clock time = 0.000320

多機上運行時除了進程數量n之外還須要寫machinefile

$ mpiexec -f machinefile -n <number> ./examples/cpi

machinefile的形式以下,’host1’, ‘host2’, ‘host3’ and ‘host4’是你想運行的全部機器的各自hostname。’:2’, ‘:4’, ‘:1’描述了各個機器上想運行的進程數量,該數量默認爲1。

host1
host2:2
host3:4   # Random comments
host4:1

更多的運行命令請訪問:
http://wiki.mpich.org/mpich/index.php/Using_the_Hydra_Process_Manager

相關文章
相關標籤/搜索