是否使用没有 I/O 列表的 Fortran read() 分配内存?

Does memory get allocated with Fortran read() with no I/O list?

提问人:Vitaliy 提问时间:8/22/2023 最后编辑:Vitaliy 更新时间:8/24/2023 访问量:88

问:

我正在读取一个 ascii 文件,其中英特尔 Fortran 打开为:

open(10, file=trim(file_name), status='old', action='read', iostat=ierr, iomsg=msg)

为了跳过一些我不想存储的文件行,我使用了没有 I/O 列表的 read():

read(10, *)

VTune 报告在 read() 上分配了 53 GB,没有 I/O 列表:

enter image description here

该内存是真的分配的,还是 VTune 错误地识别了内存分配?是什么导致了这种行为?

Fortran -Fortran 英特尔 VTune

评论

0赞 francescalus 8/22/2023
您是否有 53 GB 的物理/虚拟内存?文件有多大?文件是否已映射?
0赞 Ian Bush 8/23/2023
回答标题中的问题:“也许”。我意识到这不是一个有用的答案,但它完全取决于实现在内部如何执行迭代,并且可以很容易地在实现之间切换,即使来自同一供应商。
0赞 Vitaliy 8/23/2023
@francescalus我有 500 GB 的物理内存。文件大小为 65 MB,有 150 万行,由 40 个进程使用 MPI 并行读取。每个秩读取并存储自己的行部分,并使用不带参数的 read() 跳过其他行。该文件未映射。

答:

2赞 Steve Lionel 8/24/2023 #1

否,此时没有分配 53+GB 的虚拟内存。没有 I/O 列表的读取可能根本没有分配内存。(我曾是英特尔 Fortran 编译器开发人员。