gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:10:44 26 4
gpt4 key购买 nike

考虑下面的简单程序,它将所有排名大于零的进程的排名写入文件:

#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 个字节)进行写调用,但它们为零。

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

最佳答案

MPI_File_write_at 会将数据作为二进制数据写入文件。然后,当您运行命令 hexdump -C myfile 时,该命令将相应地显示数据,前 4 个字节偏移量。那些第一个字节不是二进制数据的一部分 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 开头。

Can I be sure that those are always zero?

就标准而言,我还没有找到,明确指出如果跳过文件的开头offset > 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 版本,显然对于您的 MPI 版本,它初始化为零。

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

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

In general, the contents of a file written by the MPI IO interface aregoing to be implementation-specific.

关于c++ - MPI_File_write_at() 是否用零初始化文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65253103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com