Не могу прочитать файл с Mpi_File_Read - PullRequest
0 голосов
/ 04 мая 2018

Я надеюсь, что кто-то может мне помочь. Я пишу в Fortran 90 с библиотеками MPI. Я пытаюсь читать файлы параллельно (с помощью функции Mpi_File_Read), но не могу. Вот простой код, который демонстрирует проблему:

    program Read_And_Write
    implicit none
    include "mpif.h"
    integer, parameter :: N = 16
    integer            :: i, this_proc, file_handle, error
    integer            :: read_data(N)
    integer            :: status(MPI_STATUS_SIZE)
    character(len=13)  :: file_name = 'one_array.dat'

    ! Start MPI run
    call Mpi_Init(error)
    call Mpi_Comm_Rank(MPI_COMM_WORLD,  &  ! integer comm
                       this_proc,       &  ! integer rank
                       error)              ! integer error

    ! Create a file from one processor, hence "sequentially"
    if(this_proc .eq. 0) then
      open(9, file=file_name, form='unformatted')
      do i = 1, N
        write(9) i*N
      end do
      close(9)
    end if

    ! Open the same file in MPI mode
    call Mpi_File_Open(MPI_COMM_WORLD,   &  ! integer comm
                       file_name,        &  ! character filename(*)
                       MPI_MODE_RDONLY,  &  ! integer amode
                       MPI_INFO_NULL,    &  ! integer info
                       file_handle,      &  ! integer file handle
                       error)               ! integer error

    ! Read the file in MPI mode
    call Mpi_File_Read_All(file_handle,  &  ! integer file handle
                           read_data,    &  ! buffer 
                           N,            &  ! integer count
                           MPI_INTEGER,  &  ! integer datatype 
                           status,       &  ! integer status
                           error)           ! integer error

    ! Write out what you got
    do i = 1, N
      print *, 'read: ', read_data(i)
    end do

    ! End MPI run
    call Mpi_Finalize(error) 

    end program

Любые намеки или идеи, что я здесь не так делаю?

Я использую gfortran 5.4.0 с MPICH 3.2 на Xubuntu 16.04.09

Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Неформатированные последовательные файлы Fortran не совместимы с вводом / выводом MPI. Файлы ввода / вывода MPI совместимы с файлами потокового доступа, которые работают аналогично вводу / выводу языка Си.

Просто изменить

  open(9, file=file_name, form='unformatted')

до

  open(9, file=file_name, access="stream", form='unformatted')

И результат будет:

 read:           16
 read:           32
 read:           48
 read:           64
 read:           80
 read:           96
 read:          112
 read:          128
 read:          144
 read:          160
 read:          176
 read:          192
 read:          208
 read:          224
 read:          240
 read:          256

В последовательных файлах Fortran используются дополнительные маркеры записи, которые чтение MPI I / O не ожидает (например, Неформатированный формат файла Fortran ). Вы должны будете сделать специфичный для компилятора тип данных MPI, чтобы избежать маркеров записи. Не стоит этого делать, если не нужно.

...