首页 > 解决方案 > 如何使用 MPI 使用自定义子数组数据类型从文件中读取子数组?

问题描述

我有 10 GB 文件,它包含数组数据,我想从文件中读取子数组。我想将 MPI_File_read_at 与子数组自定义 MPI 数据类型一起使用。我是 MPI 的新手。如果我使用 MPI 读取子数组还是应该使用 POSIX 读取,我会得到什么好处吗?

  program read_mpi
     implicit none
     include "mpif.h"
     integer provided, ierr, psize, rank, filetype,i
     integer fh
     integer array(2,2)
     integer(kind=MPI_OFFSET_KIND) zero_off
     integer gsize(2)
     integer subsize(2)
     integer starts(2)
     integer :: status(MPI_STATUS_SIZE)
     gsize(1) = 4
     gsize(2) = 4
     subsize(1) = 2
     subsize(2) = 2
     starts(1) = 0
     starts(2) = 0

  call MPI_Init_thread(MPI_THREAD_SINGLE, provided, ierr)
  call MPI_Comm_size(MPI_COMM_WORLD, psize, ierr)
  call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)

  if(rank .eq. 1) then
    starts(1) = 2
    starts(2) = 0
    ! zero_off = 8
  endif

  if(rank .eq. 2) then
    starts(1) = 0
    starts(2) = 2
    ! zero_off = 32
  endif

  if(rank .eq. 3) then
    starts(1) = 2
    starts(2) = 2
    ! zero_off = 40
  endif

  call mpi_type_create_subarray(2, gsize, subsize, starts,
 & mpi_order_fortran, MPI_Integer, filetype, ierr)
  call mpi_type_commit(filetype,ierr)

  call MPI_File_open(MPI_COMM_WORLD,"testfile",MPI_MODE_RDONLY,
 &  MPI_INFO_NULL,fh,ierr)
  
  zero_off = 0
  ! reading subarray form file with particular offset.
  call mpi_file_read_at(fh,zero_off,array(1,1),1,
 & filetype,status, ierr)

  write(*,*)array(:,:)

  call MPI_File_close(fh,ierr)
  call MPI_Finalize(ierr)
  end

数组没有按预期获得值。

测试文件:0 1 2 3 4 5 6 7 8 .....测试文件是二进制文件

od -i testfile
0000000           0           1           2           3
0000020           4           5           6           7
0000040           8           9         100         101
0000060         102         103         104         105
0000100         106         107         108         109
0000120         200         201         202         203
0000140         204         205         206         207
0000160         208         209         300         301
0000200         302         303         304         305
0000220         306         307         308         309
0000240

数组 0 1 1312413 13412341 的结果

我想要等级 0 的 0 1 4 5 和等级 1 的 2 3 6 7。

测试文件:https ://drive.google.com/file/d/16vsaBHUWu1VKw_8qR3K6XJ_ya3i0EivW/view?usp=sharing

代码: https ://drive.google.com/file/d/126WyKVpixWozGKO3UPxwDXUKKmbT3rbK/view?usp=sharing

标签: filefortranmpi

解决方案


推荐阅读