我有一个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提供了优势,但是对于常规文件系统的一般解决方案将不胜感激。
我的直觉是没有解决这个问题的工作,但我想检查一下。
答案 0 :(得分:0)
我不是Fortran大师,但看起来你正在以非常小的块(一次3个整数,最多几十个字节)从文件中读取值。以大块(一次多MB)读取文件将提供性能的显着改进,因为您将减少许多订单的基础read()
系统调用(和相应的锁定开销)的数量大小
如果你的大文件是用带有多个条带的Lustre编写的(例如在lfs setstripe -c 8 -S 4M <dir>
的目录中,为所有新文件设置一个条带大小为4MB的默认条带数为8在该目录中)然后此可能提高聚合读取性能 - 假设您一次只读取一个文件,并且您不受客户端网络带宽的限制。如果您的程序同时在多个节点和/或线程上运行,并且每个线程本身都在读取自己的文件,那么您已经具有高于文件级别的并行性。即使从单个文件读取也可以做得很好(如果读取很大),因为Lustre客户端将在后台进行预读。
如果你有多个计算线程同时在文件的不同块上工作(例如4MB块),那么你可以从另一个线程中读取每个4MB块,可能提高性能,因为您将有更多的IO请求在飞行中。但是,单个客户端通过网络读取文件的速度仍然存在限制。同时从多个客户端读取多条带文件将允许您聚合来自多个客户端和服务器的网络和磁盘带宽,这是Lustre最擅长的地方。