공유 메모리 코어레이
공유 메모리 코어레이 (Shared-memory Coarrays)
코어레이(coarray) 프로그램을 공유 메모리 다중 프로세스 방식으로 실행할 수 있게 해 주는 gfortran의 런타임 라이브러리 caf_shmem을 소개해요. 이 라이브러리를 링크하는 방법과, 실행 시 이미지 수·공유 메모리 크기 같은 동작을 제어하는 환경 변수들을 다뤄요.
본문
gfortran은 코어레이가 활성화된 프로그램을 공유 메모리 다중 프로세스 방식으로 실행하기 위한 런타임 라이브러리를 제공해요. 이 라이브러리는 libgfortran 라이브러리와 함께 제공되는 정적 링크 라이브러리이며, gfortran을 -fcoarray=lib로 호출할 때 활성화되는 ABI와 완전히 호환돼요. gfortran이 만든 실행 파일에 공유 메모리 코어레이를 연결하려면 -lcaf_shmem을 사용해요.
caf_shmem 라이브러리는 각 프로세스의 메모리 공간에서 여러 프로세스가 같은 가상 메모리 주소의 같은 메모리를 사용할 수 있는 아키텍처에서만 쓸 수 있어요. 대부분의 Unix 및 Windows 기반 시스템이 이 경우에 해당해요.
실행 시 환경 변수로 라이브러리 동작의 일부를 제어할 수 있어요.
GFORTRAN_NUM_IMAGES: 실행 파일을 실행할 때 생성할 이미지(image) 수예요. 주의할 점은, 계산에는 참여하지 않고 이미지 시작과 (비정상적인) 종료를 잡는 데만 책임지는 슈퍼바이저 프로세스가 항상 하나 더 있다는 거예요. 이 환경 변수가 설정되지 않으면 OS가 보고하는 하드웨어 스레드 수를 사용해요. 과잉 할당(over-provisioning)도 가능해요. 이미지 수는 OS와 프로그램이 실행되는 아키텍처의 정수 변수 크기에 의해서만 제한돼요.
GFORTRAN_SHARED_MEMORY_SIZE: 모든 이미지가 사용할 수 있게 되는 공유 메모리 세그먼트의 크기예요. 이것은 고정되어 있고 프로그램 시작 시 설정되어야 하며, 커지거나 작아질 수 없어요. 크기는 바이트(접미사 없음), 킬로바이트(k 또는 K 접미사), 메가바이트(m 또는 M), 기가바이트(g 또는 G)로 지정할 수 있어요. 변수가 설정되지 않았거나 파싱할 수 없으면 32비트 아키텍처에서는 2^28 바이트, 64비트에서는 2^34 바이트가 선택돼요. 참고로 크기가 설정되어 있어도 대부분의 현대 시스템은 프로그램 시작 시 메모리를 할당하지 않아요. 이 덕분에 사용 가능한 메모리보다 큰 공유 메모리 크기를 선택할 수 있어요.
경고: 큰 공유 메모리 크기를 선택하면 큰 코어 덤프(core dump)가 생길 수 있어요!
GFORTRAN_IMAGE_RESTARTS_LIMIT: 특히 MacOS 같은 일부 플랫폼에서는, 공유 메모리 세그먼트가 모든 이미지에서 같은 (가상) 주소에 배치되어야 동기화 프리미티브가 예상대로 동작해요. 아쉽게도 일부 운영체제는 언제 이것을 할 수 있는지가 다소 임의적이에요. OS가 요청을 충족하지 못하면 이미지는 스스로 중단(abort)하고 슈퍼바이저가 OS가 따를 때까지 다시 시작해요. 이 환경 변수는 공유 메모리 세그먼트 배치에 문제가 있는 모든 이미지의 총 재시작 횟수를 제한해요. 기본값은 4000이에요.
공유 메모리 코어레이 라이브러리는 내부적으로 추가 환경 변수들을 사용하는데, 이것들은 통지 없이 덮어써지거나 시작 실패를 일으킬 수 있어요. 그 변수들은 GFORTRAN_IMAGE_NUM, GFORTRAN_SHMEM_PID, GFORTRAN_SHMEM_BASE예요. 이 변수들을 사용하는 것은 강력히 권장하지 않아요. 또한 하나의 코어레이 프로그램이 자식 프로세스로 다른 코어레이 프로그램을 시작할 때는 특히 주의해야 해요. 이 경우 위 변수들을 환경에서 제거하는 것은 시작(부모) 프로세스의 책임이에요.
더 알아보기
- Environment variables affecting
gfortran— gfortran 환경 변수 전체 - -fcoarray — 코어레이 모드 선택 옵션
- Coarray Programming — 코어레이 프로그래밍 소개