【问题标题】:(simple example) MPI parallel io writing garbage(简单例子)MPI并行io写垃圾
【发布时间】:2013-03-24 18:48:31
【问题描述】:

我试图让多个进程使用 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 读取文件时,我得到了随机垃圾:一堆正方形、矩形、!$"%&!!/ 符号,根本没有整数。

我做错了什么?

【问题讨论】:

  • 很可能您正在将原始整数写入文件。如果您将其视为 ascii 文本,它将被视为垃圾。尝试使用od 来查看文件的内容。
  • 这是一个命令行实用程序。 od -t d4 /path/to/file
  • 程序写的正确; @Aneri 非常正确,od 表明输出正是您所期望的,但它是二进制格式,这就是 MPI-IO 的操作方式——想想fwrite(),而不是fprintf()

标签: c++ io mpi


【解决方案1】:

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

MPI_File_write(..., MPI_INT,...) 写入的ints 将被写入二进制数据,而不是 ASCII 或 Unicode 文本。 “一堆正方形、矩形、@#$@#! 符号”对我来说就像您正在使用文本编辑器打开文件并查找 ASCII 数字一样。

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

【讨论】:

  • 谢谢,但是如果我使用 write 而不是 write_all 我会得到相同的结果!
  • “这意味着写入 BUFSIZE 字节,而不是 BUFSIZE 整数”——这是不正确的。签名为MPI_File_write(MPI_File mpi_fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status);无论给出什么datatype,它确实写了count。所以是的,MPI_File_write(... BUFSIZE, MPI_INT...) 会写 BUFSIZE ints。
  • @JohathanDursi 啊——我错过了那个论点。谢谢!
  • @FLAME_phoenix 创建格式化字符串并将它们作为字节输出?进行并行可能并非易事,因为每个数据点的长度会有所不同。可能正确的问题是如何以二进制形式读取原始int 数据。
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2013-03-10
  • 2020-11-29
  • 2012-11-13
  • 2010-11-02
  • 1970-01-01
相关资源
最近更新 更多