【问题标题】:Fortran: Array initialization exceeds maximum table size for the ``ir_list_tbl``Fortran:数组初始化超出了 ``ir_list_tbl`` 的最大表大小
【发布时间】:2014-06-16 09:22:22
【问题描述】:

我正在尝试使用包含语句在 Fortran 中初始化查找表,该语句使用 DATA 语句声明 LUT 的值。 LUT 声明如下:

REAL DIMENSION(400, 500, 15) :: my_array
INCLUDE '/path/to/my/file.incf'

包含文件如下所示:

...
DATA my_array (390:400, 499, 5) = / 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9 /
DATA my_array (1:10, 500, 5) = / 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9 /
...

我的真实数据不是结构化的,因此 LUT 结构确实是必要的 :) 我想将它编译到程序中,这样我就不必在运行时读取它。

当我尝试编译时,我收到以下错误:

ftn-237 crayftn: LIMIT SRC_RADIATION, File = /path/to/my/file.incf, Line = 127436 
  Maximum table size has been exceeded for the "ir_list_tbl".

据我了解,ir_list_tbl 用于簿记,但由于我实际上只是将值按位置保存在单个变量中,因此我不了解这里的开销。我们说的是单个数组中的 3,000,000 个值,而不是 3,000,000 个顶级变量。我可以在这里做得更好吗?

【问题讨论】:

  • 您正在尝试使用 DATA 语句初始化一个包含 300 万个元素的数组?这太不寻常了,以至于对编译器来说可能太多了。我建议从文件中读取值。
  • 我同意这将是最自然的事情,但是这将被集成到天气模型中,因此优先事项之一是尽量减少花在 I/O 等事情上的时间。看来这将是要走的路。
  • 如果您将文件设为未格式化(有时称为二进制),则 IO 会很快。但是,这将引入一些平台依赖性。您可以为通用平台提供本机未格式化,为其他所有内容提供文本。或者您可以使用 HDF5 或 FITS 来提供独立于平台的“二进制”。
  • 即使你可以嵌入海量数组,你也必须做一些 IO——不管你的操作系统是在执行之前加载可执行文件,还是你的可执行文件在开始时加载输入文件执行。如果输入文件是本机未格式化的,我希望差异可以忽略不计。

标签: arrays multidimensional-array fortran lookup-tables


【解决方案1】:

如果在堆栈上创建显式形状本地数组,则可能是您的stack size 已超出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2012-08-03
    • 2021-06-08
    相关资源
    最近更新 更多