Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 在Fortran中使用MPI I/O读取未格式化的流二进制文件_Io_Fortran_Mpi_Mpi Io - Fatal编程技术网

Io 在Fortran中使用MPI I/O读取未格式化的流二进制文件

Io 在Fortran中使用MPI I/O读取未格式化的流二进制文件,io,fortran,mpi,mpi-io,Io,Fortran,Mpi,Mpi Io,我有一个大小约为60GB的未格式化流二进制文件,我在我的串行代码中读取如下内容: parameter(nsea=120445) real*4 p(nsea,nsea) open(10,file='my_file.grd' & & ,status='old',access='stream',form='unformatted') read(10)((p(ibk,jbk),jbk=1,nsea),ibk=1,nsea) close(10) 由于

我有一个大小约为60GB的未格式化流二进制文件,我在我的串行代码中读取如下内容:

   parameter(nsea=120445)
   real*4 p(nsea,nsea)
   open(10,file='my_file.grd'  &
   & ,status='old',access='stream',form='unformatted')
   read(10)((p(ibk,jbk),jbk=1,nsea),ibk=1,nsea)
   close(10)
由于读取此文件需要很多时间,我想使用MPI I/O并行化这部分代码。我正在尝试使用
MPI\u文件集\u视图
MPI\u文件读取
选项来完成此操作。有人能指导我有效地做这件事吗?
在读取并存储参数
p(nsea,nsea)
之后,我想在代码的其余部分传递整个数组以进行一些矩阵运算

我在我的电脑上尝试了一个简单的示例代码复制器,它有32GB的内存用于27GB的测试文件。使用“gFortran stream.f90-o stream.exe”编译时,它只需320秒,那么单线程是否太慢了?(由于磁盘缓冲,这种测试方法可能会有问题,但当文件大小+内存需求超过已安装内存时,应该不会有问题) 您可能希望通过包含更多错误测试(stat=,iostat=)来扩展下面列出的方法

我在3台pc上测试了这段代码,2台带有SSD。i5拥有Win 7 8Gb内存,而i7拥有Win 10 32Gb内存。下表列出了我获得的性能。文件大小约为85%的内存,因此磁盘缓冲应该不重要。结果可能是可变的。我很惊讶SSD的性能低于预期,而i7硬盘的性能却好于预期

Disk           File Gb write sec  read sec write Mb/s  read Mb/s
i5-2300  C:HDD     4.6      42.1      58.9      108.3       77.5
i7-4790K E:HDD    26.9     175.0     168.7      153.8      159.6
i7-4790K C:SSD    26.9     154.7     106.4      174.0      252.9
i7-8700K E:HDD    26.9     141.8     132.7      189.8      202.8
i7-8700K C:SSD    26.9     116.9      97.5      230.2      276.0

我希望这些结果能说明串行流I/O可以实现什么。不确定在这种情况下,MPI I/O的预期速率是多少?

Welcom,请接受欢迎并阅读。您不应该寻求指导,因为这对于堆栈溢出来说可能过于宽泛,而应该提出一个可以回答的问题。你们有并行文件系统吗?使用MPI,您不会并行化部分代码,而是并行化整个代码。其余的代码是MPI吗?是的,我有一个并行文件系统(lustre)。我的想法是在使用MPI I/O读取阵列后,将其存储为全维2D阵列。然后用它来做进一步的矩阵运算(这部分是串行的,不需要花太多时间计算),我不明白。您希望如何存储它?正如您在我的序列代码中所看到的,我最终需要一个维数为(nsea x nsea)的矩阵“p”。我想要的是优化读取文件的时间。请。如果我的想法是错误的,请给出建议。但在MPI中,您将把它读入许多进程,每个进程都有一部分。您是否有足够的内存将它们收集到单个进程中?顺序内存访问对于大型阵列非常重要,可以在本示例中演示。您应该选中“((p(ibk,jbk),ibk=1,nsea),jbk=1,nsea)”和“((p(ibk,jbk,jbk=1,nsea),ibk=1,nsea)”。FORALL的顺序取决于编译器。非常感谢johncampbell。我会回美国的
Disk           File Gb write sec  read sec write Mb/s  read Mb/s
i5-2300  C:HDD     4.6      42.1      58.9      108.3       77.5
i7-4790K E:HDD    26.9     175.0     168.7      153.8      159.6
i7-4790K C:SSD    26.9     154.7     106.4      174.0      252.9
i7-8700K E:HDD    26.9     141.8     132.7      189.8      202.8
i7-8700K C:SSD    26.9     116.9      97.5      230.2      276.0