Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
C 使用多个MPI进程将非重叠pwrite()并发到NFS上装载的文件_C_Parallel Processing_Mpi_Nfs_File Writing - Fatal编程技术网

C 使用多个MPI进程将非重叠pwrite()并发到NFS上装载的文件

C 使用多个MPI进程将非重叠pwrite()并发到NFS上装载的文件,c,parallel-processing,mpi,nfs,file-writing,C,Parallel Processing,Mpi,Nfs,File Writing,我有一个计算流体动力学代码,我正在编写一个并行读写实现。我想要实现的是多个MPI进程打开同一个文件并向其中写入数据(没有数据重叠,我使用pwrite()和偏移量信息)。当两个MPI进程位于同一计算节点上时,这似乎工作正常。但是,当我使用2个或更多计算节点时,一些数据无法到达硬盘。为了演示这一点,我编写了以下C程序,我使用mpicc编译该程序(我的MPI发行版是MPICH): 在串行写入的参考文件中,od命令的输出: . . . 0007760 511

我有一个计算流体动力学代码,我正在编写一个并行读写实现。我想要实现的是多个MPI进程打开同一个文件并向其中写入数据(没有数据重叠,我使用pwrite()和偏移量信息)。当两个MPI进程位于同一计算节点上时,这似乎工作正常。但是,当我使用2个或更多计算节点时,一些数据无法到达硬盘。为了演示这一点,我编写了以下C程序,我使用mpicc编译该程序(我的MPI发行版是MPICH):

在串行写入的参考文件中,
od
命令的输出:

.
.
.
0007760                      511                      512
0010000                      513                      514
0010020                      515                      516
0010040                      517                      518
0010060                      519                      520
0010100                      521                      522
0010120                      523                      524
0010140                      525                      526
0010160                      527                      528
0010200                      529                      530
0010220                      531                      532
0010240                      533                      534
0010260                      535                      536
0010300                      537                      538
0010320                      539                      540
0010340                      541                      542
0010360                      543                      544
0010400                      545                      546
0010420                      547                      548
0010440                      549                      550
0010460                      551                      552
0010500                      553                      554
0010520                      555                      556
0010540                      557                      558
0010560                      559                      560
0010600                      561                      562
0010620                      563                      564
.
.
.

到目前为止,解决这一问题的唯一方法似乎是使用带有O_SYNC标志的POSIX open()函数,该标志可确保文件以物理方式写入硬盘,但速度似乎慢得不切实际。另一种同样缓慢的方法似乎是使用内置的MPI I/O命令。我也不知道为什么MPI I/O速度慢。已使用以下标志将存储装载到NFS上:
rw、nohide、unsecure、no_subtree\u check、sync、no_wdelay
。我已尝试在文件和目录上调用fsync(),但均无效。因此,我需要关于如何修复此问题的建议。

NFS是一个可怕的文件系统。如您所见,它的缓存行为使进程很容易“错误共享”缓存块,然后损坏数据

如果您一直使用NFS,请并行执行计算,然后从一个列组执行所有I/O

像OrangeFS/PVFS()这样的真正的并行系统在这方面会有很大的帮助,特别是如果开始使用MPI-IO(您已经在使用MPI了,所以已经完成了一半!)。光泽是另一种选择。OrangeFS是这两个配置中比较简单的一个,但我可能有偏见,因为我以前一直在使用它

在集体I/O中寻址随机内存是完全可能的。所有数据都是MPI\u DOUBLE,因此您需要做的就是描述具有最差MPI\u类型的区域\u CREATE\u HINDEXED并提供地址。如果没有其他原因,您将发出一个MPI-IO调用而不是(如果N==10)1000,那么您将看到性能的巨大提高。您的数据在文件中是连续的,所以您甚至不必担心文件视图


此外,还记得我说过的“从一个进程执行所有I/O吗?”。这有点高级,但如果您将“cb_节点”提示(用于“集体缓冲”优化的节点数)设置为1 MPI-IO,您就可以做到这一点。

您是否将集体I/O与
MPI-IO
一起使用?否,我没有。CFD代码是这样的:在i,j,k for循环中,数据从位于不同内存块(对于不同的i,j,k)中的结构读取并写入文件。在这种情况下,如果不增加内存需求,我认为集体I/O是不可能的。我相信几个月前我确实使用了MPI I/O的Fileview功能。速度也不是很快。另一方面,pwrite()方法(或者fseek和fwrite)要快得多。一种可能的替代方法是让每个列组在自己的文件中写入数据,然后对这些文件进行后处理,将它们“合并”到一个文件中。是的,这是我和同事们的共识。然而,合并部分很棘手,而且可能很昂贵,但并非不可能。如果pwrite方法能够像预期的那样工作,那就太好了。如果解决方案只是使用不同的标志在NFS中装载存储,或者使用一些命令刷新数据,那就太好了?此外,我得出的结论与你在这里提出的结论完全相同。事实上,我甚至已经开始重写代码(原始代码需要编写位于结构内部的双精度数组,而不仅仅是一个双精度数组)以使用MPI I/O(使用MPI_type_create_hindexedblock从内存和文件视图收集数据以在非连续位置写入数据),希望使用MPI提示进行优化。最后,如前所述,为了提高性能,我可能必须为每个进程编写一个文件,并使用一个单独的程序将文件缝合在一起。所有这些文件系统都可以并行运行。不过,orangefs是一个完整的文件系统,所以很明显,您不能将orangefs链接到代码中,并将NFS视为一个并行文件系统。但如果在NFS服务器节点上运行orangefs服务器进程,则没有问题。给它一个专门的存储区域,让它保持整洁
od -N <byte_number> -tfD <file_name>
.
.
.
0007660                      503                      504
0007700                      505                      506
0007720                      507                      508
0007740                      509                      510
0007760                      511                      512
0010000                        0                        0
*
0010620                        0
0010624
.
.
.
0007760                      511                      512
0010000                      513                      514
0010020                      515                      516
0010040                      517                      518
0010060                      519                      520
0010100                      521                      522
0010120                      523                      524
0010140                      525                      526
0010160                      527                      528
0010200                      529                      530
0010220                      531                      532
0010240                      533                      534
0010260                      535                      536
0010300                      537                      538
0010320                      539                      540
0010340                      541                      542
0010360                      543                      544
0010400                      545                      546
0010420                      547                      548
0010440                      549                      550
0010460                      551                      552
0010500                      553                      554
0010520                      555                      556
0010540                      557                      558
0010560                      559                      560
0010600                      561                      562
0010620                      563                      564
.
.
.