2012-03-15 11 views
5

Tôi muốn gửi tin nhắn đến một trong các cấp bậc nhận được tin nhắn với một thẻ cụ thể. Nếu có bất kỳ thứ hạng nào nhận được tin nhắn và tin nhắn được tiêu thụ. Trong MPI_Recv() chúng ta có thể nhận được một tin nhắn bằng cách sử dụng MPI_ANY_SOURCE/MPI_ANY_TAG nhưng MPI_Send() không thể làm điều này. Làm thế nào tôi có thể gửi tin nhắn với điểm đến không xác định? MPI_Bcast() không thể thực hiện được vì sau khi nhận được, tôi phải trả lời quá trình nguồn. Cảm ơn.Làm thế nào để gửi tin nhắn mà không có một điểm đến cụ thể trong MPI?

+0

Nếu người nhận biết dữ liệu nào cần, bạn có thể sử dụng các hoạt động MPI một mặt, cụ thể là 'MPI_Get'. –

+1

Câu hỏi này sẽ thực sự được đón nhận trên http://scicomp.stackexchange.com –

Trả lời

4

Điều tôi sẽ làm là nhân viên xử lý tín hiệu cho chủ nhân mà họ sẵn sàng nhận. Các bậc thầy sẽ theo dõi trong đó xếp hạng đã sẵn sàng, chọn một (thấp nhất xếp hạng đầu tiên, ngẫu nhiên, vòng robin, tuy nhiên bạn thích), gửi cho nó, và xóa cờ "sẵn sàng" của nó.

1

Bạn chỉ muốn gửi tin nhắn đến một thứ hạng ngẫu nhiên?

MPI_Comm_size(MPI_COMM_WORLD, &size); 
sendto = rand() % size; 
MPI_Send(buffer, count, MPI_CHAR, sendto, 0, MPI_COMM_WORLD); 
1

Câu trả lời ngắn gọn là: Bạn không thể thực hiện điều này trong MPI.

Câu trả lời hơi dài hơn là: Bạn có thể không muốn làm điều này. Tôi đoán rằng bạn đang cố gắng thiết lập một số loại trộm cắp công việc. Như suszterpatt đã đề xuất, bạn có thể sử dụng giao tiếp một chiều để 'lấy' công việc từ quá trình gửi, nhưng bạn sẽ cần phải sử dụng khóa và điều này sẽ không quy mô tốt cho nhiều quy trình trừ khi có ý tưởng về nhóm quy trình địa phương (tức là, bạn không thể có 1.000 quy trình tất cả các công việc ăn cắp từ một quá trình, bạn sẽ cần phải phân hủy mọi thứ).