【问题标题】:Does MPI_File_write_at() initialize the file with zeros?MPI_File_write_at() 是否用零初始化文件?
【发布时间】:2021-03-22 23:20:33
【问题描述】:

考虑以下简单的程序,它将所有等级大于零的进程的等级写入文件:

#include <mpi.h>

int main() {
    MPI_Init(NULL, NULL);

    int world_rank, world_size;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    MPI_Offset offset;
    MPI_Status status;
    MPI_File fh;

    MPI_File_open(MPI_COMM_WORLD, "myfile", MPI_MODE_CREATE | MPI_MODE_WRONLY,
            MPI_INFO_NULL, &fh);
    
    offset = world_rank * sizeof(int);

    if (world_rank > 0) {
        MPI_File_write_at(fh, offset, &world_rank, 1, MPI_INT, &status);
    }

    MPI_File_close(&fh);

    MPI_Finalize();

    return 0;
}

我们在 4 个进程上编译并运行它

mpic++ main.cpp
mpirun --oversubscribe -n 4 a.out 

我们用hexdump -C myfile检查写入的文件

00000000  00 00 00 00 01 00 00 00  02 00 00 00 03 00 00 00  |................|
00000010

现在,我从未对第一个整数(也就是前 4 个字节)进行写调用,但它们为零。

我可以确定这些总是零吗?

【问题讨论】:

    标签: c++ c mpi hexdump parallel-io


    【解决方案1】:

    MPI_File_write_at 会将数据以binary data 的形式写入文件。然后,当您运行命令hexdump -C myfile 时,该命令将相应地显示数据,第一个4 bytes偏移量。那些,第一个字节不是二进制数据的一部分per si,而是由hexdump -C myfile 出于可读性目的添加的。

    十六进制的00000010 表示二进制的10000 和十进制的16。如果你看你的第一行,忽略前 4 个字节:

      4 bytes   4 bytes      4 bytes      4 bytes       4 bytes 
    00000000 | 00 00 00 00  01 00 00 00  02 00 00 00   03 00 00 00
    00000010 |
    

    您有16 (4x4) 字节,因此下一行以00000010 开头。

    我能确定这些总是零吗?

    就标准而言,我没有在那里找到,明确指出如果跳过文件offset &gt; 0 的开头,MPI 实现将用零填充该间隙。例如,对于我正在使用的 MPI 版本(Open MPI 1.8.8),如果我将您的代码修改为:

     if (world_rank == 3) {
        MPI_File_write_at(fh, offset, &world_rank, 1, MPI_INT, &status);
    }
    

    我从hexdump -C myfile 得到以下输出:

    00000000  00 00 00 00 00 00 00 00  00 00 00 00 03 00 00 00  |................|
    00000010
    

    因此,对于我正在使用的 MPI 版本,显然对于您的版本,它会以零初始化。

    尽管如此,除非可以找到可靠的来源(我没有设法找到)明确指出在您的情况下前 4 个字节将始终为零,否则我建议不要在这方面做出任何假设。尽管如此,无论如何,不​​应该关心不是由进程写入的文件内容part

    编辑:来自“Open MPI 邮件列表”的澄清:

    一般来说,通过 MPI IO 接口写入的文件的内容是 将是特定于实现的。

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 2014-12-29
      • 2021-04-05
      • 2016-02-01
      • 1970-01-01
      • 2021-11-11
      • 2010-10-11
      • 2021-11-22
      相关资源
      最近更新 更多