4. Phương pháp nghiên cứu
3.2. Xây dựng hàm tìm kiếm đường đi ngắn nhất
3.2.4 Lựa chọn hàm MPI cho thuật toán song song
Một chương trình MPI bao gồm nhiều chương trình tuần tự có trao đổi dữ liệu với nhau thơng qua việc gọi các hàm trong thư viện. Các hàm này thuộc bốn lớp cơ bản:
1. Khởi tạo, quản lý và kết thúc trao đổi. 2. Trao đổi giữa hai tiến trình.
3. Trao đổi giữa một nhóm các tiến trình. 4. Tạo các định dạng dữ liệu bất kỳ.
Lớp đầu tiên là các hàm được gọi để khởi đầu quá trình trao đổi, xác định số lượng bộ xử lý được sử dụng, tạo một nhóm con các bộ xử lý, xác định bộ xử lý nào đang chạy chương trình hiện tại.
- MPI_Init(): khởi tạo quá trình song song. - MPI_Finalize(): kết thúc quá trình song song. - MPI_Comm_rank(): xác định tên tiến trình.
- MPI_Comm_size(): xác định tổng số tiến trình chạy song song.
Lớp thứ hai là các hàm, được gọi để trao đổi dữ liệu điểm - đến - điểm, với các kiểu gửi và nhận dữ liệu khác nhau giữa hai bộ xử lý.
- MPI_Send(): gửi dữ liệu đến một tiến trình. - MPI_Recv(): nhận dữ liệu từ một tiến trình.
Lớp thứ ba là các hàm cho phép thực hiện trao đổi song song giữa một nhóm các bộ xử lý. Các hàm cơ bản:
- MPI_Bcast(): gửi dữ liệu từ một tiến trình đi tất cả các tiến trình. - MPI_Reduce(): gửi dữ liệu từ nhiều tiến trình về một tiến trình - MPI_Barrier(): dùng để đồng bộ hoạt động giữa các máy - MPI_Gather(): nhận dữ liệu từ nhiều tiến trình.
- MPI_Scatter(): gửi dữ liệu đến nhiều tiến trình
Lớp cuối cùng là các hàm cung cấp để tạo ra các cấu trúc dữ liệu phức tạp riêng của người dùng. Các hàm cơ bản:
- MPI_Type_struct(): tạo ra kiểu dữ liệu MPI riêng của người dùng
- MPI_Type_commit(): hịan thành q trình định nghĩa kiểu dữ liệu MPI Trong luận văn này, để thực hiện trao đổi song song giữa một nhóm các bộ xử lý cần sử dụng các hàm ở lớp thứ 3.
* Hàm Reduce
Hàm Reduce nhận kết quả từ các tiến trình và gửi kết quả đó đến tiến trình đã được chỉ định.
- Cú pháp: int MPI_ Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
Hình 3.1: phương thức hoạt động của hàm Reduce
* Hàm All – Reduce
Hàm All – Reduce tương tự như hàm Reduce, nhưng khơng có Root và tất cả các tiến trình đều nhận được kết quả.
* Hàm Broadcast
Hàm Boadcast cho phép một tiến trình gửi dữ liệu đến tất cả các tiến trình khác. - Cú pháp: int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int
root, MPI_Comm comm)
* Hàm Scatter
Hàm Scatter chia nhỏ dữ liệu của một tiến trình và phân phối các phần dữ liệu được chia lên các tiến trình khác.
- Cú pháp: int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
Hình 3.3: phương thức hoạt động của hàm Scatter
* Hàm Gather
Một tiến trình được chỉ định sẽ nhận kết quả từ các tiến trình khác khi sử dụng hàm Gather.
- Cú pháp: int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
Hình 3.4: phương thức hoạt động của hàm Gather
* Hàm Gather – to – All
Tương tự như hàm Gather, nhưng tất cả các tiến trình đều nhận được kết quả như nhau.
- Cú pháp: int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
Hình 3.5: phương thức hoạt động của hàm Gather – to - All
Hàm All –to – All cho phép tất cả các tiến trình phân chia dữ liệu, sau đó gửi từng phần dữ liệu đến các tiến trình khác.
- Cú pháp: int MPI_All_to_all(void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
Hình 3.6: phương thức hoạt động của hàm All – to – All
Căn cứ vào đặc điểm của các hàm ở lớp 3, luận văn sử dụng: - Hàm Reduce khi kết hợp các giá trị min;
- Hàm Broadcast để phân phối kết quả đến các tiến trình sau khi đã kết hợp; - Hàm Gather để tập hợp các kết quả sau khi duyệt hết tất cả các đỉnh;