【问题标题】:Optimal way to write 2d array into unformatted file using nested implicit loops使用嵌套隐式循环将二维数组写入未格式化文件的最佳方法
【发布时间】:2021-10-26 07:41:31
【问题描述】:

我有一段代码将二维数组 var 写入一个 fortran 无格式文件。 我希望它是逐行编写的。因此,我需要以非最优顺序循环 fortran,因为建议先在外部维度上循环。

write(fileid, pos = pos) ((var(i,j),j=1,size(var,2)),i=1,size(var,1))

我想知道转置我写入文件的方式是否会更优化,或者这是否没有必要,因为在这种情况下 I/O 进程应该支配缓存/内存访问。

【问题讨论】:

  • 您的测量结果显示了什么?
  • 我没有做任何测量,因为我认为这个问题可能有一个通用的答案。但是,如果你告诉我没有任何通用的答案,那么我会进行一些测试并让社区知道,当然,我会在我的基准测试中提供一个体面的描述。
  • 我们有各种大小的缓存和缓冲区以及各种大小的数据。我们有硬盘、SSD 磁盘,我们在同一设备上有磁盘,通过某种互连、以太网访问磁盘......很难假设一个通用的答案。

标签: io fortran


【解决方案1】:

我是一名退休的 Fortran 编译器和 I/O 库开发人员,我的经验是编写整个数组会好得多。使用你所拥有的隐含循环,超出内存顺序,通常需要将每个元素单独传输到 I/O 库,每个元素都有很多处理开销。写入整个数组可能会导致直接从您的数组进行一次 I/O 传输。

鉴于您使用的是未格式化的 I/O,我不理解一次写入一行的愿望,除非这将被其他软件读取。

【讨论】:

  • 这绝对有帮助。我需要逐行编写的原因正是因为我需要将文件作为不同非fortran软件的输入。
  • 您可能需要考虑更改数组的 Fortran 声明以反映所需的存储顺序。很大程度上取决于您的 Fortran 代码如何访问数组。但是,除非您发现性能是一个问题,否则只需以对您最有意义的方式编写代码,不要担心。您可能需要考虑 (var(i,:),i=1,size(var,1)),因为这可能会带来一些优化。
猜你喜欢
  • 2011-08-21
  • 2023-04-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2018-03-31
  • 1970-01-01
  • 2014-01-07
相关资源
最近更新 更多