這種行爲最可能的原因是正在使用的內存模型。在64位模式下有三個存儲器模型,由尋址模式分辨使用:
small
模型 - RIP
- 相關尋址用於一切,從調用函數以訪問數據。 RIP
是x64的64位指令指針寄存器(EIP
的64位擴展),但相對地址只能是帶符號的32位數字(並且有一些限制阻止使用完整的帶符號整數範圍),因此組合代碼+靜態數據大小被限制爲大約2 GiB。
medium
模型 - 程序代碼被限制爲2 GiB,因此RIP
相關函數調用,但數據符號分爲兩種類型。小數據符號是與第一個2 GiB中的代碼配合使用的符號,它們使用與小模型中相同的RIP
相關方法尋址。使用寄存器尋址訪問大數據符號,並將符號的絕對地址加載到寄存器中,該地址較慢,但對可尋址存儲器沒有限制。
large
模型 - 所有符號都使用絕對尋址來訪問。代碼或數據大小沒有限制。
,可以針對64位大多數編譯器,ifort
包括,接受--mcmodel=model
選項,允許一個控制所使用的內存模型。默認模型是small
。你的目標文件的大小意味着有大量的初始化靜態數據,可能是一些非常大的初始化數組(假設爲DATA
或BLOCK DATA
語句)或許多更小的數組(我懷疑即使是100萬條代碼語句也會產生2 GiB的指令碼)。用--mcmodel=medium
或--mcmodel=large
編譯應該解決大對象文件大小的問題。
請注意,將使用不同內存模型的目標代碼鏈接在一起是災難的祕訣 - 應該使用相同的內存模型編譯整個應用程序。
連續的Fortran標準幾乎無法識別文件(或計算機)的存在,更不用說對它們設置限制。標準指出,這種與環境相互作用的東西是特定於實現的。我不知道我使用的Intel編譯器對輸出文件大小設置了限制。您規定的2GB上限使我懷疑這是一個o/s限制;你可能在32位Windows系統上運行? –
我在64位Scientific Linux上運行,這是一個RedHat克隆。我會檢查我的文件系統類型,看看是否可以成爲問題。編輯:我所有的分區都是ext4,所以這也不應該成爲問題。 –
請務必使用標籤[tag:fortran],並在必要時添加版本以區分您的問題是否具體。例如,您不能使用Fortran 2008,而只能使用Fortran 90。 –