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

Parallel processing Fortran中的并行读取能否提高性能?,parallel-processing,fortran,openmp,fortran90,lustre,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,*)

我有一个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提供了优势,尽管对于常规文件系统的通用解决方案是值得赞赏的


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

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

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


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

读取(或写入)同时来自两个线程的同一个文件很可能导致对RAM和磁盘表面之间的单个i/o硬件通道的访问发生争用。(除非你有一个硬件级的并行磁盘系统。)一般来说,你目前的方法,一次读取(和写入)大文件,通常是最好的方法。通过仔细地将输入/输出缓冲区大小与要处理的内存块相匹配,您可能会获得更好的性能,但这会使您脱离Fortran。还有其他的窍门,不过还是额外的Fortran ic。@HighPerformanceMark感谢您的输入。我可以在Lustre文件系统上运行这些计算,据我所知,我在这里肯定不是专家,这就是所谓的“硬件级并行磁盘系统”。你认为那样会让你的想法更好吗?一般来说,典型的用户会在普通机器上运行它。是的,Lustre只是一种文件系统,它可以为并行程序提供更快的读写速度。我无法在Lustre上使用OpenMP提供帮助,但我认为这是针对您的问题的任何其他人的重要信息,因此请编辑该问题。不要依赖人们在评论中看到材料。文件必须是人类可读的吗?否则,使用未格式化文件(有时称为“二进制文件”)将获得更快的性能。在open语句中使用form='unformatted'。运行时的大部分时间可能花在数字的字符和内部表示之间的转换上。@M.S.B.谢谢,这实际上可能会有所帮助。这些文件通常以分子动力学模拟的典型格式提供,有时是ASCII格式,有时是二进制格式。我想我可以编写一个小界面,允许用户使用二进制文件并提高性能。