You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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加载失败。

具体解决方法

  1. 切换内存模型编译
    使用-mcmodel=medium编译选项,允许更大的静态数据空间。以gfortran为例:

    gfortran -mcmodel=medium mwe.f90 -o mwe
    
  2. 备选方案
    若编译器不支持-mcmodel选项,可尝试:

    • 给其中一个数组添加save属性,强制编译器将其分配到不同内存段
    • 调整编译器段分配参数,手动指定大数组的存储位置

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:40:54