2012-12-18 88 views
0

我有一大段遺留代碼是用Fortran 77編寫的。我正在編譯它並使用英特爾Fortran編譯器(版本11?)運行它。我最近遇到了一個問題,輸出文件的大小隻有2GB,並且輸出停止寫入磁盤。具有大文件大小的英特爾Fortran編譯器

我一直在尋找是否這是Fortran 77標準的一部分,或者如果我只是缺少一個編譯器標誌或其他東西,但沒有發現任何指向我的問題的東西。

更改寫入語句不是一個選項,因爲遺留代碼的數量級爲幾十萬行。最糟糕的情況是,我每隔幾天就會將輸出的前幾部分截斷到不同的文件中,但我寧願不必這樣做。

+0

連續的Fortran標準幾乎無法識別文件(或計算機)的存在,更不用說對它們設置限制。標準指出,這種與環境相互作用的東西是特定於實現的。我不知道我使用的Intel編譯器對輸出文件大小設置了限制。您規定的2GB上限使我懷疑這是一個o/s限制;你可能在32位Windows系統上運行? –

+0

我在64位Scientific Linux上運行,這是一個RedHat克隆。我會檢查我的文件系統類型,看看是否可以成爲問題。編輯:我所有的分區都是ext4,所以這也不應該成爲問題。 –

+0

請務必使用標籤[tag:fortran],並在必要時添加版本以區分您的問題是否具體。例如,您不能使用Fortran 2008,而只能使用Fortran 90。 –

回答

3

這種行爲最可能的原因是正在使用的內存模型。在64位模式下有三個存儲器模型,由尋址模式分辨使用:

  • small模型 - RIP - 相關尋址用於一切,從調用函數以訪問數據。 RIP是x64的64位指令指針寄存器(EIP的64位擴展),但相對地址只能是帶符號的32位數字(並且有一些限制阻止使用完整的帶符號整數範圍),因此組合代碼+靜態數據大小被限制爲大約2 GiB。
  • medium模型 - 程序代碼被限制爲2 GiB,因此RIP相關函數調用,但數據符號分爲兩種類型。小數據符號是與第一個2 GiB中的代碼配合使用的符號,它們使用與小模型中相同的RIP相關方法尋址。使用寄存器尋址訪問大數據符號,並將符號的絕對地址加載到寄存器中,該地址較慢,但對可尋址存儲器沒有限制。
  • large模型 - 所有符號都使用絕對尋址來訪問。代碼或數據大小沒有限制。

,可以針對64位大多數編譯器,ifort包括,接受--mcmodel=model選項,允許一個控制所使用的內存模型。默認模型是small。你的目標文件的大小意味着有大量的初始化靜態數據,可能是一些非常大的初始化數組(假設爲DATABLOCK DATA語句)或許多更小的數組(我懷疑即使是100萬條代碼語句也會產生2 GiB的指令碼)。用--mcmodel=medium--mcmodel=large編譯應該解決大對象文件大小的問題。

請注意,將使用不同內存模型的目標代碼鏈接在一起是災難的祕訣 - 應該使用相同的內存模型編譯整個應用程序。