Bizzare MPI输出

时间:2016-01-09 17:28:58

标签: c mpi

我是MPI编程的新手,现在我正在使用示例程序来研究MPI I / O的基础知识。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define BUFSIZE 10

int main(int argc, char **argv) {
    int myrank, size;
    MPI_File thefile;
    int i;
    int buf[BUFSIZE];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);

    for (i=0; i<BUFSIZE; i++)
            buf[i] = myrank * BUFSIZE + i;
    MPI_File_open(MPI_COMM_WORLD, "testfile",
                  MPI_MODE_CREATE | MPI_MODE_WRONLY,
                  MPI_INFO_NULL, &thefile);
    MPI_File_set_view(thefile, myrank * BUFSIZE * sizeof(int),
                      MPI_INT, MPI_INT, "native",
                      MPI_INFO_NULL);
    MPI_File_write(thefile, buf, BUFSIZE, MPI_INT,
                   MPI_STATUS_IGNORE);
    MPI_File_close(&thefile);
    MPI_Finalize();
    return 0;

}

这是一个输出:

^@^@^@^@^A^@^@^@^B^@^@^@^C^@^@^@^D^@^@^@^E^@^@^@^F^@^@^@^G^@^@^@^H^@^@^@        ^@^@^@
^@^@^@^K^@^@^@^L^@^@^@^M^@^@^@^N^@^@^@^O^@^@^@^P^@^@^@^Q^@^@^@^R^@^@^@^S^@^@^@

我使用的编译器是Scientific Linux SL 6.0版上的mpich2。我也在Ubuntu 14.04上尝试过,答案是一样的。你有什么想法会发生什么吗?

2 个答案:

答案 0 :(得分:1)

该文件可能正确。你所看到的是原始整数,因为它们在记忆中。

因此你打开一个二进制文件并希望在那里看到文字 - 这不会发生。

要么你需要一些东西来将整数(它们只是字节与它们存储在内存中的值)转换为文本(这是一个字节序列,其中每个字节代表一个字符,而这又可能代表一个字符十进制数字。)

说真的,这是一个非常基本的概念,在处理MPI之前,你应该对这些事情稍微熟悉并编写一般的C代码,这对于那些熟悉程序如何工作的程序员来说真的很有用。一台机器。

答案 1 :(得分:0)

MPI-IO的整个概念建立在二进制数据结构之上,因此文件中的每个基本记录具有相同的大小,并且计算任意记录的文件偏移量是微不足道的。文本输出不是这种情况。例如,如果工作在两个进程之间被分成两半,则在知道前半部分的文本表示将会持续多长时间之前,不能编写文件的后半部分。这可以防止并行写入两个部分,这就是MPI-IO的用途。

要缓解它:

  • 在一个进程中收集信息并在那里执行常规(POSIX)格式化的I / O

  • 使用固定宽度数字字段,例如在构建中间字符数组时,使用%10d作为格式说明符,然后使用MPI_CHAR作为MPI-IO的基本类型。根据价值范围,这可能会导致大量浪费的空间

  • 将每个排名输出到单独的文件,然后使用常规文件粘贴机制连接文件,例如, cat output_0 output_1 output_2 ... > output