2013-08-08 16 views
5

Tôi đang cố gắng thực hiện triển khai bằng cách sử dụng MPI và Fortran để tách các quy trình trên cùng một nút thành các nhóm. MPI có một thói quen có thể xác định được điều đó không?Phân loại các quá trình nút cùng với MPI và FORTRAN

Tôi có ý tưởng tách các quy trình này theo tên máy chủ của chúng, giống nhau trên các nút của máy tôi đang sử dụng. Nhưng tôi không biết nếu nó là chung cho tất cả các cụm.

Trả lời

6

Bạn có thể muốn xem MPI_COMM_SPLIT_TYPE. Nó sẽ cho phép bạn chia một người giao tiếp hiện tại dựa trên split_type bạn vượt qua như một tham số:

int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, 
         MPI_Info info, MPI_Comm *newcomm) 

Ngay bây giờ, split_type chỉ là MPI_COMM_TYPE_SHARED, được định nghĩa trong tiêu chuẩn như:

Đây là loại chia bộ giao tiếp thành các subcommunicators, mỗi thiết bị trong đó có thể tạo vùng bộ nhớ dùng chung.

Điều này thường tương tự như những gì bạn đang yêu cầu, nhưng bạn sẽ phải kiểm tra kỹ xem máy tính của bạn có đúng không.

Điều khác bạn cần biết là đây là một chức năng mới trong MPI-3 để nó có thể không có sẵn trong tất cả các cài đặt của MPI. Tôi biết rằng nó có sẵn cho MPICH và các dẫn xuất của nó. AFAIK, nó không có sẵn trong bản phát hành cuối cùng của Open MPI. Vì vậy, hãy chắc chắn rằng bạn có một phiên bản của MPI mà thực sự hỗ trợ nó.

+0

Wesley, cảm ơn. Đó là một sự xấu hổ rằng điều này không phải là avaiable cho Open MPI. Mặc dù, hãy để tôi làm ví dụ để xem liệu tôi có hiểu cách phân chia loại này hoạt động hay không. Giả sử tôi có 32 quy trình trên 4 nút 8 lõi. Ý định của tôi là tạo 4 nhóm gồm 8 lõi, dựa trên các quy trình bộ nhớ dùng chung trên cùng một nút. Tôi có thể sử dụng MPI_Comm_split_type. Sử dụng ví dụ này tôi không thể tạo ra 8 nhóm 4 (đặt 2 nhóm trong mỗi nút), tôi có thể? –

+0

Có, bạn có thể làm điều đó. Nếu bạn muốn tạo 8 nhóm 4 nhóm trong đó mỗi nhóm là một nút cục bộ, bạn sẽ cần sử dụng tham số khóa để một nửa các quy trình đóng góp một khóa và nửa còn lại đóng góp một khóa khác. Đây là hành vi của cuộc gọi hiện tại MPI_COMM_SPLIT vì vậy cần có rất nhiều hướng dẫn để bạn làm theo. Bạn sẽ chỉ cần thêm một chút cho các bổ sung loại mới. –

+0

OpenMPI đặt biến môi trường OMPI_COMM_WORLD_LOCAL_RANK và OMPI_COMM_WORLD_LOCAL_SIZE mà bạn có thể sử dụng để tìm hiểu xem có bao nhiêu quy trình chia sẻ một nút ("kích thước cục bộ"). –

0

Tôi đã triển khai chức năng chia tách tương tự cho các hệ thống có môi trường không cung cấp MPI 3.0 và hoạt động khá tốt trên một số cụm. Nó sử dụng MPI_GET_PROCESSOR_NAME và dựa vào thực tế là hầu hết các triển khai MPI cụm trả về FQDN của nút như là kết quả - được thử nghiệm với Open MPI và Intel MPI (dựa trên MPICH, do đó hành vi tương tự được mong đợi với các dẫn xuất MPICH khác). Trong giả nó hoạt động như thế này:

rank := MPI_COMM_RANK(communicator) 
prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL 
next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL 

proc_name := MPI_GET_PROCESSOR_NAME 

list := MPI_RECV(from prev_rank) 
IF (list does not contain proc_name) THEN 
    list := list + proc_name 
END IF 

colour := index of proc_name in list 
key := rank 

MPI_SEND(list to next_rank) 

MPI_COMM_SPLIT(communicator, colour, key, newcomm) 

Mã này về cơ bản xây dựng một danh sách các tên vi xử lý Bộ KH & ĐT duy nhất (tên máy chủ) và mỗi quá trình sử dụng vị trí của tên bộ xử lý Bộ KH & ĐT của nó trong danh sách này như màu sắc cho các chức năng phân chia thông thường . Trong C của tôi thực hiện các thuật toán danh sách chỉ đơn giản là một chuỗi - nối của tất cả các mục với một số không byte như một tách. Ở Fortran, người ta có thể sử dụng bất kỳ biểu tượng nào không được phép bình thường trong tên máy chủ, ví dụ: ;. Sau đó, chuỗi được truyền đơn giản như một mảng của MPI_CHAR (C) hoặc MPI_CHARACTER (Fortran).

+0

Cơ chế này hoạt động trên tất cả các máy tôi đã gặp ngoại trừ Blue Gene/Q. Ở đó, tên bộ xử lý bao gồm số lõi bên trong một nút. Bạn có thể tạo tên bộ xử lý của riêng mình như sau:

+0

Trên BG/Q, các tiến trình không thể di chuyển giữa các lõi, do đó nó có ý nghĩa hoàn hảo để bao gồm ID lõi trong tên bộ xử lý. Còn Cray thì sao? Tôi đã không có cơ hội để sử dụng một trong một thời gian khá. –

+0

Các Crays tôi đã sử dụng cư xử như Linux. –

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