大綱介紹 MPI 標準介紹 MPI 的主要目標 Compiler & Run 平行程式 MPICH 程式基本架構 點對點通訊 函數介紹 集體通訊 函數介紹

Similar documents
投影片 1

消息传递并行编程环境MPI.doc

第7章-并行计算.ppt

Microsoft PowerPoint - KN002.ppt

PowerPoint 演示文稿

mpic_2002

Microsoft PowerPoint - Tongji_MPI编程初步

模板

Linux Linux Linux

CC213

Parallel Programming with MPI

CC213

PowerPoint Presentation

Department of Science and Engineering Computing School of Mathematics School Peking University October 9, 2007

07-1.indd

Parallel Programming with MPI

mpif_2003

投影片 1

C 1

C/C++语言 - C/C++数据

科学计算的语言-FORTRAN95

C++ 程式設計

PowerPoint 演示文稿

PowerPoint 演示文稿

PowerPoint 演示文稿

mpi

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Trilinos 简介 Trilinos 简介 卢朓 Trilinos 简介 卢朓 Trilinos 简介 Trilinos 简介 Trilinos 的安装和使用 Trilinos 简介 Trilinos 简介 Trilinos 的安装和使用 Trilinos 简介 Trilinos Epetra

ebook8-30

mannal


Excel VBA Excel Visual Basic for Application

Microsoft Word - 2CA13內文.doc

目录 第一章 MPI 简介 消息传递编程的相关概念 分布式内存 消息传输 进程 消息传递库 发送 / 接收 同步 / 异步 阻塞

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Department of Science and Engineering Computing School of Mathematics School Peking University August 14, 2007

Microsoft PowerPoint - VCAD.ppt []

3.1 num = 3 ch = 'C' 2

FY.DOC

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

epub83-1

c_cpp

2/80 2

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

The golden pins of the PCI card can be oxidized after months or years

Slide 1

目 录 参 考 材 料 1 第 一 章 预 备 知 识 高 性 能 并 行 计 算 机 系 统 简 介 微 处 理 器 的 存 储 结 构

C语言的应用.PDF

<4D F736F F D20482E323634B5F8B054BD73BD58A4A7A5ADA6E6A4C6ACE3A8732E646F63>

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

座號

51 C 51 isp 10 C PCB C C C C KEIL

MPI实验.doc

Microsoft Word - ACL chapter02-5ed.docx

untitled

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

_汪_文前新ok[3.1].doc

新版 明解C++入門編

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

untitled

新・明解C言語入門編『索引』

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

上海市本科教学质量年度报告

運算子多載 Operator Overloading

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

運算子多載 Operator Overloading

ebook14-4

untitled

untitled

PowerPoint Presentation

ebook 132-6

D C 93 2

untitled

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

Master Thesis_專門用來製作目錄.doc

mvc

目录

Tel:

untitled

untitled

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM

华恒家庭网关方案

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

邏輯分析儀的概念與原理-展示版

C

C/C++语言 - 分支结构

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>



Microsoft Word - PHP7Ch01.docx

untitled

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

untitled

C/C++ 语言 - 循环

Transcription:

MPI 平行程式設計 勁智數位科技股份有限公司 技術研發部林勝峰 sflin@infowrap.com.tw

大綱介紹 MPI 標準介紹 MPI 的主要目標 Compiler & Run 平行程式 MPICH 程式基本架構 點對點通訊 函數介紹 集體通訊 函數介紹

MPI (Message Passing Interface) Version1.0:June, 1994. Version1.1:June, 1995. Version2.0:July,1997. Version1.2:Version1.1 的修正版本 目前各院校 政府機構和業界所開發的軟體皆為 1.1 或 1.2 版 ex:mpich LAM-MPI (all of MPI-1.2) http://www-unix.mcs.anl.gov/mpi/mpich

MPI 標準 點對點傳訊 (Point to Point Comm.) 集體傳訊 (Collective Comm.) 行程組 (Process Groups) 傳訊情況 (Contexts) 行程拓撲 (Process Topologies) Fortran 和 C 的整合 (Bindings)

MPI 的主要目標 成為應用程式和程式庫軟體的訊息傳遞介面 MPI 標準是設計給多電腦系統和異質性網路電腦,MPI 的介面在基本的傳訊和系統軟體沒有重大的改變時, 就可以運作各種不同平台上 提供一個可靠的傳訊介面 : 使用者不必去應付傳訊失敗的情況 MPI 的介面必須很容易和 Fortran,C 程式語言連接, 但是介面的語意必需獨立於程式語言 慣用訊息傳遞程式 ( 如 PVM) 的使用者也能熟悉 MPI 的語法

MPI 相關資訊 MPI 標準 : http://www.mpi-forum.org MPI 相關書籍 : Using MPI: Portable Parallel Programming with the Message-Passing Interface by Gropp, Lusk and Skjellum, MIT Press, 1994 MPI: The Complete Reference by Snir Otto, Huss-Lederman, Walker and Dongarra, MIT Press 1996 MPI: The Complete Reference, Vol 1 and 2, MIT Press 1998 其它資訊 : http://www.mcs.anl.org/mpi

Compile a MPI program mpif77 hello.f -o hello mpicc hello.c -o hello -o hello 是指定編譯時所產生的執行檔名 若沒有指定 (mpif77 hello.f or mpicc hello.c) 則會產生 a.out 為執行檔

各種 compiler 指令一覽 : C C++ F77 F90 GNU gcc g++ f77 N/A PGI Pgcc pgcc Pgf77 pgf90 Intel(32) icc icc Ifc ifc Intel(64) Ecc ecc Efc efc

Using MPICH to execute program Create a hosts list file mpirun -machinefile hosts -nolocal -np 4 hello -machinefile : 指定加入運算的資源 -nolocal : 本機端不參與運算 -np : 處理器數量

machinefile hosts ex : vi hosts node01:2 node02 node02 node03 node04

MPI 程式基本架構 MPI_INIT MPI_FINALIZE MPI_COMM_SIZE MPI_COMM_RANK

Include file : mpif.h 使用 MPI 撰寫 Fortran 平行程式時, 必須在每一個程式 ( 包括主程式和副程式 ) 的宣告段落裏加上 INCLUDE 'mpif.h' 陳述 (statement) mpif.h 檔案裏含有編譯 MPI 平行程式所必須 MPI 字彙與 MPI 常數 (constant) 不同廠商設定的 MPI 常數也許不盡相同, 但是所使用的 MPI 字彙則是完全一致 ex: MPI_SEND, MPI_RECV

MPI_INIT 與 MPI_FINALIZE 在叫用 (CALL) 其他 MPI 函數或副程式之前必須先叫用 MPI_INIT 副程式, 來啟動該程式在多個 CPU 上的平行計算工作 在程式結束 (STOP) 之前必須叫用 MPI_FINALIZE 副程式, 以結束平行計算工作 所以 MPI_INIT 和 MPI_FINALIZE 在主程式裡只要叫用一次就夠了

MPI_COMM_SIZE 與 MPI_COMM_RANK MPI_COMM_SIZE 得知參與平行計算的 CPU 個數 (NPROC) MPI_COMM_RANK 得知我是第幾個 CPU(MYID), 第幾個 CPU 是從 0 開始起算 通常要在幾個 CPU 上作平行計算是在下執行命令時決定的 (ex:mpirun -np) 這兩個 MPI 副程式在一個程式裏只要叫用一次就可以了

MPI_COMM_SIZE 與 MPI_COMM_RANK 格式 : CALL MPI_COMM_SIZE (MPI_COMM_WORLD, NPROC, MPI_ERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD, MYID, MPI_ERR)

Example:hello.f program main include 'mpif.h' integer NPROC, MYID, MPI_ERR call MPI_INIT(MPI_ERR) call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROC,MPI_ERR) call MPI_COMM_RANK(MPI_COMM_WORLD,MYID,MPI_ERR) write(*,*), 'Hello world! I am ',MYID,' of ', NPROC call MPI_FINALIZE(MPI_ERR) end

Example:hello.c #include<stdio.h> #include "mpi.h" int main(argc, argv) int argc; char **argv; { int nproc,myid,err; err=mpi_init(&argc,&argv); err=mpi_comm_size(mpi_comm_world,&nproc); err=mpi_comm_rank(mpi_comm_world,&myid); printf("hello World! I am %d of %d\n ", myid,nproc); err=mpi_finalize(); }

Communicators MPI_INIT 執行後, 系統會自行產生兩個 Communicators: MPI_COMM_WORLD 和 MPI_COMM_SELF MPI_COMM_WORLD 包含所有參與運算的 CPU MPI_COMM_SELF 只有包含自己這個 CPU 屬於同一個 Communicator 的 CPU 才能互傳資料 要產生其它 Communicator, 可以用 MPI_COMM_SPLIT 這個函式

平行程式函數解說 (part1) Summary: 點對點通訊 (point to point communication) 函數 MPI_SEND MPI_RECV 介紹

MPI_SEND,MPI_RECV 一個 CPU 與另外一個 CPU 之間的資料傳送屬於 點對點通訊, 送出資料的 CPU 要叫用 MPI_SEND 來送資料, 而收受資料的 CPU 要叫用 MPI_RECV 來收資料 一個 MPI_SEND 必須要有一個對應的 MPI_RECV 與之配合, 才能完成一份資料的傳送工作

Envelope MPI 在傳送資料 (MPI_SEND MPI_RECV) 時, 是以下列四項構成其 信封 (envelope), 用以識別一件訊息 (message) 1. 送出資料的 CPU id 2. 收受資料的 CPU id 3. 資料標籤 4. Communicator 一個 CPU 送給另外一個 CPU 多種資料時, 不同的資料要用不同的資料標籤, 以資識別

MPI_SEND CALL MPI_SEND (DATA,ICOUNT,DATA_TYPE, IDEST,ITAG,MPI_COMM_WORLD,MPI_ERR) DATA : 要送出去的資料起點, 可以是純量 (scalar) 或陣列 (array) 資料 ICOUNT : 要送出去的資料數量, 當 ICOUNT 的值大於 1 時, DATA 必須是陣列 DATA_TYPE : 是要送出去的資料類別 IDEST : 是收受資料的 CPU id ITAG : 要送出去的資料標籤

MPI_RECV CALL MPI_RECV(DATA,ICOUNT,DATA_TYPE, ISRC,ITAG,MPI_COMM_WORLD,ISTATUS,MPI_ERR) DATA : 是要收受的資料起點 ICOUNT : 是要收受的資料數量 DATA_TYPE : 是要收受的資料類別 ISRC : 是送出資料的 CPU id ITAG : 是要收受的資料標籤 ISTATUS : 是執行 MPI_RECV 副程式之後的返回狀況 INTEGER ISTATUS(MPI_STATUS_SIZE)

MPI fortran data types MPI data type MPI_CHARACTER MPI_LOGICAL MPI_INTEGER MPI_REAL,MPI_REAL4 MPI_REAL8,MPI_DOUBLE_PRECI SION MPI_COMPLEX,MPI_COMPLEX8 MPI_COMPLEX16,MPI_DOUBLE_C OMPLEX MPI_BYTE MPI_PACKED Fortran data type CHARACTER LOGICAL INTEGER REAL,REAL*4 REAL*8,DOUBLE_PRECISION COMPLEX,COMPLEX*8 COMPLEX*16

MPI C data type MPI data type MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_PACKED C data type Signed char Signed short int Signed int Signed long int Unsigned char Unsigned short int Unsigned int Unsigned long int Float Double Long double

MPI_GET_COUNT CALL MPI_GET_COUNT(ISTATUS,DATA_TYPE, ISIZE,MPI_ERR) ISTATUS : 是之前執行 MPI_RECV 副程式的返回狀況 DATA_TYPE : 是要收受的資料類別 ISIZE : 是 MPI_RECV 副程式實際收到的資料數量 不確定所接收資料的來源時,ISTATUS 也可以用來判別送出資料的 CPU ID ISRC=ISTATUS(MPI_SOURCE)

processor 0 call MPI_SEND sendbuf dest,tag,comm sysbuf processor 1 call MPI_RECV recvbuf sysbuf

MPI_ISEND CALL MPI_ISEND (DATA,ICOUNT,DATA_TYPE, IDEST,ITAG,MPI_COMM_WORLD,REQUEST,MPI_ERR) DATA : 要送出去的資料起點, 可以是純量 (scalar) 或陣列 (array) 資料 ICOUNT : 要送出去的資料數量, 當 ICOUNT 的值大於 1 時, DATA 必須是陣列 DATA_TYPE : 是要送出去的資料類別 IDEST : 是收受資料的 CPU id ITAG : 要送出去的資料標籤 REQUEST : 為此次傳送的編號, 供 MPI_WAIT 查詢使用 ( 資料型態 Integer 無須定義值, MPICH 給定 )

MPI_IRECV CALL MPI_IRECV(DATA,ICOUNT,DATA_TYPE, ISRC,ITAG,MPI_COMM_WORLD,REQUEST,MPI_ERR) DATA : 是要收受的資料起點 ICOUNT : 是要收受的資料數量 DATA_TYPE : 是要收受的資料類別 ISRC : 是送出資料的 CPU id ITAG : 是要收受的資料標籤 REQUEST : 為此次傳送的編號, 供 MPI_WAIT 查詢使用 ( 資料型態為 Integer 無須定義值, MPICH 給定 )

MPI_WAIT CALL MPI_WAIT(REQUEST,ISTATUS, MPI_ERR) REQUEST : ISEND 及 IRECV 中所使用的 REQUEST 名稱 ISTATUS : 是執行此副程式之後的結果 INTEGER ISTATUS(MPI_STATUS_SIZE) 此指令用來等待並確認編號為 REQUEST 的 ISEND 或 IRECV 指令是否完成傳送

ISEND 及 IRECV 範例 INTEGER req(2),ierr,istatus(mpi_status_size)... IF(MYID.eq.0)THEN CALL MPI_ISEND (A,2,MPI_REAL,1,100,MPI_COMM_WORLD,req(1),ierr)... ELSE CALL MPI_IRECV (A,N,MPI_REAL,0,100,MPI_COMM_WORLD,req(1),ierr)... ENDIF CALL MPI_WAIT(req(1),ISTATUS,ierr)...

MPI_SENDRECV CALL MPI_SENDRECV( DATA_A,ICOUNT,DATA_TYPE,DEST,ITAG, DATA_B,ICOUNT,DATA_TYPE,SOURCE,ITAG, MPI_COMM_WORLD,ISTATUS,MPI_ERR) DATA_A 是要送出的資料起點 DATA_B 是要接收的資料起點 ICOUNT : 資料的數量 DATA_TYPE : 資料類別 DEST : 是送出資料的目的地 CPU id SOURCE: 是接收資料來源的 CPU id ITAG : 是要接收的資料標籤 ISTATUS : 是執行 MPI_RECV 副程式之後的返回狀況 INTEGER ISTATUS(MPI_STATUS_SIZE)

Deadlock MPI_SEND 與 MPI_RECV 是相對出現, 每一個執行到的 MPI_SEND 都要有一個 MPI_RECV 在其它 CPU 與之對應 以下情形有可能會造成 Deadlock, 也就是程式會卡住無法繼續執行 : CPU 0 CPU 1 SEND(1) RECV(1) SEND(0) RECV(0) 解決方法 : 小心處理 MPI_SEND 與 MPI_RECV 的位置 使用 Non-blocking 資料傳輸函式 : MPI_ISEND/MPI_IRECV 使用 MPI_SENDRECV 函式

平行程式函數解說 (part2) Summary: 集體通訊 函數 MPI_BCAST MPI_SCATTER MPI_GATHER MPI_ALLGATHER MPI_REDUCE MPI_ALLREDUCE MPI_BARRIER MPI_WTIME

集體通訊 集體通訊 類副程式 屬於同一個 communicator 的每一個 CPU 都要參與運作 使用這一種指令時, 每一個 CPU 都必須叫用同一個副程式 MPI_BCAST MPI_SCATTER MPI_GATHER MPI_ALLGATHER MPI_REDUCE MPI_ALLREDUCE MPI_BARRIER MPI_WTIME

MPI_BCAST IROOT = 0 CALL MPI_BCAST (B, ICOUNT, DATA_TYPE, IROOT, MPI_COMM_WORLD,MPI_ERR) B : 是要送出的資料起點, 可以是簡單變數或陣列名稱 ICOUNT : 是送出去的資料數量 DATA_TYPE : 是要送出的資料類別 IROOT : 是送出資料的 CPU id

MPI_BCAST 示意圖 CPU0 B B1 B2 B3 B4 CPU0 B B1 B2 B3 B4 CPU1 CPU2 CPU3 MPI_BCAST CPU1 CPU2 CPU3 B B B B1 B2 B3 B4 B1 B2 B3 B4 B1 B2 B3 B4 IROOT = 0 CALL MPI_BCAST (B, ICOUNT, DATA_TYPE, IROOT, MPI_COMM_WORLD, MPI_ERR)

MPI_SCATTER IROOT = 0 CALL MPI_SCATTER (T, N, DATA_TYPE, B, N, DATA_TYPE,IROOT,MPI_COMM_WORLD,MPI_ERR) T : 是待送出陣列的起點 N : 是送給每一個 CPU 的資料數量 DATA_TYPE : 是待送出資料的類別 B : 是接收資料存放的起點, 如果 N 大於 1 時, B 必須是個陣列 N : 是接收資料的數量 DATA_TYPE : 是接收資料的類別 IROOT : 是送出資料的 CPU id 請注意每一段資料必須等長

MPI_SCATTER 示意圖 CPU0 T T1 T2 T3 T4 CPU0 B B1 CPU1 CPU2 MPI_SCATTER CPU1 CPU2 B B B2 B3 CPU3 CPU3 IROOT = 0 CALL MPI_SCATTER (T, N, DATA_TYPE, B, N, DATA_TYPE,IROOT,MPI_COMM_WORLD, MPI_ERR) B B4

MPI_GATHER IDEST = 0 CALL MPI_GATHER (A, N, DATA_TYPE, T, N, DATA_TYPE, IDEST, MPI_COMM_WORLD, MPI_ERR) A : 是待送出的資料起點, 如果 N 大於 1 時, A 必須是個陣列 N : 是待送出資料的數量 DATA_TYPE : 是待送出資料的類別 T : 是接收資料存放的陣列起點 N : 接收來自各個 CPU 的資料數量 DATA_TYPE : 是接收資料的類別 IDEST : 是收集資料的 CPU id 請注意每一段資料必須等長

MPI_GATHER 示意圖 CPU0 T T1 T2 T3 T4 CPU0 A A1 CPU1 CPU1 A A2 CPU2 MPI_GATHER CPU2 A A3 CPU3 CPU3 A A4 IDEST = 0 CALL MPI_GATHER (A, N, DATA_TYPE, T, N, DATA_TYPE, IDEST, MPI_COMM_WORLD, MPI_ERR)

MPI_ALLGATHER CALL MPI_ALLGATHER (A, N, DATA_TYPE, T, N, DATA_TYPE,MPI_COMM_WORLD, MPI_ERR) A : 是待送出的資料起點, 如果 N 值大於 1 時, A 必須是個陣列 N : 是待送出資料的數量 DATA_TYPE : 是待送出資料的類別 T : 是接收資料存放的陣列起點 N : 是接收來自各個 CPU 的資料數量 DATA_TYPE : 是接收資料的類別

MPI_ALLGATHER 示意圖 CPU0 T T1 T2 T3 T4 CPU0 A A1 CPU1 CPU2 T T T1 T2 T3 T4 T1 T2 T3 T4 ALLGATHER CPU1 CPU2 A A A2 A3 CPU3 T T1 T2 T3 T4 CPU3 A A4 CALL MPI_ALLGATHER (A, N, DATA_TYPE, T, N, DATA_TYPE,MPI_COMM_WORLD, MPI_ERR)

MPI_REDUCE,MPI_ALLREDUCE 集體通訊 類副程式 reduction operation MPI_REDUCE 運作的結果只存放在指定的 CPU 裏 MPI_ALLREDUCE 則是把運作的結果存放在每一個 CPU 裏

MPI_REDUCE IROOT = 0 CALL MPI_REDUCE ( SUMA, SUMALL, KOUNT,DATA_TYPE, MPI_SUM, IROOT, MPI_COMM_WORLD, MPI_ERR) SUMA : 待運作 ( 累加 ) 的變數 SUMALL : 存放運作 ( 累加 ) 後的結果 ( 把各個 CPU 上的 SUMA 加總 ) KOUNT : 待運作 ( 累加 ) 的資料個數 DATA_TYPE : SUMA 和 SUMALL 的資料類別 MPI_SUM : 運作函數 IROOT : 存放運作結果的 CPU_id

MPI_REDUCE 示意圖 CPU0 SUMA 0.2 CPU0 SUMALL 1.7 CPU1 SUMA 0.5 REDUCE CPU1 CPU2 SUMA 0.3 MPI_SUM CPU2 CPU3 SUMA 0.7 CPU3 IROOT = 0 CALL MPI_REDUCE ( SUMA, SUMALL, KOUNT,DATA_TYPE, MPI_SUM, IROOT, MPI_COMM_WORLD, MPI_ERR)

MPI Reduction Function 指令 MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC MPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR MPI_BAND MPI_BOR MPI_BXOR Operation sum 累加 product 乘積 maximum 最大值 minimum 最小值 max value and location min value and location logical AND logical OR logical exclusive OR binary AND binary OR binary exclusive OR Data type MPI_INTEGER,MPI_REAL MPI_REAL8,MPI_COMPLEX MPI_COMPLEX16 MPI_INTEGER,MPI_REAL MPI_REAL8 MPI_DOUBLE_PRECISION MPI_2INTEGER,MPI_2REAL MPI_2DOUBLE_PRECISION MPI_LOGICAL MPI_INTEGER MPI_BYTE

MPI_ALLREDUCE CALL MPI_ALLREDUCE( SUMA, SUMALL, KOUNT, DATA_TYPE, MPI_SUM, MPI_COMM_WORLD, MPI_ERR) SUMA : 待運作 ( 累加 ) 的變數 SUMALL : 存放運作 ( 累加 ) 後的結果 ( 把各個 CPU 上的 SUMA 加總 ) KOUNT : 待運作 ( 累加 ) 的資料個數 DATA_TYPE : SUMA 和 SUMALL 的資料類別 MPI_SUM : 運作函數

MPI_ALLREDUCE 示意圖 CPU0 SUMA 0.2 CPU0 SUMALL 1.7 CPU1 SUMA 0.5 ALLREDUCE CPU1 SUMALL 1.7 CPU2 SUMA 0.3 MPI_SUM CPU2 SUMALL 1.7 CPU3 SUMA 0.7 CPU3 SUMALL 1.7 CALL MPI_ALLREDUCE( SUMA, SUMALL, KOUNT, DATA_TYPE, MPI_SUM, MPI_COMM_WORLD, MPI_ERR)

MPI_BARRIER MPI_BARRIER 是屬於 集體通訊 類的副程式, 可以使所有 CPU 達到 同步 (synchronized) 的狀況 等到所有 CPU 執行到 MPI_BARRIER 之後, 處理步驟才會繼續下個動作

MPI_WTIME MPI_WTIME() 是用來取得當時的 clock time, 其計量單位是秒鐘 如果想知道參與平行計算各 CPU 花費多少時間來完成平行程式的執行工作, 可以在呼叫完 MPI_INIT 之後取得一個 MPI_WTIME, 然後在呼叫 MPI_FINALIZE 之前再取得一個 MPI_WTIME, 後者減掉前者, 就可取得各 CPU 執行程式所花費的時間了

平行程式的切割方式 1. 計算切割, 資料不切割 程式易閱讀易維護 2. 計算切割, 資料切割 節省記憶體使用量

計算切割而資料不切割之示意圖 I=1 50 I=51 100 I=101 150 I=151 200 CPU 0 CPU 1 CPU 2 CPU 3 REAL A(200) REAL A(200) REAL A(200) REAL A(200) DO I=1,200 A(I)=B(I)+C(I)*D(I) ENDDO DO I=ISTART,IEND A(I)=B(I)+C(I)*D(I) ENDDO

計算切割且資料切割之示意圖 I=1 50 1 50 1 50 1 50 Local index I=(1 50) (51 100) (101 150) (151 200) REAL A(200) Global index REAL B(200) REAL C(200) REAL D(200) CPU 0 CPU 1 CPU 2 CPU 3 DO I=1,200 A(I)=B(I)+C(I)*D(I) ENDDO DO I=1,50 A(I)=B(I)+C(I)*D(I) ENDDO

課 程結束

程式平行化的考量 是否該平行化 - 平行化後的效率是否顯著 Ts=Tc+Tio Tp=Tc/N+Tio+Tm - 有那些替代方案 平行化的困難在那裡

遞迴計算 DO 100 J=1,MY DO 100 I=1,MX X(I,J)=X(I,J) + (X(I 1,J) + X(I, J 1)) * 0.5 100 CONTINUE 由於資料相依性的緣故, 在 X(I-1,J) 以及 X(I,J-1) 算出來之前 X(I.J) 將無法計算, 因此雖然資料可以分割計算, 但是由於相依性的緣故, 將無法同時平行化處理, 而需要以類似 pipeline 的方式, 也就是第一個 CPU 處理好第一塊資料後, 將邊界條件交給其它 CPU 後, 這些 CPU 才能開始計算 由於一開始的 CPU 閑置, 加上資料傳送的時間, 因此平行化的效率將會降低