3

我有一个 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)

然后对var1等执行操作。我的问题是是否有使用(最好)OpenMP 的合适策略可以让我加快阅读过程,特别是考虑到数据文件(如果有任何区别)相当大。

我有可能在 Lustre 文件系统上运行这些计算,这在原则上为并行 I/O 提供了优势,尽管对于常规文件系统的通用解决方案将不胜感激。

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

4

1 回答 1

0

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

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

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

于 2018-04-19T19:16:29.583 回答