Việc giảm được thực hiện bằng cách sử dụng MPI_Allreduce()
là có thể lặp lại miễn là bạn sử dụng cùng số lượng bộ xử lý, miễn là việc thực hiện được ghi chú theo sau xuất hiện trong Phần 5.9.1 của tiêu chuẩn MPI-2.2.
Tư vấn cho người thực hiện . Chúng tôi khuyến nghị MPI_REDUCE
thực hiện để có được kết quả tương tự bất cứ khi nào hàm được áp dụng trên cùng một đối số, xuất hiện theo cùng một thứ tự. Lưu ý rằng điều này có thể ngăn chặn tối ưu hóa tận dụng vị trí vật lý của bộ xử lý. ( Kết thúc lời khuyên cho người thực hiện .)
Nếu bạn cần đảm bảo khả năng tái sản xuất bằng mọi giá, bạn có thể làm theo hướng dẫn trong đoạn tiếp theo:
Tư vấn cho người dùng . Một số ứng dụng có thể không thể bỏ qua tính chất không liên kết của các hoạt động dấu phẩy động hoặc có thể sử dụng các hoạt động do người dùng xác định (xem Phần 5.9.5) yêu cầu một lệnh giảm đặc biệt và không thể được coi là liên kết. Các ứng dụng như vậy nên thực thi thứ tự đánh giá rõ ràng. Ví dụ, trong trường hợp các hoạt động yêu cầu một thứ tự đánh giá nghiêm ngặt từ trái sang phải (hoặc từ phải sang trái), điều này có thể được thực hiện bằng cách thu thập tất cả các toán hạng trong một quy trình (ví dụ: với
MPI_GATHER
), áp dụng thao tác khử theo thứ tự mong muốn (ví dụ: với
MPI_REDUCE_LOCAL
) và nếu cần, phát hoặc phân tán kết quả đến các quy trình khác (ví dụ: với MPI_BCAST
). ( Kết thúc lời khuyên cho người dùng .)
Trong sơ đồ rộng hơn, các thuật toán hiệu quả cho hầu hết các ứng dụng tận dụng lợi thế của địa phương. Vì thuật toán thực sự khác nhau khi chạy trên một số quy trình khác nhau, nên việc tái tạo chính xác kết quả khi chạy trên một số quy trình khác nhau là không thực tế. Một ngoại lệ có thể là multigrid với các bộ làm mịn Jacobi hoặc đa thức (ví dụ: Ch Quashev), trong đó phương pháp đơn giản này có thể thực hiện rất tốt.
Với cùng một số quy trình, thường có lợi cho hiệu suất để xử lý các thông báo theo thứ tự mà chúng được nhận (ví dụ: sử dụng MPI_Waitany()
), điều này đưa ra tính không xác định. Trong các trường hợp như vậy, bạn có thể thực hiện hai biến thể, biến thể nhanh nhận theo thứ tự bất kỳ và biến thể "gỡ lỗi" nhận theo thứ tự tĩnh. Điều này đòi hỏi tất cả các thư viện cơ bản cũng được viết để cung cấp hành vi này.
Để gỡ lỗi trong một số trường hợp, bạn có thể cô lập một phần của tính toán không cung cấp hành vi có thể lặp lại này và thực hiện dự phòng đó. Tùy thuộc vào cách các thành phần được thiết kế, sự thay đổi đó có thể là một lượng nhỏ mã hoặc rất khó xâm nhập.