2011-11-29 28 views
5

Tôi đang làm việc với các chương trình MPI trên siêu máy tính SMP. Tôi muốn xác định các quy trình nào đang chia sẻ cùng một nút, ví dụ bằng cách thiết lập một phím số nguyên bằng nhau trong tất cả các quy trình trên cùng một nút và khác với nút khác. Mục tiêu sẽ là sau đó sử dụng khóa này để tách một người giao tiếp và có các nhà giao tiếp phụ chỉ thu thập các quy trình trong cùng một nút.MPI: nhận số lượng nút (không phải quy trình) trong một bộ giao tiếp

Vì vậy, các chức năng sẽ trông như thế

int identify_node(MPI_Comm* comm); // returns a key characterizing a node 

Giả sử một phân phối đơn giản của quá trình như 0,1,2,3 trên node_1, 4,5,6,7 trên node_2, vv nó là một vấn đề của một công thức đơn giản, nhưng tôi muốn đạt được kết quả tương tự mà không có giả định về phân phối.

Tôi có ý tưởng làm thế nào để thực hiện điều đó bằng cách sử dụng MPI_Get_processor_name: bằng cách tính toán băm tên và giả sử không có hai tên sẽ nhận được cùng một mã băm (tôi không thích điều này vì nếu một ngày nào đó tôi có hai tên giống nhau băm, nó sẽ rất khó để theo dõi vấn đề), hoặc sử dụng một số loại thuật toán thỏa thuận trên các quy trình (cái nào? Tôi chưa biết).

Bạn sẽ làm điều đó như thế nào (hiệu quả nếu có thể)?

Matthieu

Trả lời

3

Bạn nói đúng rằng một giả định về sự phân bố sẽ là không khôn ngoan, vì cấp bậc sắp xếp lại thực sự là một kỹ thuật up-and-coming để cải thiện hiệu suất với chi phí đều đặn đó.

Thuật toán băm tốt trên giá trị trả về MPI_Get_processor_name phải khá an toàn, nhưng nếu bạn muốn kiểm tra kỹ, bạn luôn có thể thu thập tên thực trong mỗi nhóm bằng cách sử dụng MPI_Gatherv và so sánh chúng trực tiếp.

Có vẻ như this question giải quyết các mối quan tâm tương tự.

+0

Cảm ơn bạn, câu hỏi bạn đã đề cập thực sự là khá gần. Tôi nghĩ rằng tôi sẽ làm những gì bạn tư vấn: có được một băm của tên bộ vi xử lý, sau đó thực hiện một kiểm tra thứ hai với MPI_Gatherv. – sunmat

Các vấn đề liên quan