Fortran 中的并行读取能否提高性能?

Mig*_*uel 5 parallel-processing fortran openmp fortran90 lustre

我有一个 fortran90 代码,(到目前为止)大部分时间都花在 I/O 上,因为需要读取非常大的数据文件(至少 1GB 及以上)。需要写入包含计算结果的较小但仍然很大的数据文件。相比之下,一些快速傅里叶变换和其他计算很快就能完成。我已经并行化 (OpenMP) 其中一些计算,但考虑到上述 I/O 问题,总体性能增益很小。

我目前的策略是立即读取整个文件:

open(unit=10, file="data", status="old")

do i=1,verylargenumber
  read(10,*) var1(i), var2(i), var3(i)
end do

close(10)
Run Code Online (Sandbox Code Playgroud)

然后执行操作var1等。我的问题是是否有一个合适的策略使用(最好是)OpenMP 来加速读取过程,特别是考虑到数据文件(如果有任何区别)都很大。

我可以在 Lustre 文件系统上运行这些计算,原则上这为并行 I/O 提供了优势,尽管常规文件系统的通用解决方案将受到赞赏。

我的直觉是这个问题没有解决办法,但我想确认一下。

小智 0

我不是 Fortran 专家,但看起来您正在以非常小的块(一次 3 个整数,最多几十个字节)从文件中读取值。以大块(一次多个 MB)读取文件将显着提高性能,因为您将减少底层read()系统调用的数量(以及相应的锁定开销)多个数量级。

如果您的大文件在 Lustre 中写入多个条带(例如,在一个目录中,为该目录中的所有lfs setstripe -c 8 -S 4M <dir>文件设置默认条带计数为 8,条带大小为 4MB ),那么这可能提高总体读取性能 -假设您一次只能读取一个文件,并且不受客户端网络带宽的限制。如果您的程序同时在多个节点和/或线程上运行,并且每个线程本身都在读取自己的文件,那么您已经拥有文件级别之上的并行性。即使从单个文件读取也可以做得很好(如果读取量很大),因为 Lustre 客户端会在后台进行预读。

如果您有多个计算线程,每个线程同时处理文件的不同块(例如 4MB 块),那么您可以从不同线程读取每个 4MB 块,这可能会提高性能,因为您将有更多 IO 请求航班。但是,单个客户端通过网络读取文件的速度仍然存在限制。同时从多个客户端读取多条带文件将允许您聚合来自多个客户端和服务器的网络和磁盘带宽,这是 Lustre 最擅长的地方。