我是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上尝试过,答案是一样的。你有什么想法会发生什么吗?
答案 0 :(得分:1)
该文件可能正确。你所看到的是原始整数,因为它们在记忆中。
因此你打开一个二进制文件并希望在那里看到文字 - 这不会发生。
要么你需要一些东西来将整数(它们只是字节与它们存储在内存中的值)转换为文本(这是一个字节序列,其中每个字节代表一个字符,而这又可能代表一个字符十进制数字。)
说真的,这是一个非常基本的概念,在处理MPI之前,你应该对这些事情稍微熟悉并编写一般的C代码,这对于那些熟悉程序如何工作的程序员来说真的很有用。一台机器。
答案 1 :(得分:0)
MPI-IO的整个概念建立在二进制数据结构之上,因此文件中的每个基本记录具有相同的大小,并且计算任意记录的文件偏移量是微不足道的。文本输出不是这种情况。例如,如果工作在两个进程之间被分成两半,则在知道前半部分的文本表示将会持续多长时间之前,不能编写文件的后半部分。这可以防止并行写入两个部分,这就是MPI-IO的用途。
要缓解它:
或
%10d
作为格式说明符,然后使用MPI_CHAR
作为MPI-IO的基本类型。根据价值范围,这可能会导致大量浪费的空间或
cat output_0 output_1 output_2 ... > output
。