![mpirun -np x task를 통해 작업이 x배 증가할 때 PBS 출력 "mem"과 "vmem"이 동일하게 유지된다는 것을 이해하는 방법](https://linux55.com/image/150501/mpirun%20-np%20x%20task%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%9E%91%EC%97%85%EC%9D%B4%20x%EB%B0%B0%20%EC%A6%9D%EA%B0%80%ED%95%A0%20%EB%95%8C%20PBS%20%EC%B6%9C%EB%A0%A5%20%22mem%22%EA%B3%BC%20%22vmem%22%EC%9D%B4%20%EB%8F%99%EC%9D%BC%ED%95%98%EA%B2%8C%20%EC%9C%A0%EC%A7%80%EB%90%9C%EB%8B%A4%EB%8A%94%20%EA%B2%83%EC%9D%84%20%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
제가 시도한 간단한 실험은 다음과 같습니다.
모델 시뮬레이션을 수행하는 "sim.exe"라는 작업이 주어지면 MPI를 사용하여 한 노드(공유 메모리 시스템)에서 x "sim.exe"를 동시에 실행합니다. 나는 서로 다른 x 값(예: 1, 4, 8, 16)을 사용하여 네 가지 다른 실행을 시도했습니다. 그런 다음 PBS 보고서 "Memory Used" 및 "Vmem Used"를 통해 메모리 사용량을 확인했습니다. 나는 "Memory Used"와 "Vmem Used"가 서로 다른 실행에서 동일하게 유지되는 것을 관찰했습니다. "mem" = 8,432KB 및 "vmem" = 489,716KB입니다.
게시물에 따르면 "mem"과 "vmem"에 대한 나의 이해는 작업에 사용되는 메모리 리소스입니다.mem 및 vmem 정보그리고실제 메모리 사용량 처리. 그러면 작업의 작업이 x배 증가하더라도 "mem"과 "vmem"이 동일하게 유지되는 이유는 무엇입니까?
이러한 모든 작업은 PBS 작업 스케줄러를 통해 제출됩니다. 각 작업에 대해 작업이 제출될 때 모든 코어와 RAM이 요청됩니다.#PBS -l select=1:ncpus=24:mem=96GB
이 질문에 대한 업데이트:
나는 x "sim.exe"를 동시에 시작하는 대신 threading
Python에서 이것을 테스트했습니다 . mpi
그래서 x 스레드를 시작하고 각 스레드에서 하위 프로세스를 사용하여 "sim.exe" 모델 시뮬레이션을 호출했습니다. x=1,4,8,16을 사용하여 네 가지 실험을 다시 시도했습니다. x가 증가함에 따라 작업에서 사용되는 "mem"과 "vmem"이 선형적으로 증가하는 것을 관찰했는데, 이는 제가 예상한 것과 가깝습니다.
그렇다면 PBS가 "mem"과 "vmen"을 올바르게 계산하지 않을 가능성이 있습니까? PBS는 한 인스턴스의 메모리 사용량만 계산하는 것 같습니다.
답변1
확실하지는 않지만 제가 기억하는 한 MPI는 노드당 하나의 인스턴스만 시작한 다음 일부 초기화 후에 프로세스를 요청된 x
복제본으로 포크합니다. 즉 sim.exe
, 포크 이후 추가 메모리를 할당하지 않으면 모든 메모리가 복제본 간에 공유되며, x
그 양은 프로세스를 추적하기 위한 운영 체제의 작은 오버헤드 외에는 메모리 사용량에 영향을 미치지 않습니다.x
분기 후 일부 데이터를 로드하거나 일부 메모리를 할당하면 메모리 사용량과 x
.
스레드 하위 프로세스 시나리오에서는 모든 x
프로세스가 자체 초기화를 수행하므로 MPI 시나리오만큼 많은 메모리가 공유되지 않습니다. (그들은 여전히 라이브러리 메모리와 유사한 메모리 매핑 I/O를 공유합니다.)
이 동작을 완전히 이해하려면 이를 대체할 작은 MPI 프로그램을 작성하고 sim.exe
몇 MB의 정적 데이터(예: 일부 유형의 정적 배열)와 동적으로 할당된 메모리를 사용하여 인스턴스 크기와 수량을 실험해 볼 것을 제안합니다. . 내 생각엔 정적 데이터는 동일한 노드의 병렬 MPI 인스턴스 간에 공유되는 반면 동적 데이터(MPI가 인스턴스를 포크한 후에 할당됨)는 공유되지 않는 것 같습니다.