微吼云上線多路互動直播服務 加速多場景互動直播落地
2431
2025-04-07
MPI
簡介
在程序中,不同的進程需要相互的數據交換,特別是在科學計算中,需要大規模的計算與數據交換,集群可以很好解決單節點計算力不足的問題,但在集群中大規模的數據交換是很耗費時間的,因此需要一種在多節點的情況下能快速進行數據交流的標準,這就是MPI。
MPI是一組用于多節點數據通信的標準,而非一種語言或者接口。具體的使用方法需要依賴它的具體實現(mpich or openmpi等)。
mpi的目標是
實現較高的通信性能
好的程序移植性
強大的功能
編譯與運行
mpi目前綁定的語言只有FORTRAN 和 C/C++。
c編譯: mpicc -o mpiProgram mpiProgram.c
c++編譯:mpicxx -o mpiProgram mpiProgram.cpp
FORTRAN編譯:mpif77 -o mpiProgram mpiProgram.f
運行可使用mpirun或mpiexec:
mpirun/mpiexec -np 2 mpiProgram
概念
進程
通俗的說,進程就是運行的程序。一個程序可以含有多個進程,但一個進程不能同屬于多個程序。進程擁有獨立的運行環境(內存,寄存器,CPU執行時間等),是操作系統中獨立存在的可執行的基本單位。每個進程所占有的資源都是獨立的,不與其他的進程共享,不能訪問其他進程內存空間,其他進程也無法訪問該進程內存空間。但可以通過消息傳遞來進行通信。
進程組
指一個mpi程序中的所有(n個)進程的集合。該程序中所有進程編號從0到n-1,主要是為了標識不同的進程,可以通過進程的編號來索引該進程。不同進程組的進程的編號可以相同。
通信器(MPI_Comm)
可以理解圍毆一組進程間可以通信的進程組,通信函數必須在通信器內調用。
消息
需要通信的數據。
mpi對象
mpi內存的數據結構,包括數據類型(MPI_DOUBLE),通信器(MPI_COMM)等
mpi數據類型
MPI_BYTE為一個字節,即8bit。MPI_PACKED為打包數據類型,可以將自定義數據類型打包傳遞。
mpi模型基本結構
#include
program main include 'mpif.h' character * (MPI_MAX_PROCESSOR_NAME) processor_name integer myid, numprocs, namelen, rc, ierr call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) call MPI_FINALIZE(ierr) end
首先就是導入mpi的頭文件
mpi基本函數(c版)
int MPI_Init(int *argc,char ***argv)
*argc為指向main函數argc的指針,***argv為指向main函數**argv的指針。一般不使用時設置為NULL
int MPI_Initialized(int *flag)
檢測mpi環境是否初始化,唯一可在,MPI_Init前使用的函數。
int MPI_Comm_rank(MPI_Comm comm,int *rank) int MPI_Comm_size(MPI_Comm comm,int *size)
MPI_Comm是進程通信器類型,即同一個通信器MPI_Comm中的可以進行通信。一般設為MPI_COMM_WORLD,即該程序的所有進程,也可以自己單獨設置不同的通信器。rank為int型數組,保存該通信器中進程的編號。size為int型指針,保存該通信器中進程的數量。
int MPI_Send(void *buf, int count, MPI_Datatype datatype,int dest, int tag,MPI_Comm comm)
為阻塞型發送函數,即等消息發送后才可返回執行下一句。buf為發送區緩存。count為發送的數據的大小。datatype為發送的數據類型。dest為發送的目標進程編號。tag為標志,該標志必須和接收函數的標志一致時才可被接收函數接收。comm通信器。
int MPI_Recv (void *buf, int count, MPI_Datatype datatype,int source, int tag, MPI_Comm comm,MPI_Status *status)
為阻塞型接收函數,即接收到消息后才可返回執行下一句。buf為接收區緩存,接收區緩存必需大于等于發送的數據。count為接收的數據大小。datatype為接收的數據類型。source為數據的發送源進程編號。tag為標志,該標志必須與發送函數的tag一致才會被接收。comm為通信器。status返回接收狀態。
int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,MPI_Comm comm, MPI_Request *request) int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
為對應的發送接收函數的非阻塞型函數,即當函數執行后立馬返回執行下一行代碼,而不需要等待數據正式發送或接收后才可返回。這經常會導致數據的混亂,因此使用非阻塞發送和接收時格外需要注意。
int MPI_Finalize(void)
退出MPI環境函數,每個進程都必須調用。調用后不可在使用MPI函數。若不執行該函數,則進程可能會掛起。執行該函數前確保非阻塞通信結束。
int MPI_Abort(MPI_Comm comm, int errorcode)
異常終止函數。在出現了致命錯誤而希望異常終止MPI程序時執行,MPI系統會設法終止comm通信器中所有進程, 輸入整型參數errorcode,將被作為進程的退出碼返回給系統
int MPI_Get_processor_name(char *name,int *resultlen)
獲取處理器名稱,在返回的name中存儲所在處理器的名稱,resultlen存放返回名字所占字節,應提供參數name不少于MPI_MAX_PRCESSOR_NAME個字節的存儲空間
int MPI_Get_version(int *version,int *subversion)
獲取mpi版本號,若版本為4.0,則version為4,subversion為0.
double MPI_Wtime(void)
返回調用時刻的墻上時間,用浮點數表示秒數
任務調度 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。