SIESTA 실행 방법 및 최적화 방안

SIESTA는 기본적으로 CPU를 기반으로 실행되는 프로그램이며, 단일 프로세스로 연산이 진행되어 큰 규모를 실행하는데 있어서는 병렬 실행이 필수적이다. 우선 SIESTA의 단일 프로세스 실행 방법을 본 후 병렬 프로세싱하는 법에 대해 알아보자.

단일 프로세싱

SIESTA에서 제공하는 기본 명령줄은 아래와 같다.

siesta ch4.fdf > ch4.out

관례적으로 fdf파일과 out파일의 이름은 동일하다고 한다.
여기서 fdf파일의 역할은 시뮬레이션하고자 하는 구조를 담고 있는 파일이며, 각 원소에 대한 정보는 .psf로 저장한다. (ex - H.psf)
또 실행 후 STDOUT으로 출력되는 값은 ch4.out에 저장이되며, 실행한 후 시뮬레이션과 관련된 정보 값들과 관련하여 많은 파일이 생성되므로 따로 찾아보는걸 추천한다.

병렬 프로세싱

병렬 프로세싱을 하려는 경우 MPI 계열의 프로그램을 사용하게 된다. MPI는 Message Passing Interface로, 프로세스간 메세지 패싱을 통해 같이 작업할 수 있는 환경을 조성하게 해준다.
SIESTA에서 사용하는 경우 기본적으로는 OpenMPI를 사용하며 빌드 시 넣어준 mpi 옵션에 따라 이 기반 프로그램이 달라지게 된다. OpenMPI에서는 기본적으로 아래의 명령 인자를 지원해준다.

mpirun <option> "program execution"

SIESTA의 경우 아래와 같은 식으로 많이 사용하게 된다.

mpirun -np 2 siesta example.fdf > example.out

이렇게 실행하는 경우 siesta 프로그램을 실행함에 있어 2개의 프로세스로 나누어 실행하라는 의미이며, 주로 행렬 연산 부분을 분할하여 실행하게 된다. 이후 stdout 결과는 example.out에 출력되며, 다른 시뮬레이션 결과는 여러 파일에 나뉘어 저장된다.

문제점

SIESTA로 이것저것 실행을 해보다보니 경우에 따라 실행시간이 들쭉날쭉한것을 확인할 수 있었다.
특히 하이퍼스레딩 환경에서 심한것을 확인할 수 있었는데 mpirun의 기본 하드웨어 배치 정책때문이었다.
이를위해 --map-by 옵션과 --bind-to에 대해 알아볼 필요가 있다.

배치 방법

  • --map-by 옵션은 각 프로세스 배치 단위를 결정한다. 예를 들어 --map-by core는 CPU 코어 단위로 프로세스를 분배한다.
  • --bind-to 옵션은 각 프로세스를 분배하는 것이 아닌 특정 하드웨어 자원에 고정하는 역할을 수행한다. 예를 들어 --bind-to core는 CPU 코어마다 프로세스를 고정하여 실행할 수 있도록 한다.
  • 두 옵션을 같이 사용하는 경우 process element 옵션을 조정할 수 있다. 예를 들어 --map-by socket:PE=16 --bind-to core 조합으로 옵션을 준다면 프로세스마다 소켓 단위로 배치하지만 16개의 코어씩 자원을 바인딩하게 된다

이런 조합식으로 하드웨어 배치를 사용자가 임의로 지정을 해줄 수 있다.
우리가 사용가능한 하드웨어 배치 단위는 아래와 같은 것들이 있다.

  • socket (default)
  • core
  • hwthread
  • numa

해결 방안

하드웨어 자원을 최대한 활용하도록 배치하는 것이 좋으며 이를 위해서 하이퍼스레딩은 잠시 꺼두는 편이 좋다. CPU만 이용하는 경우 한코어 당 한 프로세스를 배치하는 것이 꽤 적합하므로 아래 명령줄 처럼 실행하는 것을 추천한다.

mpirun -np <num of core> --map-by core --bind-to core siesta ... 

'Research > SIESTA' 카테고리의 다른 글

SIESTA 빌드 방법  (0) 2025.08.14

댓글