2012-12-18 6 views
0

나는 Fortran 77로 작성된 많은 레거시 코드를 가지고 있습니다. 컴파일하고 인텔 ® 포트란 컴파일러 (버전 11?)로 실행 중입니다. 나는 최근에 출력 파일이 2GB 크기에 불과하고 출력이 디스크에 기록되는 것을 멈추는 문제에 직면했다.큰 파일 크기의 인텔 포트란 컴파일러

이것이 포트란 77 표준의 일부인지, 아니면 단순히 컴파일러 플래그가 누락되었거나 내 문제를 지적한 점을 발견하지 못했다.

레거시 코드가 수십만 줄 정도이기 때문에 쓰기 문을 변경하는 것은 옵션이 아닙니다. 최악의 시나리오는 며칠에 한 번씩 출력의 이전 부분을 다른 파일로 자르지 만이 작업을 수행 할 필요가 없다는 것입니다.

+0

연속적인 Fortran 표준은 제한 사항을 설정하는 것이 아니라 파일 (또는 해당 컴퓨터)의 존재를 거의 인식하지 못합니다. 표준에 따르면 환경과의 상호 작용은 구현에 따라 다릅니다. 필자가 많이 사용하는 인텔 컴파일러가 출력 파일 크기에 제한을 설정한다는 것을 알지 못합니다. 2GB의 상한값을 지정하면 이것이 o/s 한도라고 의심됩니다. 32 비트 Windows 시스템에서 실행되고 있습니까? –

+0

저는 RedHat Clone 인 64 비트 Scientific Linux 6.3을 실행 중입니다. 파일 시스템 유형을 점검하여 문제가되는지 확인합니다. 편집 : 내 모든 파티션은 ext4이므로 문제가되지 않아야합니다. –

+0

항상 태그 [tag : fortran]을 사용하고 질문이 구체적이라는 것을 구별하기 위해 필요한 경우에만 버전을 추가하십시오. 예를 들어, Fortran 2008은 사용할 수없고 Fortran 90 만 사용할 수 있습니다. –

답변

3

이러한 종류의 동작이 발생할 가능성이 가장 큰 이유는 사용중인 메모리 모델 때문입니다. - RIP 데이터에 액세스하는 함수를 호출에서 모든 사용되는 주소 지정 - 관련

  • small 모델 : 64 비트 모드에서 사용되는 주소 지정 모드에 의해 구별 세 가지 메모리 모델이있다. RIP은 x64 (64 비트 확장자 EIP)의 64 비트 명령어 포인터 레지스터이지만 상대 주소는 부호있는 32 비트 숫자 일 수 있습니다 (전체 부호있는 정수 범위 사용을 제한하는 몇 가지 제한 사항이 있음)), 따라서 결합 된 코드 + 정적 데이터 크기는 약 2 GiB로 제한됩니다.
  • medium 모델 - 프로그램 코드는 2 GiB로 제한되어 있으므로 RIP 관련 함수 호출이지만 데이터 기호는 두 가지 유형으로 분리됩니다. 작은 데이터 심볼은 처음 2 GiB의 코드와 함께 적합하며 작은 모델에서와 같은 동일한 RIP- 관련 메소드를 사용하여 처리됩니다. 큰 데이터 기호는 레지스터에로드 된 심볼의 절대 주소와 함께 레지스터 주소 지정을 사용하여 액세스됩니다. 레지스터는 더 느리지 만 주소 지정 가능 메모리에는 제한이 없습니다.
  • large 모델 - 모든 기호는 절대 주소 지정을 사용하여 액세스됩니다. 코드 또는 데이터 크기에는 제한이 없습니다.

x64, ifort을 대상으로 할 수있는 대부분의 컴파일러는 --mcmodel=model 옵션을 사용하여 사용되는 메모리 모델을 제어 할 수 있습니다. 기본 모델은 small입니다. 객체 파일의 크기는 초기화 된 정적 데이터가 엄청나게 많다는 것을 의미합니다. 매우 큰 초기화 된 배열 (생각하면 DATA 또는 BLOCK DATA 문) 또는 많은 더 작은 배열 (1 백만 개의 코드 문으로도 2 GiB의 명령이 생성 될지는 의문입니다. 암호). --mcmodel=medium 또는 --mcmodel=large으로 컴파일하면 큰 개체 파일 크기 문제가 해결됩니다.

서로 다른 메모리 모델을 사용하는 오브젝트 코드를 연결하면 재난을 대비하는 방법이므로 전체 응용 프로그램을 동일한 메모리 모델로 컴파일해야합니다.