MPI 프로그램을 어떻게 디버깅합니까? 일이 일어나지 않도록 단계별로 진행하고 싶습니다.

컴파일하고 실행하는 MPI 프로그램이 있지만 기괴한 일이 일어나지 않도록 단계별로 진행하고 싶습니다. 이상적으로는 특정 프로세스에 GDB를 연결하는 간단한 방법을 원하지만 그것이 가능한지 또는 어떻게하는지 확실하지 않습니다. 대안은 각 프로세스가 디버그 출력을 별도의 로그 파일에 쓰도록하는 것이지만 이것은 실제로 디버거와 같은 자유를주지는 않습니다.

더 나은 접근법이 있습니까? MPI 프로그램을 어떻게 디버깅합니까?



답변

다른 사람이 말했듯이 TotalView 가 이에 대한 표준입니다. 그러나 팔과 다리가 필요합니다.

OpenMPI 사이트에는 MPI 디버깅에 대한 훌륭한 FAQ가 있습니다. FAQ의 6 번 항목은 GDB를 MPI 프로세스에 연결하는 방법을 설명합니다. 모든 것을 읽으십시오. 좋은 팁이 있습니다.

추적 할 프로세스가 너무 많으면 스택 추적 분석 도구 (STAT)를 확인하십시오 . Livermore에서는이를 사용하여 잠재적으로 수십만 개의 실행중인 프로세스에서 스택 추적을 수집하고이를 사용자에게 지능적으로 표현합니다. 완전한 기능을 갖춘 디버거는 아니지만 (모든 기능을 갖춘 디버거는 208k 코어로 확장되지 않음) 어떤 프로세스 그룹이 동일한 작업을 수행하는지 알려줍니다. 그런 다음 표준 디버거에서 각 그룹의 담당자를 단계별로 안내 할 수 있습니다.


답변

gdb가 매우 유용하다는 것을 알았습니다. 나는 그것을

mpirun -np <NP> xterm -e gdb ./program

이것은 내가 할 수있는 xterm 창을 시작합니다.

run <arg1> <arg2> ... <argN>

보통 잘 작동합니다

다음을 사용하여 이러한 명령을 함께 패키지 할 수도 있습니다.

mpirun -n <NP> xterm -hold -e gdb -ex run --args ./program [arg1] [arg2] [...]


답변

여기의 많은 게시물은 GDB에 관한 것이지만 시작에서 프로세스에 연결하는 방법은 언급하지 않았습니다. 분명히 모든 프로세스에 연결할 수 있습니다.

mpiexec -n X gdb ./a.out

그러나 모든 프로세스를 시작하려면 바운스해야하기 때문에 이는 비효율적입니다. 하나 (또는 ​​소수의) MPI 프로세스 만 디버그하려는 경우 :연산자를 사용하여 명령 행에서 별도의 실행 파일로 추가 할 수 있습니다 .

mpiexec -n 1 gdb ./a.out : -n X-1 ./a.out

이제 프로세스 중 하나만 GDB를 얻습니다.


답변

다른 사람들이 언급했듯이, 소수 의 MPI 프로세스 로만 작업 하는 경우 여러 gdb 세션 , 중복 가능 valgrind 또는 자체 printf / logging 솔루션 을 사용하려고 시도 할 수 있습니다 .

그보다 많은 프로세스를 사용하고 있다면 실제로 적절한 디버거가 필요합니다. 는 OpenMPI 자주 묻는 질문은 모두 권장 Allinea DDTTotalView을 .

나는 Allinea DDT에서 일한다 . 완전한 기능을 갖춘 그래픽 소스 코드 디버거이므로 다음과 같이 할 수 있습니다.

  • MPI 프로세스 (200k 이상) 디버그 또는 첨부
  • 그룹으로 또는 개별적으로 단계 및 일시 중지
  • 중단 점, 시계 및 추적 점 추가
  • 캐치 메모리 오류 및 누수

…등등. Eclipse 또는 Visual Studio를 사용했다면 집에있을 것입니다.

병렬 코드 디버깅을 위해 특별히 흥미로운 기능을 추가 했습니다 (MPI, 멀티 스레드 또는 CUDA 등).

  • 스칼라 변수는 모든 프로세스에서 자동으로 비교됩니다 :
    (source : allinea.com )프로세스 전체의 값을 보여주는 스파크 라인

  • 프로세스 및 시간에 따른 변수 및 표현식의 값을 추적하고 필터링 할 수도 있습니다.
    시간 경과에 따른 추적 점 로그 값

ORNL , NCSA , LLNL , Jülich 등과 같은 상위 500 HPC 사이트 에서 널리 사용됩니다 . 알.

인터페이스는 매우 빠릅니다. 우리는 Oak Ridge의 Jaguar 클러스터에 대한 승인 테스트의 일환으로 0.1 초에 220,000 개의 프로세스 스택과 변수를 스테핑하고 병합하는 시간을 정했습니다.

@tgamblin 은 몇 가지 다른 인기있는 오픈 소스 프로젝트 와 마찬가지로 Allinea DDT 와 통합 된 우수한 STAT를 언급 했습니다.


답변


답변

당신이 tmux사용자라면 Benedikt Morbach 의 스크립트를 사용하는 것이 매우 편할 것입니다 .tmpi

원본 출처 : https://github.com/moben/scripts/blob/master/tmpi

포크 : https://github.com/Azrael3000/tmpi

그것으로 여러 개의 패널 (프로세스 수)이 모두 동기화됩니다 (모든 명령은 모든 패널 또는 프로세스에서 동시에 복사되므로 xterm -e접근 방식 과 비교하여 많은 시간을 절약 할 수 있습니다 ). 또한 원하는 프로세스에서 변수 값을 알 수 있습니다.print 다른 패널로 이동하지 않고 그러면 각 프로세스의 변수 값이 각 패널에 인쇄됩니다.

당신이 tmux사용자 가 아닌 경우 나는 그것을 시도하고 참조하는 것이 좋습니다.


답변

http://github.com/jimktrains/pgdb/tree/master 는이 작업을 수행하기 위해 작성한 유틸리티입니다. 몇 가지 문서가 있으며 궁금한 점이 있으시면 언제든지 저를 찾으십시오.

기본적으로 GDB를 감싸고 IO를 중앙 서버로 퍼널 링하는 perl 프로그램을 호출합니다. 이를 통해 각 호스트에서 GDB를 실행할 수 있으며 터미널의 각 호스트에서 GDB에 액세스 할 수 있습니다.