2012-06-24 32 views
8

Tôi đang sử dụng gccOpenMPI. Thông thường, tôi chạy chương trình MPI bằng cách sử dụng trình bao bọc mpirun - ví dụ:Chạy chương trình OpenMPI mà không cần mpirun

mpirun -np 4 myprogram 

để bắt đầu 4 quy trình.

Tuy nhiên, tôi đã tự hỏi nếu có thể dễ dàng tạo ra một nhị phân sẽ tự động làm điều đó (có thể với một số tùy chọn mã cứng như -np 4 ở trên).

Tôi biết tôi có thể viết một wrapper C mà các cuộc gọi chương trình của tôi, chẳng hạn như sau:

#include <stdlib.h> 
#include <unistd.h> 

int main() { 
     char *options[] = { "mpirun", "-np", "4", "myprogram" }; 

     execvp("mpirun", options); 
     /* Ignoring return value to keep example simple */ 

     return EXIT_SUCCESS; 
} 

nhưng điều này có vẻ hơi vụng về và tôi kết thúc với hai thực thi thay vì một.

Tôi đã cố gắng để liên kết một cách rõ ràng các thư viện MPI, như

gcc -o myprogram -I/usr/lib/openmpi/include/ \ 
    -lmpi -L/usr/lib/openmpi/lib/ myprogram.c 

nhưng khi tôi chạy kết quả thực thi, MPI_Comm_size bộ số không như kích thước nhóm (như thể tôi đã cho -np 0 như là đối số). Tôi có thể sử dụng biến môi trường hoặc thứ gì khác để vượt qua kích thước nhóm không? Hoặc, có cách nào khác để xây dựng một chương trình MPI thực thi một lần (sử dụng Linux và gcc) không?

+0

Nó có thể được thực hiện, mặc dù tôi không biết làm thế nào từ đỉnh đầu của tôi. Tôi biết một vài chương trình mà tôi đã thực hiện để thực hiện việc này. Không có ma thuật thực sự trong đó, nó chỉ làm một đống công cụ đằng sau hậu trường mà bạn cũng có thể tự làm. –

+0

Tôi có hiểu chính xác không - bạn muốn bỏ qua 'mpirun' hoặc bạn muốn tự động gọi' mpirun' bằng cách nào đó? –

+0

@Hristo Iliev: Sẽ tốt hơn nếu tôi có một nhị phân tĩnh đơn. – Jay

Trả lời

6

Nếu tôi nhận được nó một cách chính xác, bạn muốn có một tự tung MPI thực thi. Như tôi đã viết trong bình luận của tôi, bạn có thể đi với một tùy chọn đặc biệt làm cho mã của bạn thực thi mpirun nếu được cung cấp, ví dụ: -launchmpi. Với MPI mở, nó thậm chí còn dễ dàng hơn vì nó xuất các biến môi trường đặc biệt để đưa ra các quy trình MPI, ví dụ: OMPI_COMM_WORLD_RANK. Nếu biến này tồn tại trong môi trường, thì bạn biết rằng chương trình đã được khởi chạy từ mpirun và không trực tiếp. Bạn có thể kết hợp cả hai phương pháp trong một kiểm tra đơn này:

int main (int argc, char **argv) 
{ 
    int perform_launch = 0; 
    // Scan argv[] for special option like "-launchmpi" 
    // and set perform_launch if found 

    if (perform_launch || getenv("OMPI_COMM_WORLD_RANK") == NULL) 
    { 
     // #args = argc + 3 ("mpirun -np 4" added) + NULL 
     // #args should be reduced by one if "-launchmpi" is present 
     char **args = (char **)calloc(
      argc + (perform_launch ? 3 : 4), 
      sizeof(char *)); 
     args[0] = "mpirun"; 
     args[1] = "-np"; 
     args[2] = "4"; 
     // Copy the entire argv to the rest of args but skip "-launchmpi" 

     execvp("mpirun", args); 

     return EXIT_SUCCESS; 
    } 

    // Proceed as regular MPI code 
    MPI_Init(&argc, &argv); 
    ... 
    // Magic happens here 
    ... 
    MPI_Finalize(); 

    return EXIT_SUCCESS; 
} 

Nếu bạn muốn kiểm soát số lượng của các quá trình trong công việc Bộ KH & ĐT, bạn có thể cung cấp nó như một arugment bổ sung, ví dụ -launchmpi 12 hoặc trong biến môi trường và sử dụng giá trị của nó thay vì "4" trong mã ở trên.

Lưu ý rằng không thể phát hành MPI chung mà không có mpirun. Sau này là một phần không thể tách rời của thời gian chạy của MPI và nó còn làm được nhiều việc hơn khi khởi chạy nhiều bản sao của MPI thực thi. Ngoài ra, bạn luôn liên kết rõ ràng với thư viện MPI khi biên dịch với bất kỳ trình bao bọc trình biên dịch MPI nào (hãy thử mpicc -showme). Mặc dù bạn có thể liên kết các thư viện MPI tĩnh (không được khuyến nghị, xem here), bạn vẫn sẽ cần mpirun để có thể chạy các công việc MPI - AFAIK không có cách nào để nhúng chức năng mpirun vào chương trình của bạn, ít nhất không phải trong Open MPI.

+0

Cảm ơn phản hồi của bạn - điều đó thực sự hữu ích! – Jay

1

Bạn có thể làm điều này với một kịch bản bash:

 
# If you change this script has executable (chmod +x script_name) 
# and if you have the current path in the PATH variable (add export PATH=.:$PATH in your .bashrc) 
#Then, you can run this has: script_name program_args 

mpirun -np 4 your_executable_name "[email protected]" 
+1

Bạn gần như chắc chắn muốn '" $ @ "', không phải '$ *', nếu không bạn sẽ mangle args trên wordsplitting. –

+0

Cảm ơn @ChrisDown Tôi đã sửa câu trả lời của mình. – RSFalcon7

+1

Đối số của bạn sẽ vẫn bị xáo trộn. Các dấu ngoặc kép rất quan trọng. –

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