使用每个mpi进程的不同视图在文件上写入

时间:2015-06-02 17:13:59

标签: c view io mpi

我试图在文件上写入不同的矩阵,每个矩阵由不同的MPI进程处理,如下图所示,对其内容进行合并:

enter image description here

有什么办法可以使用合适的MPI-View获得所需的输出? 为了帮助回答这个问题,我附上了一个简单的代码 在上一个图像中,白色列也包含在输出文件中。

#include <mpi.h>
#define N 6

int main(int argc, char **argv) {

  double A[N*N];
  int mpi_rank, mpi_size;

  MPI_File file;
  MPI_Status status;    

  MPI_Init(NULL, NULL);
  MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);

  MPI_File_open(MPI_COMM_WORLD, "test.dat",  MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file);

  MPI_Datatype my_type;
  MPI_Type_vector(N, N, N*mpi_size, MPI_DOUBLE, &my_type);
  MPI_Type_commit(&my_type);

  MPI_Offset disp = mpi_rank*N*sizeof(double);
  MPI_File_set_view(file, disp, MPI_DOUBLE, arr_type, "native", MPI_INFO_NULL);

  MPI_Datatype row_type;
  MPI_Type_contiguous(N, MPI_DOUBLE, &row_type);
  MPI_Type_commit(&row_type);

  MPI_File_write(file, A, N, row_type, &status);

  MPI_File_close(&file);
  MPI_Finalize();

  return 0;
}

1 个答案:

答案 0 :(得分:1)

我很欣赏你的行业重新发明MPI_TYPE_SUBARRAY,但你肯定可以这样做而不是创建重叠矢量?

你是如此亲密。为了省略输出中的ghost单元格,我只想定义一个不描述它们的子数组内存类型。

我认为可以用N-1代替N来完成矢量块长度...但只需使用子阵列并使其更清晰。很久以前,像这样的矢量确实是惯用的MPI,但MPI-2在1995年引入了子阵列类型,所以我认为你可以使用这个&#34; newfangled&#34;特征

您确实可以使用offset参数移动文件视图。您也可以让每个文件从偏移0开始,而不是改变子文件中的参数。所有过程都将具有相同的&#34;全局数组&#34;值。你可以为每个处理器调整start []和可能的count []。