주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

멀티 프로세스 및 멀티 스레드 가속 지원

이 페이지는 qiskit-addon-sqd가 멀티 스레드 및 멀티 프로세스 가속을 어느 범위까지 지원하는지, 그리고 고성능 컴퓨팅(HPC) 개발자가 이 패키지를 가속 워크로드에 통합할 때 전제로 삼을 수 있는 가정을 설명합니다.

단일 스레드 가정​

별도로 명시하지 않는 한, 이 패키지의 API는 단일 스레드에서 호출하도록 만들어졌습니다. 이 패키지가 제공하는 고수준 API는 재진입 가능(re-entrant)함이 보장되지 않으며, 최종 사용자는 메인 스레드가 아닌 다른 스레드에서 호출해서는 안 됩니다.

집합 멀티 프로세스 실행​

이 패키지는 단일 프로그램 다중 데이터(SPMD) 방식의 집합 멀티 프로세스 가속을 지원합니다. 이 방식에서는 전체 프로그램이 서로 격리된 여러 프로세스로 실행되며, 프로세스 간에 명시적인 전역 동기화와 통신이 이루어집니다(예: mpirun -n 128 python my_program.py). SPMD 방식은 작업 스케줄러 및 다른 병렬 소프트웨어와 깔끔하게 조합되고 많은 프로세스 수까지 확장되므로, 고성능 및 대규모 워크로드에 권장되는 모델이며 이 페이지의 주제입니다.

이 패키지는 서로 다른 집합 실행 백엔드를 수용하도록 설계되었지만, 현재 구현은 HPC 시스템의 표준 메시지 전달 API인 MPI를 대상으로 합니다. 구현과 관계없이 이 패키지는 각 프로세스를 단일 스레드가 제어한다고 가정합니다. MPI의 경우 이는 MPI_THREAD_FUNNELED 이하에 해당합니다.

함수가 집합 실행을 지원한다면 문서에 그렇게 명시되어 있어야 합니다. 문서에 집합 실행에 대한 언급이 없다면 그 함수에는 집합 의미론이 없으며 제어 프로세스에서만 호출해야 합니다.

집합 함수의 구체적인 반환 값 및 동기화 의미론은 해당 함수의 문서에 기술되어 있습니다. 일반적으로 그 문서에는 다음이 명확히 드러나야 합니다:

  • 함수를 각 프로세스가 자신의 로컬 데이터에 대해 독립적으로 호출하는지, 아니면 모든 프로세스가 집합적으로 호출하는지.

  • 인수가 프로세스 간에 어떻게 일치해야 하는지.

  • 반환 값이 어떻게 전달되는지. 결과가 제어 프로세스에만 존재하는지, 모든 프로세스가 같은 값을 받는지, 아니면 각 프로세스가 분산 데이터 구조의 로컬 부분에 대한 핸들을 받는지.

현재 모든 프로세스에서 집합적으로 호출할 수 있는 함수는 diagonalize_fermionic_hamiltonian() 하나뿐입니다. 이 함수를 집합적으로 호출하면 고유값 풀이 단계에서 모든 프로세스가 참여하여 작업을 분담하므로, 고유값 풀이 구현이 모든 프로세스를 사용할 수 있습니다. 구성 복구 루프의 나머지 부분에는 분산 구현이 없으며 제어 프로세스(rank 0)에서만 실행됩니다.

반복의 모든 부분 공간은 한 번의 호출로 고유값 풀이기에 전달되므로, 구현은 프로세스를 그룹으로 나누어 여러 부분 공간을 병렬로 대각화할 수 있습니다. 솔버가 사용 가능한 프로세스를 어떻게 활용하는지는 해당 고유값 풀이기의 특성입니다.

일부 기존 고유값 풀이 구현은 자체 병렬 프로세스를 내부에서 직접 시작하고 관리하기 때문에(예: 사용자를 대신해 mpirun을 호출), 호출하는 프로그램이 MPI/SPMD 환경 밖에서 실행되어야 합니다. 이 모드는 대화형 및 노트북 기반 작업에 편리하며 계속 지원됩니다. 호출 프로그램에 대한 요구 사항은 diagonalize_fermionic_hamiltonian() 함수의 API 레퍼런스에 설명되어 있습니다.

멀티 프로세스 환경에서의 오류 처리​

모든 프로세스에서 집합적으로 호출되는 함수는 단일 프로세스에서만 예외를 발생시키거나 중단해서는 안 됩니다. 그렇게 하면 나머지 프로세스가 교착 상태에 빠지거나 일관성 없는 상태가 되기 때문입니다. 대신 오류 처리는 실행 컨텍스트 전체에 대한 fail-stop 의미론을 따릅니다. 오류가 발생하면 구현은 전체 실행 컨텍스트를 집합적으로 중단할 수 있도록 준비되어 있어야 합니다(예: MPI_Abort 사용).

MPI 구현은 이러한 보장을 제공하지 않으므로, API는 프로세스 간 조율된 오류 보고나 예외의 집합적 전달을 보장할 수 없습니다. 구현이 추가로 모든 참여 프로세스에 오류가 보이도록 시도할 수도 있지만(예: 각 프로세스가 예외를 발생시키도록 하는 방식), 이는 최선의 노력 수준으로만 제공될 수 있으며 정확성이나 복구를 위해 의존해서는 안 됩니다.

이것들은 집합 구현이 가질 수 있는 속성이지 특정 구현에 대한 보장이 아닙니다. 이 패키지에서 유일한 집합 단계는 고유값 풀이기입니다(앞선 절 참고). 기본 구현은 분산되어 있지 않으므로, 이러한 고려 사항은 사용자가 제공하는 사용자 정의 집합 고유값 풀이기에 적용됩니다.