Lab Parallel Programming with MPI Point to Point Communications Mục tiêu SV tìm hiểu sử dụng hàm thư viện MPI Viết chương trình MPI đơn giản minh họa việc truyền thơng điệp qua lại process Một số hàm SV cần tìm hiểu : o MPI_Init(), MPI_Comm_rank(), MPI_Comm_size(), MPI_Finalize() o MPI_Send(), MPI_Ssend(), MPI_Bsend(), MPI_Rsend(), MPI_Issend(), … o MPI_Recv(), MPI_Irecv() o MPI_Wtime(), MPI_Get_count(), MPI_Wait(), MPI_Test() om - C Nội dung Sự giao tiếp process Process nguồn gửi thông điệp đến process đích Process đích nhận thơng điệp Hoạt động giao tiếp diễn “communicator” Process đích nhận biết thông qua định danh (rank) “communicator” Si - nh Vi en Zo ne 2.1 Giới thiệu 2.2 Chương trình minh họa 2.2.1 Chương trình Hello world: #include #include #include int main(int argc, char **argv){ SinhVienZone.com https://fb.com/sinhvienzonevn int i,rank,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); printf("Hello world, I have rank %d out of %d processes \n",rank,size); MPI_Finalize(); return 0; } Để biên dịch thực thi chương trình, SV thực lệnh sau: om $ mpicc hello.c –o hello $ mpirun –np 10 –hostfile fileName hello ne C SV nhận xét thứ tự dòng hello xuất hình Hãy điều khiển thứ tự xuất dòng hello world ! Zo 2.2.2 Chương trình minh họa giao tiếp point to point: pPoint.c en #include #include #include nh Vi int main(int argc, char **argv){ int rank,size; double a,b,s; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); Si fprintf(stdout,"\n Process %d of %d processes starts \n", rank, size); if(rank == 1) { b = 12.2; MPI_Recv(&a,1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); s = b - a ; fprintf(stdout," The result is : %f \n", s); } else { a = rank; MPI_Send(&a, 1, MPI_DOUBLE, 1, 11, MPI_COMM_WORLD); } MPI_Finalize(); return 0; } SV thực thi chương trình nhiều lần nhận xét kết chương trình ! SinhVienZone.com https://fb.com/sinhvienzonevn Bài tập SV sử dụng MPI_Send, MPI_Recv thư viện MPI viết chương trình sau: 3.1 Viết chương trình minh họa giao tiếp hai process hình bên: P0 P1 ping - Process gửi thông điệp đến Process (ping) pong - Sau nhận thông điệp này, Process gửi thông điệp cho Process (pong) om - Lặp lại trình ping-pong với độ lớn tùy ý, vd: 50, 80, 90 … - Dùng hàm đo thời gian MPI ( MPI_Wtime() ) để đo thời gian C truyền thông điệp time Si nh Vi en Zo ne 3.2 Viết chương trình gửi liệu tập process theo dạng xoay vòng (ring), process cập nhật giá trị liệu cho riêng Kết process có giá trị liệu sau chu kỳ truyền nhận thông điệp Hình sau minh họa cho q trình thu thập thơng tin process theo vòng tròn: SV thực chương trình theo hình minh họa với số lượng process tùy ý (có thể lớn 3), kết chương trình giá trị sum in từ process - my_rank : giá trị process muốn gửi snd_buf : buffer dùng để gửi liệu rcv_buf : buffer dùng để nhận liệu 3.3 Viết chương trình đếm số lần xuất số “target” cho trước mảng số thực có kích thướt N, với N > 1010 ghi nhận số phần tử mảng có chứa target lên file SinhVienZone.com https://fb.com/sinhvienzonevn Tham khảo cho hàm MPI_Send MPI_Recv C: int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) : địa liệu gởi count : số phần tử cần gửi datatype : Kiểu liệu gửi dest : Định danh (rank) tiến trình nhận tag : Giá trị dùng để nhận biết thông điệpkhác Do người dùng chọn comm : Không gian giao tiếp (thường định tất tiến trình tạo ra) ne C om buf Zo int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) : địa vùng nhận liệu count : số phần tử nhận datatype : Kiểu liệu nhận src : Định danh (rank) tiến trình gửi tag : Giá trị dùng để nhận biết thông điệpkhác Do người dùng chọn comm : Không gian giao tiếp (thường định tất tiến trình tạo ra) Vi nh Si status en buf : Biến lưu thông tin thông điệp nhận SinhVienZone.com https://fb.com/sinhvienzonevn ... lên file SinhVienZone. com https://fb .com/ sinhvienzonevn Tham khảo cho hàm MPI_Send MPI_Recv C: int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) : địa... Do người dùng chọn comm : Không gian giao tiếp (thường định tất tiến trình tạo ra) Vi nh Si status en buf : Biến lưu thông tin thông điệp nhận SinhVienZone. com https://fb .com/ sinhvienzonevn ... MPI_Finalize(); return 0; } SV thực thi chương trình nhiều lần nhận xét kết chương trình ! SinhVienZone. com https://fb .com/ sinhvienzonevn Bài tập SV sử dụng MPI_Send, MPI_Recv thư viện MPI viết chương trình