Mpi Là Gì

0

Cấu trúc chương trình MPINhóm (group) và ComunicatorTruyền thông từ điểm tới điểmTruyền thông tập hợpBài tập lập trình song song

MPI là gì?

M P I = Message Passing Interface, là đặc tả cho người phát triển và thư viện lập trình truyền thông message sử dụng trong tính toán song song. Tập lệnh MPI thực thi bao gồm thư viện các thủ tục sao cho có thể gọi được từ các chương trình Fortran, C, C++ hay Ada.

Bạn đang xem: Mpi Là Gì

Mô hình lập trình

Xu hướng công nghệ thay đổi, bộ nhớ chia sẻ kết hợp với mạng máy tính tạo ra dạng lai của hai hệ thống bộ nhớ chia sẻ và bộ nhớ phân tán.Ngày nay MPI có thể chạy trên hầu hết các nền tảng phần cứng:Bộ nhớ chia sẻBộ nhớ phân tánDạng lai hai loại trên

Cấu trúc chương trình MPI

*

Ví dụ 1: Khởi tạo môi trường, in ra id của các tác vụ

#include “mpi.h”#include “stdio.h”int main(int argc, char * argv){//Khoi tao moi truong cho MPIMPI_Init(&argc,&argv); int numtasks;//Chua so process trong groupint idtask;//Chua gia tri id cua moi processMPI_Comm_size(MPI_COMM_WORLD,&numtasks);MPI_Comm_rank(MPI_COMM_WORLD,&idtask); //in ra id cua cac tac vu va so tac vu khoi tao printf(“Id tac vu: %d trong tong so: %dn”, idtask, numtasks);//Giai phong moi truong MPIMPI_Finalize();return 0;}Tham khảo cách tích hợp MPI trong Visual Studio và cấu hình

Nhóm (group) và Comunicator

Một nhóm là một tập có thế tự của các tiến trình. Mỗi tiến trình trong một nhóm được gắn với một số id duy nhất (rank). Các giá trị của rank bắt đầu từ 0 tới N-1, ở đây N là số tiến trình trong nhóm. Trong MPI, một nhóm được đại diện trong bộ nhớ hệ thống như một đối tượng.

Xem thêm: Cách Chơi Đấu Trường Công Lý Bá Đạo Nhất Dành Cho Mọi Game Thủ

Nó có thể truy cập bởi các lập trình viện chỉ qua “handle”. Một nhóm luôn luôn gắn với một đối tượng communicator.Một communicator liên quan đến một nhóm các tiến trình mà có thể giao tiếp với nhau. Tất cả các message MPI phải chỉ định bởi một communicator. Giống như group, các communicator được mô tả trong bộ nhớ như các đối tượng và được truy cập bởi lập trình viên chỉ qua các “handle”. Ví dụ, handle cho một communicator là bao gồm tất cả các tác vụ của MPI_COMM_WORLD.Về khía cạnh lập trình viên, một nhóm và một communicator là một.

Xem thêm: Nghĩa Của Từ Phương Tiện Là Gì, Hãy Nêu Một Số Ví Dụ Về Đa Phương Tiện

*

Ví dụ 2: Từ nhóm ban đầu, chia thành 2 nhóm riêng biệt và thực hiện truyền thông trên mỗi nhóm

#include “mpi.h”#include “stdio.h”#define NPROCS 8int main(int argc, char *argv) {int rank, new_rank, sendbuf, recvbuf, numtasks, ranks1={0, 1, 2, 3}, ranks2={4, 5, 6, 7};MPI_Group orig_group, new_group;MPI_Comm new_comm;//Khoi tao moi truong MPIMPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &numtasks);if (numtasks != NPROCS) { printf(“So tac vu nen = %d. Ket thuc.n”, NPROCS); MPI_Finalize(); }sendbuf = rank;/* Lay ra handle cua nhom goc*/MPI_Comm_group(MPI_COMM_WORLD, &orig_group);/* Phan chi thanh 2 nhom rieng biet dua tren rank */if (rank

Truyền thông từ điểm tới điểm

Ví dụ 3: Thực hiện truyền thông có khoá gửi message ‘x’, ‘y’ từ tác vụ có id = 0 tới tác vụ 1 và ngược lại

#include “mpi.h”#include “stdio.h”int main(int argc, char* argv){ int noProc, idProc;char inmsg, outmsg = “x”;int dest, source, tag = 1;MPI_Status Stat;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&noProc);MPI_Comm_rank(MPI_COMM_WORLD,&idProc);//Gui msg tu tac vu co id = 0 toi tac vu co id = 1if(idProc == 0){//gui du lieu “x” toi tac vu co id = 1dest = 1;source = 1;MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); //nhan du lieu “y” tu tac vu co id = 1MPI_Recv(&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,&Stat);printf(“ProcessID: %d, Message da nhan duoc:%cn”, idProc, inmsg);}if(idProc == 1){ source = 0;dest = 0; //nhan du lieu “x” tu tac vu co id = 0MPI_Recv(&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,&Stat);printf(“ProcessID: %d, Message da nhan duoc:%cn”, idProc, inmsg);outmsg = “y”; //gui du lieu “y” toi tac vu co id = 0MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);}//Giai phong MPIMPI_Finalize();return 0;}

Ví dụ 4: Thực hiện truyền thông không khoá, gửi message vòng tròn từ tác vụ có id 0 -> 1 …-> n-1 và ngược lại

#include “stdio.h”#include “mpi.h”int main(int argc, char* argv){int noProc, idProc, next, prev, tag1 = 1, tag2 = 2;char inmsg, outmsg;MPI_Request reqs;MPI_Status stats;outmsg = “x”;outmsg = “y”; //Khoi tao moi truong MPI su dung cac doi so mac dinh cua ham mainMPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&noProc);MPI_Comm_rank(MPI_COMM_WORLD, &idProc);next = idProc + 1;prev = idProc – 1;if(idProc == 0) prev = noProc – 1;if(idProc == (noProc -1)) next = 0; //gui va nhan du lieu theo kieu non-blockingMPI_Isend(&outmsg, 1, MPI_CHAR, next, tag1, MPI_COMM_WORLD,&reqs);MPI_Irecv(&inmsg, 1, MPI_CHAR, prev, tag1, MPI_COMM_WORLD, &reqs);MPI_Irecv(&inmsg, 1, MPI_CHAR, next, tag2, MPI_COMM_WORLD, &reqs);MPI_Isend(&outmsg, 1, MPI_CHAR, prev, tag2, MPI_COMM_WORLD, &reqs); //doi cac tien trinh nhan va gui message ket thuc//MPI_Wait(&reqs,&stats);MPI_Waitall(4, reqs, stats);printf(“ProcessId:%d, Message tag1:%cn”, idProc, inmsg);printf(“ProcessId:%d, Message tag2:%cn”, idProc, inmsg); MPI_Finalize();return 0;}Giải thíchĐoạn code trên thực hiện gửi message vòng tròn từ giữa các tác vụ, ví tụ tác vụ có id là i gửi dữ liệu tới tác vụ i+1 và nhận message từ i-1 và ngược lại.

*

Chuyên mục: Blog

Rate this post

Leave a Reply

Your email address will not be published. Required fields are marked *