Bài giảng cung cấp cho người học các kiến thức: Lập trình thư viện MPI, mô hình lập trình, định dạng các hàm trong MPI, cấu trúc của chương trình MPI,... Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn dùng làm tài liệu học tập và nghiên cứu. Mời các bạn cùng tham khảo chi tiết nội dung tài liệu.
5/11/16 LẬP TRÌNH THƯ VIỆN MPI MESSAGE PASSING INTERFACE ThS Phan Trọng Tiến Bộ môn CNPM – Khoa CNTT Học Viện Nông nghiệp Việt Nam Email: phantien84@gmail.com Website: http://timoday.edu.vn 1/1/2015 Lập trình thư viện MPI MPI gì? q Là viết tắt Message Passing Interface, dạng giao thức kết nối máy tính Nó nằm chuẩn “de facto” cho kết nối nút chạy chương trình song song nhớ phân tán q Tập MPI thi hành bao gồm thư viện thủ tục cho gọi từ chương trình Fortran, C, C++ hay Ada 1/1/2015 Lập trình thư viện MPI 5/11/16 Mơ hình lập trình q MPI đời mục đích dành cho hệ thống máy tính có nhớ phân tán Tuy nhiên MPI triển khai hệ thống máy tính có nhớ chia sẻ 1/1/2015 Lập trình thư viện MPI Lập trình MPI q Header file: q Yêu cầu cho chương trình lập trình MPI q Định dạng hàm MPI #include “mpi.h” rc = MPI_Xxxxx(parameter) 1/1/2015 Lập trình thư viện MPI 5/11/16 Lập trình MPI q Cấu trúc chương trình MPI 1/1/2015 Lập trình thư viện MPI Communicators and Groups q Communicators Group tập hợp tất processes giao tiếp với q Phần lớn hàm thư viện MPI yêu cầu tham số Communicator q MPI_COMM_WORLD định nghĩa sẵn 1/1/2015 Lập trình thư viện MPI 5/11/16 Rank q Với Communicator, processes có ID định q Rank q Sử dụng rank message để nguồn (source) đích (destination) 1/1/2015 Lập trình thư viện MPI Các hàm quản lý môi trường q MPI_Init q Khởi tạo môi trường thực thi MPI Hàm gọi chương trình MPI, gọi trước hàm MPI khác, gọi lần int MPI_Init(int *argc,char ***argv) 1/1/2015 Lập trình thư viện MPI 5/11/16 Các hàm quản lý môi trường q MPI_Comm_size q Xác định số lượng process nhóm ứng với Communicator (thường MPI_COMM_WORLD) q MPI_Comm_rank q Trả id Communicator int MPI_Comm_size(MPI_Comm comm,int *size ) int MPI_Comm_rank (comm,&rank) 1/1/2015 Lập trình thư viện MPI Các hàm quản lý môi trường q MPI_Abort q Hủy bỏ tất MPI processes gắn với Communicator int MPI_Abort(MPI_Comm comm,int errorcode) 1/1/2015 Lập trình thư viện MPI 10 5/11/16 Các hàm quản lý môi trường q MPI_Finalize q Kết thúc môi trường thực thi MPI int MPI_Finalize() 1/1/2015 Lập trình thư viện MPI 11 Ví dụ #include "mpi.h" #include int main(int argc, char *argv[]) { int numtasks, rank, rc; rc = MPI_Init(&argc,&argv); if (rc != MPI_SUCCESS) { printf ("Error starting MPI program Terminating.\n"); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD,&numtasks); MPI_Comm_rank(MPI_COMM_WORLD,&rank); printf ("Number of tasks= %d My rank= %d\n", numtasks,rank); /******* some work *******/ MPI_Finalize(); } 1/1/2015 Lập trình thư viện MPI 12 5/11/16 Giao tiếp Point to Point q MPI Point to Point giao tiếp hai hai processes với q Khi Process thực giao thức truyền tin (send) nhiệm vụ khác phải có giao thức nhận tin (receive) tương ứng 1/1/2015 Lập trình thư viện MPI 13 Giao tiếp Point to Point q Các kiểu truyền nhận MPI q Synchronous send q Blocking send/blocking receive q Non-Blocking send/ non-blocking receive q Buffered send q Combined send/receive q Ready send 1/1/2015 Lập trình thư viện MPI 14 5/11/16 Bộ nhớ đệm (Buffer) 1/1/2015 Lập trình thư viện MPI 15 Blocking q Phương thức send kết thúc application buffer truyền q Phương thức send đồng (synchronous) bên nhận (receive) xác nhận thành công q Phương thức send không đồng system buffer dùng để lưu liệu q Phương thức receive kết thúc sau nhận liệu 1/1/2015 Lập trình thư viện MPI 16 5/11/16 Non-blocking q Hai phương thức send receive có hoạt động giống nhau, chúng kết thúc sau lời gọi mà không quan tâm liệu gửi nhận xong hay chưa q Cần sử dụng phương thức “wait” 1/1/2015 Lập trình thư viện MPI 17 Các hàm Point-to-Point Blocking sends MPI_Send(buffer, count, type, dest, tag, comm) Non-Blocking sends MPI_Isend(buffer, count, type, dest, tag, comm, request) Blocking receive MPI_Recv(buffer, count, type, source, tag, comm, status) Non-blocking receive MPI_Irecv(buffer, count, type, source, tag, comm, request) 1/1/2015 Lập trình thư viện MPI 18 5/11/16 Tham số hàm q Buffer: q Là Application Buffer, địa trỏ sử dụng để gửi nhận q Count q Số lượng liệu truyền q Dest q Là tham số phương thức send, processes nhận liệu(rank of process) 1/1/2015 Lập trình thư viện MPI 19 Tham số hàm q Source q Tham số phương thức nhận, process truyền liệu Nếu tham số MPI_ANY_SOURCE nhận từ process q Tag q Là định danh tin Hai phương thức truyền nhận phải có tag trùng q Sử dụng MPI_ANY_TAG khơng quan tâm tới định danh tin 1/1/2015 Lập trình thư viện MPI 20 10 5/11/16 Tham số hàm q Communicator q Chỉ communicator mà processes giao tiếp với q Status q Sử dụng phương thức nhận, source tag tin q Được định nghĩa cấu trúc MPI_Status ( stat.MPI_SOURCE, stat.MPI_TAG) 1/1/2015 Lập trình thư viện MPI 21 Tham số hàm q Request: q Được sử dụng phương thức send receive non-blocking q Hệ thống gán cho phương thức “số request” để người lập trình sử dụng 1/1/2015 Lập trình thư viện MPI 22 11 5/11/16 MPI Data type C Datatype MPI_CHAR signed char MPI_SHORT signed short in MPI_INT signed int MPI_LONG signed long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long MPI_FLOAT float MPI_DOUBLE double MPI_BYTE MPI_PACKED 1/1/2015 Lập trình thư viện MPI 23 MPI_Send q Là phương thức blocking send Hàm kết thúc application buffer gửi hết liệu MPI_Send(&buf,count,datatype,dest,tag,comm) 1/1/2015 Lập trình thư viện MPI 24 12 5/11/16 MPI_Recv q Là phương thức blocking Receive, kết thúc liệu application buffer nhận MPI_Recv(&buf,count,datatype,source,tag,comm,&status) 1/1/2015 Lập trình thư viện MPI 25 MPI_Ssend q Là phương thức blocking send đồng Nó kết thúc application buffer truyền hết bên nhận bắt đầu nhận liệu MPI_Ssend(&buf,count,datatype,dest,tag,comm) 1/1/2015 Lập trình thư viện MPI 26 13 5/11/16 MPI_Isend q Hàm kết thúc mà không quan tâm tới application buffer gửi hết hay chưa Do đó, chương trình khơng nên thay đổi giá trị application buffer q Sử dụng hàm MPI_Wait MPI_Test để đảm bảo việc truyền liệu thành cơng MPI_Isend(&buf,count,datatype,dest,tag,comm,&request) 1/1/2015 Lập trình thư viện MPI 27 MPI_Irecv q Hàm kết thúc mà không quan tâm tới việc applicaton buffer nhận hết hay chưa q Sử dụng MPI_Wait MPI_Test để kiểm tra việc nhận liệu thành công MPI_Irecv(&buf,count,datatype,source,tag,comm,&request) 1/1/2015 Lập trình thư viện MPI 28 14 5/11/16 MPI_Wait q Được sử dụng non-blocking send receive, dừng lại việc nhận gửi thành cơng MPI_Wait (&request,&status) MPI_Waitall(count,&array_of_requests,&array_of_statuses) 1/1/2015 Lập trình thư viện MPI 29 Truyền thơng tập hợp q Các processes có communicator giao tiếp với q Mặc định, processes có communicator MPI_COMM_WORLD q Tùy vào mục đích lập trình để chia processes theo nhóm riêng biệt 1/1/2015 Lập trình thư viện MPI 30 15 5/11/16 Các kiểu giao tiếp tập hợp q Đồng bộ: q Các processes nhóm chờ q Di chuyển liệu q Broadcast, scatter/gather, all to all q Tính tốn tập hợp (reduction) q Một process nhóm tập hợp liệu tính tốn liệu 1/1/2015 Lập trình thư viện MPI 31 Di chuyển liệu 1/1/2015 Lập trình thư viện MPI 32 16 5/11/16 MPI_Barrier q Để đồng tất các process nhóm q Khi process tới lời gọi MPI_Barrier dừng lại tất process khác tới lời gọi MPI_Barrier MPI_Barrier (comm) 1/1/2015 Lập trình thư viện MPI 33 MPI_Bcast q Gửi tin từ processes có rank “root” tới tất process khác MPI_Bcast(&buffer,count,datatype,root,comm) 1/1/2015 Lập trình thư viện MPI 34 17 5/11/16 1/1/2015 Lập trình thư viện MPI 35 MPI_Scatter q Gửi liệu từ process tới process khác nhóm MPI_Scatter(&sendbuf,sendcnt,sendtype,&recvbuf,recv cnt,recvtype,root,comm) 1/1/2015 Lập trình thư viện MPI 36 18 5/11/16 1/1/2015 Lập trình thư viện MPI 37 1/1/2015 Lập trình thư viện MPI 38 19 5/11/16 1/1/2015 Lập trình thư viện MPI 39 1/1/2015 Lập trình thư viện MPI 40 20 5/11/16 MPI Reduction Operation C Data types MPI_MAX Maximum Integer,float MPI_MIN Minimum Integer,float MPI_SUM Sum Integer,float MPI_PROD Product Integer,float MPI_LAND Logical AND Integer MPI_BAND Bit-wise AND Integer,MPI_BYTE MPI_LOR Logical OR Integer MPI_BOR Bit-wise OR Integer,MPI_BYTE MPI_LXOR Logical XOR Integer MPI_BXOR Bit-wise XOR Integer,MPI_BYTE MPI_MAXLOC Max value and location Float, double and long double MPI_MINLOC Min value and location Float, double and long double 1/1/2015 Lập trình thư viện MPI 41 1/1/2015 Lập trình thư viện MPI 42 21 5/11/16 1/1/2015 Lập trình thư viện MPI 43 1/1/2015 Lập trình thư viện MPI 44 22 ... 1/1/2015 Lập trình thư viện MPI 36 18 5/11/16 1/1/2015 Lập trình thư viện MPI 37 1/1/2015 Lập trình thư viện MPI 38 19 5/11/16 1/1/2015 Lập trình thư viện MPI 39 1/1/2015 Lập trình thư viện MPI 40... trình lập trình MPI q Định dạng hàm MPI #include ? ?mpi. h” rc = MPI_ Xxxxx(parameter) 1/1/2015 Lập trình thư viện MPI 5/11/16 Lập trình MPI q Cấu trúc chương trình MPI 1/1/2015 Lập trình thư viện. .. double MPI_ MINLOC Min value and location Float, double and long double 1/1/2015 Lập trình thư viện MPI 41 1/1/2015 Lập trình thư viện MPI 42 21 5/11/16 1/1/2015 Lập trình thư viện MPI 43 1/1/2015 Lập