Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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_File_write_at()是否用零初始化文件?_C++_C_Mpi_Hexdump_Parallel Io - Fatal编程技术网

C++ MPI_File_write_at()是否用零初始化文件?

C++ MPI_File_write_at()是否用零初始化文件?,c++,c,mpi,hexdump,parallel-io,C++,C,Mpi,Hexdump,Parallel Io,考虑以下简单程序,该程序将秩大于零的所有进程的秩写入一个文件: #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 of

考虑以下简单程序,该程序将秩大于零的所有进程的秩写入一个文件:

#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;
}
我们使用
hextump-cmyfile

00000000  00 00 00 00 01 00 00 00  02 00 00 00 03 00 00 00  |................|
00000010
现在,我从未对第一个整数(也就是前4个字节)进行过写调用,但它们是零


我能否确定这些始终为零?

MPI\u File\u write\u at
将数据作为
二进制数据写入文件。然后,当您运行命令
hextump-cmyfile
时,该命令将相应地显示数据,第一个
4字节
为偏移量。第一个字节不是每si二进制数据的一部分,而是由
hextump-cmyfile
添加的,以便于可读

十六进制
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>0
的开头,MPI实现将用零填补该空白。例如,对于我正在使用的MPI版本(打开MPI 1.8.8),如果我将您的代码修改为:

 if (world_rank == 3) {
    MPI_File_write_at(fh, offset, &world_rank, 1, MPI_INT, &status);
}
我从
hextump-cmyfile
获得以下输出:

00000000  00 00 00 00 00 00 00 00  00 00 00 00 03 00 00 00  |................|
00000010
因此,对于我正在使用的MPI版本,显然对于您的MPI版本,它用零初始化

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

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

通常,由MPI IO接口编写的文件的内容是 将是特定于实现的

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