Gfortran在M1 Mac上处理大数组失败问题求助
M1 Mac Ventura 13.5下Fortran静态数组运行报错解决方案
问题场景
在搭载Ventura 13.5系统的M1 Mac上编译运行Fortran代码时,同时声明两个大静态数组并赋值会导致程序崩溃;注释其中任意一个数组的声明与赋值语句,代码可正常运行。简化示例代码如下:
program mwe implicit none integer, parameter :: nx=500 integer, parameter :: ny=500 integer, parameter :: nz=500 integer, parameter :: ncol=4 integer :: image(nx, ny, nz, ncol-1) double precision :: alpha(nx, ny, nz) image = 0 alpha = 0.0 end program mwe
错误信息
保留两个数组时,运行程序触发如下错误:
dyld[10519]: dyld cache '(null)' not loaded: syscall to map cache into shared region failed dyld[10519]: Library not loaded: /usr/lib/libSystem.B.dylib Referenced from: <43A71502-FD1F-3929-A1F3-3102B17ACF2D> /Users/USERNAME/Desktop/fortran_mwe/a.out Reason: tried: '/usr/lib/libSystem.B.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/libSystem.B.dylib' (no such file), '/usr/lib/libSystem.B.dylib' (no such file, no dyld cache), '/usr/local/lib/libSystem.B.dylib' (no such file) Abort trap: 6
二进制文件分析
通过otool命令查看二进制文件的段结构与主程序入口信息:
LC_SEGMENT_64 段信息
Load command 0 cmd LC_SEGMENT_64 cmdsize 72 segname __PAGEZERO vmaddr 0x0000000000000000 vmsize 0x0000000100000000 fileoff 0 filesize 0 maxprot 0x00000000 initprot 0x00000000 nsects 0 flags 0x0 Load command 1 cmd LC_SEGMENT_64 cmdsize 392 segname __TEXT vmaddr 0x0000000100000000 vmsize 0x0000000000004000 fileoff 0 filesize 16384 maxprot 0x00000005 initprot 0x00000005 nsects 4 flags 0x0 -- Load command 2 cmd LC_SEGMENT_64 cmdsize 152 segname __DATA_CONST vmaddr 0x0000000100004000 vmsize 0x0000000000004000 fileoff 16384 filesize 16384 maxprot 0x00000003 initprot 0x00000003 nsects 1 flags 0x10 -- Load command 3 cmd LC_SEGMENT_64 cmdsize 152 segname __DATA vmaddr 0x0000000100008000 vmsize 0x0000000095030000 fileoff 0 filesize 0 maxprot 0x00000003 initprot 0x00000003 nsects 1 flags 0x0 -- Load command 4 cmd LC_SEGMENT_64 cmdsize 72 segname __LINKEDIT vmaddr 0x0000000195038000 vmsize 0x0000000000004000 fileoff 32768 filesize 898 maxprot 0x00000001 initprot 0x00000001 nsects 0 flags 0x0
LC_MAIN 入口信息
Load command 13 cmd LC_MAIN cmdsize 24 entryoff 16140 stacksize 0
解决方案
问题根源
两个静态数组合计占用内存超过M1 Mac上Fortran编译器默认small内存模型的静态数据限制:
image数组:500×500×500×3个整数,占用1.5GB内存alpha数组:500×500×500个双精度浮点数,占用1GB内存
合计2.5GB的静态数据导致__DATA段虚拟内存过大,触发dyld加载失败。
具体解决方法
切换内存模型编译
使用-mcmodel=medium编译选项,允许更大的静态数据空间。以gfortran为例:gfortran -mcmodel=medium mwe.f90 -o mwe备选方案
若编译器不支持-mcmodel选项,可尝试:- 给其中一个数组添加
save属性,强制编译器将其分配到不同内存段 - 调整编译器段分配参数,手动指定大数组的存储位置
- 给其中一个数组添加
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

