(简单的例子)MPI并行io写入垃圾

(simple example) MPI parallel io writing garbage

本文关键字:io 并行 MPI 简单      更新时间:2023-10-16

我正试图使多个进程同时使用MPI并行io将整数缓冲区写入文件。为了实现这个目标,我搜索了各种网站:

  • MPI和并行IO
  • Google图书搜索
  • 基于MPI的并行IO

我试着学习他们的教导。为了测试它们,我在c++中创建了以下简单代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define BUFSIZE 100
using namespace std;
int main(int argc, char *argv[])
{
    int myrank, buf[BUFSIZE], rcode;
    MPI_File thefile;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    for (int i=0; i<BUFSIZE; i++)
        buf[i] = myrank * BUFSIZE + i;
    rcode = MPI_File_open(MPI_COMM_WORLD, "testfile", MPI_MODE_CREATE | MPI_MODE_RDWR,
                                MPI_INFO_NULL, &thefile);
    if(rcode != MPI_SUCCESS){
        cerr << "Did not open file" << endl;
        return EXIT_FAILURE;
    }
    rcode = MPI_File_set_view(thefile, myrank * (MPI_Offset)BUFSIZE * sizeof(int), MPI_INT, MPI_INT,
                                        "native", MPI_INFO_NULL);
    if(rcode != MPI_SUCCESS){
        cerr << "Problem setting process view" << endl;
        return EXIT_FAILURE;
    }

    MPI_File_write(thefile, buf, BUFSIZE, MPI_INT, MPI_STATUS_IGNORE);
    if(rcode != MPI_SUCCESS){
        cerr << "Problem writting file" << endl;
        return EXIT_FAILURE;
    }
    MPI_File_close(&thefile);
    MPI_Finalize();
    return EXIT_SUCCESS;
}

然而,当我尝试与Kate一起读取文件时,我得到了随机的垃圾:一堆正方形,矩形,!$"%&!!/符号,没有整数。

我做错了什么?

你似乎对文本/二进制数据有误解。

MPI_File_write(..., MPI_INT,...)写入的int s将被写入二进制数据,而不是ASCII或Unicode文本。"一堆正方形、矩形,@#$@#!"对我来说,"symbols"读起来就好像你正在用文本编辑器打开文件并寻找ASCII数字。

如果你想要格式化的输出,你必须自己格式化。如果你想让文本编辑器读取你的文件,你需要写文本,而不是int s。