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