在MPI-IO上交叉来自不同处理器的二进制数据

时间:2015-03-19 13:48:22

标签: c++ c mpi binaryfiles mpi-io

我尝试使用MPI I / O(MPI-2.0,mpich2)编写二进制文件。

下面是一个最小的例子,其中包含2个文件'字符'和' ints'应打印为' 0123 ...'和' abcd ...'分别

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) 
{
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);

    // Get the number of processes
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // Get the rank of the process
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    // MPI I/O
    MPI_File file;
    MPI_Status status;
    int offset = world_rank;

    // MPI I/O with integers
    MPI_File_open (
        MPI_COMM_WORLD,     // MPI_Comm comm
        "ints",             // char *filename
    MPI_MODE_CREATE |       // int amode
    MPI_MODE_RDWR,
    MPI_INFO_NULL,          // MPI_Info info
    &file                   // MPI_File *fh
    );
    int buf1 = world_rank;
    MPI_File_write_at (
        file,               // MPI_File fh
        offset,             // MPI_Offset offset
        &buf1,              // void *buf
        1,                  // int count
        MPI_INT,            // MPI_Datatype datatype
        &status             // MPI_Status *status
    );
    MPI_File_close (&file);

    // MPI I/O with chars
    MPI_File_open (
        MPI_COMM_WORLD,     // MPI_Comm comm
        "chars",            // char *filename
    MPI_MODE_CREATE |       // int amode
    MPI_MODE_RDWR,
    MPI_INFO_NULL,          // MPI_Info info
    &file                   // MPI_File *fh
    );
    char buf2 = 'a' + (char)world_rank;
    MPI_File_write_at (
        file,               // MPI_File fh
        offset,             // MPI_Offset offset
        &buf2,              // void *buf
        1,                  // int count
        MPI_CHAR,           // MPI_Datatype datatype
        &status             // MPI_Status *status
    );
    MPI_File_close (&file);


    // Finalize the MPI environment.
    MPI_Finalize();
    return 0;
}

我用chars得到了正确的结果,

> od -c chars
0000000   a   b   c   d
0000004

但是对于整数,只有在np = 0时才有效。对于np&gt; 0,我得到的结果我不明白:

np = 2:

> od -i ints
0000000         256           0
0000005

np = 3:

> od -i ints
0000000      131328           0
0000006

我的代码是错误的,还是&#39; od -i&#39;只是不适合显示带整数的二进制文件?

谢谢,

树里

1 个答案:

答案 0 :(得分:1)

除非您设置了基本类型的文件视图,否则偏移索引实际上是以字节为单位 - 也就是说,默认的etype是单字节。这实际上是非常明智的,但如果在联机帮助页中记录它将会有所帮助。

改变这一行:

MPI_File_write_at (
    file,               // MPI_File fh
    offset,             // MPI_Offset offset

到此:

MPI_File_write_at (
    file,               // MPI_File fh
    offset*sizeof(int), // MPI_Offset offset

为您提供所需的答案:

$ od -i ints 
0000000           0           1           2
0000014

另一方面,如果您只在此文件中使用整数,则更容易设置文件视图:

MPI_File_set_view( file, 0, MPI_INT, MPI_INT, "native", MPI_INFO_NULL);
MPI_File_write_at (
    file,               // MPI_File fh
    offset,             // MPI_Offset offset

也有效。通常,您希望为每个处理器使用不同的文件视图而不是显式偏移。