我尝试使用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;只是不适合显示带整数的二进制文件?
谢谢,
树里
答案 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
也有效。通常,您希望为每个处理器使用不同的文件视图而不是显式偏移。