Làm thế nào để giải quyết vấn đề không kết hợp số để giảm song song?


17

Một giảm song song giả định rằng các hoạt động tương ứng là kết hợp. Giả định này bị vi phạm để thêm số dấu phẩy động. Bạn có thể hỏi tại sao tôi quan tâm đến điều này. Vâng, nó làm cho kết quả ít tái sản xuất. Và nó trở nên tồi tệ hơn khi ủ mô phỏng được sử dụng để tối ưu hóa (hoặc phù hợp với các tham số) so với các chương trình con tạo ra kết quả không thể lặp lại như vậy.

Những cách phổ biến để đối phó với vấn đề này là gì? Có thể nói gì về các chiến lược sau đây?

  • Đừng quan tâm đến khả năng không tái sản xuất.
  • Không sử dụng giảm song song với số dấu phẩy động và phép cộng.
  • Tạo các gói công việc có kích thước phù hợp theo cách có thể tái tạo và thực hiện việc giảm cuối cùng bằng tay.
  • Sử dụng độ chính xác cao hơn để bổ sung (nhưng không phải tất cả các trình biên dịch đều cung cấp các loại dấu phẩy động có độ chính xác cao hơn).

Bạn có lo ngại về khả năng tái tạo trên cùng một số quy trình hoặc khả năng tái tạo trên một số bộ xử lý khác nhau không? Bao nhiêu của một hit hiệu suất bạn sẵn sàng để có khả năng tái tạo bitwise? Bạn chỉ quan tâm đến ủ mô phỏng?
Jed Brown

@JedBrown Tôi lo ngại về khả năng có được kết quả có thể lặp lại, ví dụ như để gỡ lỗi các vấn đề tiềm ẩn. Sẽ tốt cho tôi nếu có cách tái tạo kết quả, ví dụ bằng cách sử dụng cùng số lượng bộ xử lý (hoặc chỉ bằng cách "biết" số lượng bộ xử lý được sử dụng ban đầu). Tôi sẽ sẵn sàng thực hiện cú đánh hiệu suất liên quan đến việc sử dụng các loại dấu phẩy động có độ chính xác cao hơn cho chính phép cộng. Các vấn đề cụ thể của tôi chủ yếu liên quan đến mô phỏng ủ và sự khác biệt bất ngờ, nhưng tất cả những điều này hóa ra là lỗi thực sự.
Thomas Klimpel

Câu trả lời:


15

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_REDUCEthự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.


6

Đối với hầu hết các phần tôi ditto câu trả lời của Jed. Tuy nhiên, có một cách khác: Với kích thước của các số dấu phẩy động thông thường, bạn có thể lưu trữ mọi số trong một số điểm cố định bit 4000 hoặc hơn. Vì vậy, nếu bạn thực hiện giảm số lượng dấu phẩy động, do đó, bạn sẽ có được một phép tính chính xác, bất kể tính kết hợp. (Xin lỗi, tôi không có tài liệu tham khảo cho ai nghĩ ra ý tưởng này.)


1
Tôi không nghĩ anh ấy là người đầu tiên, nhưng đồng nghiệp của bạn, Tiến sĩ Băng thông chắc chắn có một bài viết hay về chủ đề này: sites.utexas.edu/jdm4372/2012/02/15/iêu
Jeff

5

Bạn có thể thực hiện thuật toán giảm ổn định số trong MPI giống như bạn có thể thực hiện nối tiếp. Có thể có một hit hiệu suất, tất nhiên. Nếu bạn có thể đủ khả năng sao chép vectơ, chỉ cần sử dụng MPI_Gather và thực hiện giảm số lượng ổn định về số trong gốc. Trong một số trường hợp, bạn có thể thấy hiệu suất đạt được không phải là vấn đề lớn.

Một giải pháp khác là sử dụng ắc quy rộng như mô tả ở đây . Bạn có thể làm điều này với MPI dưới dạng giảm do người dùng xác định, mặc dù nó sẽ sử dụng nhiều băng thông hơn.

Một sự thỏa hiệp cho những điều trên là sử dụng tổng kết bù. Xem tài liệu tham khảo Tổng hợp Kah Kahan để biết chi tiết. Độ chính xác và tính ổn định của các thuật toán số của Higham là một nguồn tài nguyên tuyệt vời về chủ đề này.



2

Tôi muốn chỉ ra rằng thay vì sử dụng số học có độ chính xác cao hơn cho phép cộng, có khả năng sử dụng phép tính tổng bù (xem [1]). Điều này có thể làm tăng độ chính xác của tổng kết mà không cần phải dùng đến các loại dữ liệu lớn hơn.

[1] Higham, NJ Độ chính xác của Tổng kết điểm nổi. Tạp chí SIAM về tính toán khoa học 14, 783 trừ799 (1993).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.