Microsoft mpi là gì

     
Cấu trúc chương trình MPINhóm (group) cùng 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 tuy vậy 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 áp dụng trong đo lường và thống kê 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ừ những chương trình Fortran, C, C++ tốt Ada.

Bạn đang xem: Microsoft mpi là gì

Mô hình lập trình

Xu hướng technology thay đổi, bộ lưu trữ chia sẻ kết hợp với mạng máy vi tính tạo ra dạng lai của nhì hệ thống bộ nhớ lưu trữ chia sẻ và bộ lưu trữ phân tán.Ngày ni MPI rất có thể chạy trên đa số các căn cơ phần cứng:Bộ nhớ phân tách sẻBộ nhớ phân tánDạng lai hai các loại trên

Cấu trúc lịch trình MPI

*

Ví dụ 1: Khởi sinh sản 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 mang lại MPIMPI_Init(&argc,&argv); int numtasks;//Chua so process vào 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 vào tong so: %d ",idtask, numtasks);//Giai phong moi truong MPIMPI_Finalize();return 0;Tham khảo giải pháp tích phù hợp MPI trong Visual Studio và cấu hình

Nhóm (group) với Comunicator

Một nhóm là 1 trong những tập tất cả thế tự của những tiến trình. Mỗi quá trình trong một tổ được thêm với một vài id duy nhất (rank). Những giá trị của rank ban đầu từ 0 tới N-1, tại chỗ này N là số quy trình trong nhóm. Vào MPI, một đội nhóm được đại diện thay mặt trong bộ lưu trữ hệ thống như 1 đối tượng. Nó rất 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 luôn gắn thêm với một đối tượng communicator.Một communicator liên quan đến một tổ các các bước mà rất có thể giao tiếp với nhau. Toàn bộ các message MPI bắt buộc chỉ định vì chưng một communicator. Hệt như group, những communicator được biểu lộ trong bộ nhớ lưu trữ như các đối tượng người tiêu dùng và được truy vấn bởi lập trình viên chỉ qua những “handle”. Ví dụ, handle cho một communicator là bao hàm tất cả các tác vụ của MPI_COMM_WORLD.Về kỹ càng lập trình viên, một đội và một communicator là một.

*

Ví dụ 2: Từ team ban đầu, phân thành 2 nhóm đơn nhất và thực hiện truyền thông media 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<4>=0,1,2,3, ranks2<4>=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. ",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 trường đoản cú điểm tới điểm

Ví dụ 3: Thực hiện truyền thông media có khoá gởi message ‘x’, ‘y’ tự tác vụ tất cả id = 0 tới tác vụ 1 cùng 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 teo id = 0 toi tac vu co id = 1if(idProc == 0)//gui du lieu "x" toi tac vu teo 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:%c ",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 domain authority nhan duoc:%c ",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 media không khoá, giữ hộ message vòng tròn tự tác vụ tất cả id 0 -> 1 …-> n-1 với 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<2>, outmsg<2>;MPI_Request reqs<4>;MPI_Status stats<4>;outmsg<0> = "x";outmsg<1> = "y"; //Khoi tao moi truong MPI su dung cac doi so mac dinh cua say mê 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<0>,1,MPI_CHAR,next,tag1,MPI_COMM_WORLD,&reqs<0>);MPI_Irecv(&inmsg<0>,1,MPI_CHAR,prev,tag1,MPI_COMM_WORLD, &reqs<1>);MPI_Irecv(&inmsg<1>,1,MPI_CHAR,next,tag2,MPI_COMM_WORLD, &reqs<2>);MPI_Isend(&outmsg<1>,1,MPI_CHAR,prev,tag2,MPI_COMM_WORLD, &reqs<3>); //doi cac tien trinh nhan va gui message ket thuc//MPI_Wait(&reqs,&stats);MPI_Waitall(4,reqs,stats);printf("ProcessId:%d, Message tag1:%c ",idProc, inmsg<0>);printf("ProcessId:%d, Message tag2:%c ",idProc, inmsg<1>); 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ụ tất cả id là i gửi dữ liệu tới tác vụ i+1 cùng nhận message trường đoản cú i-1 và ngược lại.
*

Truyền thông tập hợp

Truyền thông tập hợp bao gồm tất cả những tiến trình (process) vào phạm vi của một commnicator.

Tất cả những tiến trình là mang định, các thành viên phía bên trong một communicator MPI_COMM_WORLD.Bổ xung thêm các comminicators hoàn toàn có thể được định nghĩa bởi lập trình viên.Truyền thông tập hợp rất có thể có hiệu quả không mong mỏi muốn, trong những số ấy chương trình có thể thất bại có thể xảy ra nếu một tác vụ trong môt một communicator không tham dự.

Xem thêm: Cách Điều Trị Lỗ Chân Lông To Trên Mặt Thế Nào? Điều Trị Lỗ Chân Lông To Trên Mặt Thế Nào

Các kiểu media tập hợp:

*

Đồng bộ
 – những tiến trình đợi mang đến khi tất cả các member trong nhóm đạt mức điểm đồng bộ.Di gửi dữ liệu – broadcast, scatter/gather, all to all.Tính toán truyền thông (reductions) – một thành viên của tập thể nhóm thu thập tài liệu từ các thành viên khác và triển khai các thao tác (min, max, cộng, nhân, v.v.) bên trên dữ liệu.

Xem thêm: Hệ Thống Quản Lý Tệp Không Thể Làm Việc Gì, Bài 11: Tệp Và Quản Lý Tệp

Ví dụ 5: Thực hiện truyền thông media tập vừa lòng gửi dữ liệu từ một tác tới các tác vụ còn lại

#include "mpi.h"#include "stdio.h"#define kích cỡ 4int main(int argc, char* argv<>)int numtasks, rank, sendcount, recvcount, source;float sendbuf = 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 ;float recvbuf;//Khoi tao moi truongMPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &numtasks);if (numtasks == SIZE) source = 1; sendcount = SIZE; recvcount = SIZE; //Gui du lieu tu tac vu co id = 1 toi cac tac vu khac MPI_Scatter(sendbuf,sendcount,MPI_FLOAT,recvbuf,recvcount, MPI_FLOAT,source,MPI_COMM_WORLD); //In ra du lieu vào cac tac vu printf("Id task= %d ket qua: %f %f %f %f ",rank,recvbuf<0>, recvbuf<1>,recvbuf<2>,recvbuf<3>); else printf("So tac su dung nen bang: %d. Ket thuc. ",SIZE);MPI_Finalize();

Bài tập lập trình tuy nhiên song

Tính toán số PI

Có tương đối nhiều thuật toán và cách thức tính số PI, ngày này với sự trợ giúp của dòng sản phẩm tính tín đồ ta tính số PI cùng với độ chính xác rất cao.

Giá trị số PI hoàn toàn có thể được tính theo vô số cách thức khác nhau. Coi xét phương pháp tính số PI sau:Một hình trụ bán kính r nội tiếp trong hình vuôngGieo ngẫu nhiên các điểm trong hình vuôngXác định số điểm rơi trong hình vuông vắn và số điểm trong hình trònĐặt r = số điểm rơi vào hình tròn / số điểm rơi vào cảnh hình vuôngPI ~ 4 rThuật giải tuần tự:

npoints = 10000circle_count = 0do j = 1,npoints tạo nên 2 số ngẫu nhiên trong tầm 0 với 1 xcoordinate = random1 ycoordinate = random2 if (xcoordinate, ycoordinate) phía bên trong hình tròn then circle_count = circle_count + 1end doPI = 4.0*circle_count/npointsChiến thuật tuy nhiên song: ngắt vòng lặp thành các phần mà hoàn toàn có thể được triển khai bởi các tác vụ khác nhauThuật giải tuy vậy songnpoints = 10000circle_count = 0p = số tác vụnum = npoints/pkiểm tra xem if tôi là MASTER tuyệt WORKER bởi j = 1,num gây ra 2 số ngẫu nhiên trong tầm 0 và 1 xcoordinate = random1 ycoordinate = random2 if (xcoordinate, ycoordinate) bên phía trong hình tròn then circle_count = circle_count + 1end doif Tôi là MASTER dìm về từ những WORKER số circle_count đo lường và tính toán PI (sử dụng MASTER với các tính toán của WORKER)else if tôi là WORKER gửi trao MASTER circle_countendifPhan3_MPI