學習MPI並行編程記錄


簡單的MPI程序示例

首先,我們來看一個簡單的MPI程序實例。如同我們學習各種語言的第一個程序一樣,對於MPI的第一個程序同樣是"Hello Word"。

/* Case 1 hellow.c */

#include <stdio.h>

#include "mpi.h"

int main( int argc, char *argv[] ) {

int rank;

int size;

    MPI_Init( argc, argv );

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    MPI_Comm_size(MPI_COMM_WORLD, &size);

    printf( "Hello world from process %d of %d\n", rank, size );

    MPI_Finalize();

    return 0;

}

根據上一節的介紹,我們使用如下命令編譯和鏈接這個程序:

mpicc –o hellow hellow.c

運行這個例子可以在可執行文件的目錄中執行mpiexec –np 4 ./hellow。運行結果如下:

Hello world from process 0 of 4

Hello world from process 1 of 4

Hello world from process 2 of 4

Hello world from process 3 of 4

image

這個程序在MPI程序運行的每個進程中分別打印各自的MPI進程號(0~3)和總進程數(4)。

       值得注意的是,由於四個進程是並行執行,所以即使輸出的順序有變化也是正常的,程序中並沒有限制哪個進程在前,哪個進程在后。

2.2 MPI程序的四個基本函數

1.MPI_Init和MPI_Finalize

MPI_Init用來初始化MPI執行環境,建立多個MPI進程之間的聯系,為后續通信做准備。而MPI_Finalize則是結束MPI執行環境。

如同OpenMP定義並行區一樣,這兩個函數就是用來定義MPI程序的並行區的。也就是說,除了檢測是否初始化的函數之外,不應該在這兩個函數定義的區域之外調用其他MPI函數。

2.MPI_Comm_rank

參考書籍介紹過SPMD的程序形式,給出的例子中需要通過進程標識和總數來分配數據。MPI_Comm_rank就是來標識各個MPI進程的,告訴調用該函數的進程“我是誰?”。MPI_Comm_rank返回整型的錯誤值,需要提供兩個函數參數:

         MPI_Comm類型的通信域,標識參與計算的MPI進程組。

         整型指針,返回進程在相應進程組中的進程號。進程號從0開始編號。

3.MPI_Comm_size

本函數則用來標識相應進程組中有多少個進程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM