2012-03-29 7 views
1

빠른 질문이 있습니다.bash에서 이상한 동작을 보이는 mpirun 명령

나는 최근에 내 학교의 서버를 사용하여 MPI 프로그램을 실행하려고하고 있었고, 난이 다음과 같은 '이상한'문제로 실행 : 내 기본적으로 해당 경로를 배치했다 '에 mpirun'명령을 실행하기 위해

그때했고, .bashrc에의 경로 입력 : I 전체에 mpirun을 사용하여 프로그램을 실행하려고하는 경우에는 libmpi.so.0

:

mpirun -n 16 ./myprogram 

라는 누락 된 라이브러리에 대한 오류를 얻을 수 경로는 아래와 같습니다.

/usr/lib64/openmpi/bin/mpirun -n 16 ./myprogram 

모두 좋았습니다.

내가하는 openmpi의 FAQ를 확인하고 내가 내의 .bashrc에 다음 줄을 넣어 필요가 있다고 말했다

실제로 나를 위해 일을 고정하지만 내 문제는 여전히 해결되지
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openmpi/lib 

: 것을

된 이유 사고?

미리 감사드립니다.

답변

1

오픈 MPI의 래퍼 컴파일러가 myprogram을 컴파일/링크 할 때 libmpi.so가있는 위치를 자동으로 지정하지 않기 때문에 (우리는 OMPI 래퍼 컴파일러에서 전달되는 플래그에서 최소한의 접근법을 취합니다. 이 필요하지 않습니다., 우리는 거기에 넣지 않습니다.)

특히 Linux에서 실행 파일을 실행하면 런타임 링커는 해당 실행 파일에 필요한 모든 라이브러리를 찾습니다 ("ldd myprogram"을 실행하면 다음과 같은 라이브러리 목록이 표시됨). myprogram에 필요). 모든 시스템 기본 위치 (시스템 관리자가 구성 할 수 있음)를 살펴볼 것입니다. 또한 LD_LIBRARY_PATH에 지정된 모든 디렉토리를 검색합니다. LD_LIBRARY_PATH는 링커가 공유 라이브러리를 찾기 위해 디렉토리 목록을 확장하는 사용자 별 방법입니다.

libmpi.so가 시스템 기본 위치에 없으므로 LD_LIBRARY_PATH에 해당 디렉토리를 지정해야합니다.

또는 myprogram을 연결할 때 -rpath 절을 추가 할 수 있습니다. 예를 들면 :

mpicc myprogram.c -o myprogram -Wl,-rpath /opt/openmpi/lib 

이것은 myprogram 바이너리 자체에 위치/옵션 /하는 openmpi/lib 디렉토리를 포함 할 것이며, 링커는 libmpi.so에 대한 해당 위치에 볼 것이다 (및 기타 필요한 라이브러리가 해결 될). 예 :

# Without an rpath clause: 
[8:45] svbu-mpi:~/mpi % mpicc hello.c -o hello 
[8:45] svbu-mpi:~/mpi % ldd hello 
linux-vdso.so.1 => (0x00007ffff7ffe000) 
libmpi.so.0 => not found 
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000) 
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff7ddf000) 
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff7bd2000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000) 
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000) 
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000) 
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000) 

libmpi.so 항목에 "not found"가 표시됩니다.

[8:45] svbu-mpi:~/mpi % setenv LD_LIBRARY_PATH /home/jsquyres/bogus/lib 
[8:45] svbu-mpi:~/mpi % ldd hello 
linux-vdso.so.1 => (0x00007ffff7ffe000) 
libmpi.so.0 => /home/jsquyres/bogus/lib/libmpi.so.0 (0x00007ffff7b06000) 
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000) 
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff78e8000) 
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff76db000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000) 
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000) 
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000) 
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000) 

또는 당신은 -rpath 절을 사용할 수 있습니다 (다음 LD_LIBRARY_PATH의 설정은 무관하게) :

당신은 LD_LIBRARY_PATH를 설정하고이 그것을 찾을 수있는 So..if

[8:45] svbu-mpi:~/mpi % mpicc hello.c -o hello -Wl,-rpath /home/jsquyres/bogus/lib 
[8:45] svbu-mpi:~/mpi % ldd hello 
linux-vdso.so.1 => (0x00007ffff7ffe000) 
libmpi.so.0 => /home/jsquyres/bogus/lib/libmpi.so.0 (0x00007ffff7b06000) 
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000) 
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff78e8000) 
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff76db000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000) 
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000) 
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000) 
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000) 
+0

문제는 라이브러리 경로와 관련이 있습니다. mpirun을 실행하면 전체 경로가 정확히 변경됩니까? 다시 말해,이 경우 도서관은 어떻게 될까요? – kstratis

+1

(새로운 의견이 추가되면 어떻게 든 나에게 메일이 보내지지 않고, 미안합니다.) mpirun에 대한 전체 경로를 제공하면 원격 노드에 LD_LIBRARY_PATH가 자동으로 설정되어 귀하의 .bashrc에 의존하지 않습니다 LD_LIBRARY_PATH를 설정하십시오. 자세한 정보는 mpirun.1의 매뉴얼 페이지를 참조하십시오. –

+1

훨씬 더 의미가 있습니다. 그러나 : LD_LIBRARY_PATH가 전체 경로를 제공 할 때 자동으로 설정되는 이유는 수동으로 지정해야하는 이유입니까? 그것이 mpirun 명령과 관련이 있습니까, 아니면 bash 관련입니까? 다시 한번 감사드립니다. – kstratis

관련 문제