CONVERT 지정자
CONVERT 지정자 (CONVERT specifier)
unformatted 데이터를 리틀엔디언과 빅엔디언 사이에서 변환해 서로 다른 시스템 간 데이터 이동을 돕는 CONVERT 지정자를 설명해요.
본문
GNU Fortran은 unformatted 데이터의 엔디언 변환을 지원해서, 서로 다른 시스템 사이에서 데이터를 옮기기 쉽게 해줘요. 변환은 OPEN 문의 CONVERT 지정자로 지정할 수 있어요. 환경 변수로 데이터 형식을 지정하는 대안은 GFORTRAN_CONVERT_UNIT(unformatted I/O 변환 설정)을 참고하면 돼요.
대부분의 시스템에서 CONVERT에 쓸 수 있는 값은 다음과 같아요.
CONVERT='NATIVE'— 네이티브 형식을 사용. 기본값이에요.CONVERT='SWAP'— 리틀엔디언과 빅엔디언 사이를 맞바꿔요.CONVERT='LITTLE_ENDIAN'— unformatted 파일에 리틀엔디언 표현을 사용.CONVERT='BIG_ENDIAN'— unformatted 파일에 빅엔디언 표현을 사용.
-mabi=ieeelongdouble를 지원하는 POWER 시스템에는 추가 옵션이 있는데, 콤마로 다른 옵션들과 조합할 수 있어요. 그 옵션들은 이래요.
CONVERT='R16_IEEE'—REAL(KIND=16)에 IEEE 128비트 형식을 사용.CONVERT='R16_IBM'—REAL(KIND=16)에 IBM long double 형식을 사용.
옵션을 쓰는 예시는 이렇게 생겼어요.
open(file='big.dat',form='unformatted',access='sequential', &
convert='big_endian')
변환 값은 INQUIRE(CONVERT=ch)로 조회할 수 있어요. 반환되는 값은 'BIG_ENDIAN'과 'LITTLE_ENDIAN'이에요.
CONVERT는 지원되는 모든 종류의 INTEGER 값과, IEEE 시스템에서 종류 4와 8의 REAL에 대해 빅·리틀엔디언 사이에서 동작해요. GNU Fortran이 REAL(KIND=10)·REAL(KIND=16)으로 지원하는, m68k와 x86_64 같은 서로 다른 아키텍처의 서로 다른 "extended double" 타입 간 변환은 아마 동작하지 않을 거예요.
참고로 GFORTRAN_CONVERT_UNIT 환경 변수로 지정한 값은 OPEN 문의 CONVERT 지정자를 덮어써요. 이는 소스 코드가 없는 사용자에게도 데이터 형식을 제어할 수 있게 하기 위해서예요.
unformatted 데이터에 네이티브가 아닌 표현을 쓰면 상당한 속도 오버헤드가 발생해요. 이 영역의 속도가 중요하다면, 이식성이 필요한 데이터에만 쓰는 게 좋아요.
요약하면, 기본은 NATIVE이고, 이식 가능한 데이터가 필요할 때만 SWAP·LITTLE_ENDIAN·BIG_ENDIAN을 골라 쓰면 돼요. 그리고 환경 변수와 CONVERT 지정자가 충돌할 수 있으니, 환경 변수 같은 전역 설정이 적용 중인지도 함께 확인하는 게 좋아요.
더 알아보기
- OPEN·INQUIRE 문
- GFORTRAN_CONVERT_UNIT 환경 변수
- unformatted I/O 처리