2012-06-24 2 views
8

나는 gccOpenMPI을 사용하고 있습니다. 보통 나는 mpirun 래퍼를 사용하여 MPI 프로그램을 실행 - 예를 들어,mpirun없이 OpenMPI 프로그램 실행

mpirun -np 4 myprogram 

4 개 프로세스를 시작합니다.

그러나 자동으로 (아마도 위의 -np 4과 같은 하드 코딩 된 옵션을 사용하여) 바이너리를 쉽게 생성 할 수 있는지 궁금합니다.

는 나는 다음과 같은, 내 프로그램을 호출하는 C 래퍼 쓸 수 있습니다 알고

#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; 
} 

을하지만이 조금 서투른 것 같다 나는 두 개의 실행 파일 대신 하나와 끝까지.

는 I 명시 적으로

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

하지만 실행 결과 실행할 때 (내가 인수로 -np 0을 부여했을 경우와 같이)가, MPI_Comm_size 세트는 그룹 크기가 제로처럼 MPI 라이브러리를 연결하기 위해 노력했다. 그룹 크기를 전달하기 위해 환경 변수 또는 다른 것을 사용할 수 있습니까? 또는 단일 실행 가능 MPI 프로그램 (Linux 및 gcc 사용)을 빌드하는 또 다른 방법이 있습니까?

+0

나는 어떻게 할 수 있을지 모르지만, 내 머리 꼭대기에서. 나는이 작업을 수행 한 몇 가지 프로그램을 알고 있습니다. 거기에는 진정한 마술이 없습니다. 당신이 할 수있는 장면들 뒤에는 많은 것들이 있습니다. –

+0

정확하게 이해합니까?'mpirun'을 건너 뛰고 싶거나 어떻게 자동으로'mpirun'을 호출하고 싶습니까? –

+0

@Hristo Iliev : 하나의 정적 바이너리가 있다면 좋을 것입니다. – Jay

답변

6

, 당신은 자기 시작 MPI 실행을합니다. 내 의견에 적어 두었던 것처럼 코드가 mpirun (제공되는 경우)으로 실행되도록하는 특수 옵션을 사용할 수 있습니다. -launchmpi. Open MPI를 사용하면 시작된 MPI 프로세스에 특별한 환경 변수를 내 보내기 때문에 더욱 쉽습니다. OMPI_COMM_WORLD_RANK. 이 변수가 환경에 존재하면 프로그램이 mpirun에서 시작되었으며 직접 실행되지 않았 음을 알 수 있습니다.

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; 
} 

당신은 MPI 작업의 프로세스 수를 제어하려는 경우, 당신은 추가 arugment로 제공 할 수 있습니다, 예를 들면 : 당신이 하나의 체크에 두 가지 방법을 결합 할 수 있습니다 -launchmpi 12 또는 환경 변수에 위의 코드에서 "4" 대신 해당 값을 사용하십시오.

mpirun 없이는 MPI 실행 파일을 실행할 수 없습니다. 후자는 MPI 실행 시간에 없어서는 안될 부분이며 MPI 실행 파일을 여러 개 실행하는 것보다 훨씬 더 많은 작업을 수행합니다. 또한 MPI 컴파일러 래퍼 (mpicc -showme)로 컴파일 할 때 MPI 라이브러리에 항상 명시 적으로 링크됩니다. MPI 라이브러리를 정적으로 링크 할 수 있지만 (here 참조), MPI 작업을 실행하려면 여전히 mpirun이 필요합니다. AFAIK는 최소한 Open MPI가 아닌 mpirun 기능을 프로그램에 임베드 할 수있는 방법이 없습니다.

+0

답변 해 주셔서 감사합니다. 정말 유용합니다! – Jay

1

당신은 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

거의 확실하게''$ * ''이 아닌''$ @ ''을 원합니다. 그렇지 않으면 단어 분리에 args를 사용하게됩니다. –

+0

Thanks @ChrisDown 답변을 수정했습니다. – RSFalcon7

+1

인수가 여전히 엉망입니다. 따옴표는 중요합니다. –