2012-01-26 28 views
10

Giả sử, tôi chạy một chương trình song song bằng MPI. Lệnh thực hiệnCách xác định số hạng/quy trình MPI cục bộ cho một socket/nút

mpirun -n 8 -npernode 2 <prg> 

khởi chạy 8 quy trình. Đó là 2 quy trình cho mỗi nút và 4 nút trong tổng số. (OpenMPI 1.5). Trong đó một nút bao gồm 1 CPU (lõi kép) và kết nối mạng giữa các nút là InfiniBand.

Bây giờ, số thứ tự (hoặc số quá trình) có thể được xác định với

int myrank; 
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 

này trả về một con số nằm giữa 0 và 7.

Nhưng, Làm thế nào tôi có thể xác định số nút (trong này trường hợp một số giữa 0 và 3) và số tiến trình trong một nút (số giữa 0 và 1)?

Trả lời

8

Nó phụ thuộc vào việc thực hiện Bộ KH & ĐT - và không có tiêu chuẩn cho vấn đề cụ thể này.

Mở Bộ KH & ĐT có một số biến môi trường có thể hữu ích. OMPI_COMM_WORLD_LOCAL_RANK sẽ cung cấp cho bạn thứ hạng địa phương trong một nút - nghĩa là. đây là số quy trình mà bạn đang tìm kiếm. Do đó, một cuộc gọi đến getenv sẽ trả lời vấn đề của bạn - nhưng điều này không thể chuyển sang các triển khai MPI khác.

Xem http://icl.cs.utk.edu/open-mpi/faq/?category=running#mpi-environmental-variables để biết danh sách (ngắn) các biến trong MPI mở.

Tôi không biết về "số nút" tương ứng.

+0

Các Câu Hỏi Thường Gặp nó liên kết mà bạn cung cấp là thực sự hữu ích. thanks – arunmoezhi

2

Vấn đề chính xác này được thảo luận trên Blog của Markus Wittmann, MPI Node-Local Rank determination.

Ở đó, ba chiến lược được đề nghị:

  1. A, giải pháp di động ngây thơ sử dụng MPI_Get_processor_name hoặc gethostname để tạo ra một định danh duy nhất cho nút và thực hiện một MPI_Alltoall trên đó. [...]
  2. [Phương pháp 2] dựa trên MPI_Comm_split, cung cấp cách dễ dàng để chia người giao tiếp thành các nhóm con (người giao tiếp phụ). [...]
  3. Bộ nhớ dùng chung có thể được sử dụng, nếu có. [...]

Đối với một số mã làm việc (có lẽ LGPL cấp phép?), Liên kết Wittmann để MpiNodeRank.cpp từ APSM library.

6

Tôi tin rằng bạn có thể đạt được điều đó với Bộ KH & ĐT-3 theo cách này:

MPI_Comm shmcomm; 
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, 
        MPI_INFO_NULL, &shmcomm); 
int shmrank; 
MPI_Comm_rank(shmcomm, &shmrank); 
+0

[Ở đây] (https://cvw.cac.cornell.edu/mpiadvtopics/splitting?AspxAutoDetectCookieSupport=1) là một giải thích tốt về những gì MPI_Comm_split_type làm. – aleixrocks