GFORTRAN_CONVERT_UNIT — 비정형(언포맷) I/O 변환 설정

GFORTRAN_CONVERT_UNIT — 비정형(언포맷) I/O 변환 설정

비정형(unformatted) 파일의 데이터 표현 방식을 바꿔야 할 때가 있어요. 다른 머신에서 만든 바이너리 파일을 읽다 보면 endian이 달라서 값이 뒤집혀 나오는 일이 잦죠. GFORTRAN_CONVERT_UNIT 환경 변수로 비정형 파일의 데이터 표현을 바꿀 수 있어요.

출처: gfortran 공식 문서 - GFORTRAN_CONVERT_UNIT

본문

대부분 시스템에서 GFORTRAN_CONVERT_UNIT 변수의 문법은 다음과 같아요.

GFORTRAN_CONVERT_UNIT: mode | mode ';' exception | exception ;
mode: 'native' | 'swap' | 'big_endian' | 'little_endian' ;
exception: mode ':' unit_list | unit_list ;
unit_list: unit_spec | unit_list unit_spec ;
unit_spec: INTEGER | INTEGER '-' INTEGER ;

변수는 선택적인 기본 모드(default mode)와, 그 뒤에 세미콜론으로 구분된 선택적인 예외 목록으로 이뤄져요. 각 예외는 형식(format)과 쉼표로 구분된 유닛 목록으로 구성돼요. 모드에서 쓸 수 있는 값은 CONVERT 지정자와 같아요.

  • NATIVE — 네이티브 형식을 사용해요. 기본값이에요.
  • SWAP — little-endian과 big-endian 사이를 맞바꿔요.
  • LITTLE_ENDIAN — 비정형 파일에 little-endian 형식을 사용해요.
  • BIG_ENDIAN — 비정형 파일에 big-endian 형식을 사용해요.

-mabi=ieeelongdouble을 지원하는 POWER 시스템에서는 쉼표로 다른 옵션과 결합할 수 있는 추가 옵션이 있어요.

  • R16_IEEEREAL(KIND=16)에 IEEE 128-bit 형식을 사용해요.
  • R16_IBMREAL(KIND=16)에 IBM long double 형식을 사용해요.

예외에서 모드가 빠져 있으면 BIG_ENDIAN을 뜻해요. GFORTRAN_CONVERT_UNIT 값의 예시는 이래요.

  • 'big_endian' — 모든 비정형 I/O를 big_endian 모드로 수행해요.
  • 'little_endian;native:10-20,25' — 유닛 10~20과 25는 native 형식으로, 나머지는 모두 little_endian 모드로 수행해요.
  • '10-20' — 유닛 10~20은 big-endian, 나머지는 native예요.
  • 'big_endian,r16_ibm' — 모든 비정형 I/O를 big-endian으로 하되 REAL(KIND=16) 값 출력엔 IBM long double을 사용해요.

환경 변수 설정은 명령줄에서 하거나, sh 호환 셸에서는 export 명령, csh 호환 셸에서는 setenv로 해요.

sh 예제:

$ gfortran foo.f90
$ GFORTRAN_CONVERT_UNIT='big_endian;native:10-20' ./a.out

csh 예제:

% gfortran foo.f90
% setenv GFORTRAN_CONVERT_UNIT 'big_endian;native:10-20'
% ./a.out

비정형 데이터에 native가 아닌 표현을 쓰면 상당한 속도 오버헤드가 생겨요. 이 부분 속도가 중요하다면, 이식성이 필요한 데이터에만 쓰는 게 좋아요.

비정형 파일 데이터 표현을 지정하는 다른 방법으로는 CONVERT 지정자가 있어요. 프로그램 전체에 기본 데이터 표현을 설정하려면 "Influencing runtime behavior"를 참고해요. CONVERT 지정자는 -fconvert 컴파일 옵션을 덮어써요.

주의할 점은 GFORTRAN_CONVERT_UNIT 환경 변수로 지정한 값이 OPEN 문의 CONVERT 지정자까지 덮어쓴다는 거예요. 프로그램의 소스 코드를 갖고 있지 않은 사용자도 데이터 형식을 제어할 수 있게 하려는 의도예요.