Bro*_*ses 7 c file-io posix process mpi
我最近遇到了一些未经良好测试的遗留代码,用于将分布在多个进程(这些是基于MPI的并行计算的一部分)的数据写入同一文件.这确实有效吗?
它是这样的:
所有进程都打开相同的文件进行写入.
每个进程调用fseek以寻找文件中的不同位置.此位置可能超过文件末尾.
然后,每个进程将一个数据块写入文件中fwrite.搜索位置和块大小使得这些写入完全平铺文件的一部分 - 没有间隙,没有重叠.
这有保证可行,还是有时会失败?没有锁定来序列化写入,实际上它们可能是从同步点开始的.另一方面,我们可以保证他们写入不同的文件位置,不同于其他问题,这些问题试图从多个进程写入"文件末尾".
我发现这些进程可能位于通过NFS挂载文件的不同计算机上,我怀疑它可能会回答我的问题 - 但是,如果文件是本地的,它会起作用吗?
我相信这通常会起作用,但不能保证我能找到。fwrite(3) 的 Posix 规范遵循 ISO C,并且两个标准都没有提到并发性。
所以我怀疑它通常会起作用,但 fseek(3) 和 fwrite(3) 是缓冲 I/O 函数,因此成功将取决于库实现的内部细节。因此,绝对不能保证,但有各种理由期望它会起作用。
现在,如果程序使用 lseek(2) 和 write(2) 那么我相信您可以考虑保证结果,但现在它仅限于 Posix 操作系统。
有一件事情似乎……很奇怪……为什么MPI 程序决定通过NFS而不是消息 API共享其数据?它看起来速度较慢、便携性较差、更容易出现问题,而且通常只是浪费 MPI 功能集。鉴于对单个 NFS 服务器的依赖,它肯定不再是分布式的。