Một cách hiệu quả để thông báo các quy trình MPI nhận tin nhắn là gì?


8

Trong đó MPI, có bất kỳ cơ chế tích hợp nào để thông báo cho một nhóm các quy trình mà họ cần để nhận tin nhắn từ các quy trình khác không?

Trong ứng dụng của tôi, mọi quy trình cần gửi dữ liệu đến một nhóm các quy trình có ID xếp hạng đã biết (có khả năng thay đổi ở mỗi lần lặp), nhưng họ không biết thứ hạng của các quy trình sẽ nhận được tin nhắn từ đó. Có một cách di động, tốt nhất là tích hợp sẵn, để đạt được điều này mà không cần truy vấn từng quy trình không?

Câu trả lời:


7

Bạn có thể thử để tất cả các bộ xử lý sử dụng MPI_IPcoat hoặc MPI_Probe với MPI_ANY_SOURCE để kiểm tra xem có bất kỳ tin nhắn phải thu nào với một thẻ nhất định không. Nếu có thông báo trùng khớp, bạn có thể trích xuất thứ hạng người gửi từ trạng thái được trả về và gọi MPI_Recv ngay lập tức.


Là gọi MPI_Probevề cơ bản rẻ hơn MPI_Recv?
mmirzadeh

@GradGuy Với MPI_IPcoat và MPI_Probe bạn thực sự không nhận được bất kỳ tin nhắn nào (bạn chỉ đang truy vấn MPI để xem có tin nhắn nào phải thu không), vì vậy theo nghĩa đó tôi cho rằng nó rẻ hơn MPI_Recv.
Matthew Emmett

@MatthewEmmett Làm thế nào người nhận biết có bao nhiêu MPI_IProbecuộc gọi để đăng hoặc bao lâu tiếp tục thăm dò?
Shibli

12

Những người khác đã đề xuất các biến thể MPI_Probe khác nhau nhưng tôi muốn chỉ ra một điều: MPI không phải là một cuộc gọi thủ tục từ xa, tức là không có cách nào để thông báo một quy trình mà một số tin nhắn đã đến (ví dụ: bằng cách tăng tín hiệu ). Tin nhắn được gửi nhưng nếu quá trình nhận không thực sự đi tìm chúng, thì sẽ không có gì xảy ra. Như vậy, câu trả lời cho câu hỏi của bạn là "không", nhưng một quá trình có thể chủ động tìm hiểu xem một tin nhắn đã được gửi đến nó chưa.


Về lý thuyết, MPI_Probe có thể được mô tả bằng hạt nhân sao cho nó bị động cho đến khi được sử dụng, điều này không quá khác biệt so với cách IBM triển khai các RPC thực trên Blue Gene (nơi mà OS và HW hợp tác để thực hiện các ngắt do mạng khởi tạo rất hiệu quả có thể gọi cuộc gọi lại do người dùng định nghĩa). Tất nhiên, không có triển khai nào tôi biết về việc thực sự làm điều này với việc chặn các cuộc gọi MPI ...
Jeff

1
Điểm tôi muốn đưa ra không phải là quá nhiều về cách nó thực sự được thực hiện, mà là về mô hình tinh thần mà người ta nên có khi nghĩ về MPI. MPI hoàn toàn là một khái niệm thụ động: bạn không thể truy cập dữ liệu từ một quá trình khác, bạn không thể mong đợi tín hiệu được đưa ra nếu có tin nhắn đến; mọi thứ chỉ xảy ra nếu bạn chủ động gửi tin nhắn hoặc xem liệu có ai đến không.
Wolfgang Bangerth 7/07/13

Bạn nói đúng về một tín hiệu nhưng RMA cung cấp cho bạn quyền truy cập vào dữ liệu từ xa và việc triển khai được cho là cung cấp tiến trình thụ động.
Jeff

1
Vâng, bạn đang nói về những gì MPI 3 gọi là "giao tiếp một phía". Đó là một bổ sung khá gần đây và có thể là một bổ sung hiếm khi được sử dụng. Nhưng tôi nghĩ nó không lấy đi từ mô hình tinh thần mà tôi đã trình bày ở trên.
Wolfgang Bangerth

MPI 2.0 đã có RMA mười năm trước và người ta có thể triển khai ví dụ put_with_notify bằng các tính năng đó. Tôi đồng ý rằng MPI không có các cuộc gọi thủ tục từ xa hay còn gọi là tin nhắn hoạt động nhưng chưa có máy không phải của IBM thực hiện những cuộc gọi mà không bỏ phiếu, vì vậy chúng tôi không thực sự nói về MPI nữa nếu chúng tôi chỉ trích nhu cầu bỏ phiếu.
Jeff


1

Nếu người gửi biết họ đang gửi cho ai nhưng người nhận không biết họ đang nhận từ ai, chỉ cần gửi nhận của bạn từ MPI_ANY_SOURCE. Điều đó sẽ phù hợp với nhận với bất kỳ quá trình gửi tin nhắn đến nó.

Nếu người nhận có thể thực sự không nhận được gì cả, họ có thể đăng iRecv. Bất cứ khi nào một quá trình được thực hiện gửi tin nhắn của nó, nó có thể đăng Ibarrier. Khi Ibarrier hoàn thành vì tất cả các quy trình đã nhập vào nó (và được gọi là MPI_WAIT trên đối tượng yêu cầu), mọi người đều biết rằng giao tiếp đã được thực hiện và họ có thể hủy bỏ Irecv trước đó.


Theo thứ tự nào nhận được tin nhắn? Tôi cần gửi lại kết quả của người gửi về một số tính toán ...
mmirzadeh

Việc nhận sẽ theo thứ tự cho mỗi quá trình gửi. Nếu hạng 1 gửi tin nhắn A - B - C theo thứ tự đó, chúng sẽ đến theo thứ tự đó. Không có sự đảm bảo về thứ tự giữa các quy trình.
Wesley Bland

Tôi hiểu rồi ... nhưng nó có đảm bảo rằng các thông điệp từ các quy trình không bị trộn lẫn với nhau không?
mmirzadeh

Không. Các tin nhắn giữa các quá trình có thể đến theo thứ tự bất kỳ.
Wesley Bland

3
MPI_Cattery là một chức năng khủng khiếp và nên được sử dụng không thường xuyên nhất có thể. Tôi rất tán thành các biến thể của thăm dò thay thế.
Jeff
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.