Ошибка ввода-вывода MPI с MPI_File_seek (без конкретной подпрограммы)

#ubuntu #mpi #gfortran #openmpi

#ubuntu #mpi #gfortran #openmpi

Вопрос:

в настоящее время я изучаю ввод-вывод MPI. Как следствие, я борюсь со следующим примером:

 PROGRAM simple_write 
USE mpi 
IMPLICIT NONE
INTEGER :: rank, nproc, ierr
INTEGER, ALLOCATABLE :: offsets(:)
INTEGER :: file_handle,my_offset
CHARACTER(len=50) :: outstr 

CALL MPI_Init(ierr) 
CALL MPI_Comm_size(MPI_COMM_WORLD, nproc, ierr) 
CALL MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr) 
!Delete the existing file
CALL MPI_File_delete('out.txt', MPI_INFO_NULL, ierr) 
CALL MPI_File_open(MPI_COMM_WORLD, 'out.txt', MPI_MODE_WRONLY   MPI_MODE_CREATE, MPI_INFO_NULL, file_handle, ierr) 

ALLOCATE(offsets(nproc))

WRITE(outstr,'(A,I3,A)') "Hello from processor ", rank 


CALL MPI_Allgather(LEN(TRIM(outstr)), 1, MPI_INTEGER, offsets, 1, MPI_INTEGER, MPI_COMM_WORLD, ierr)

my_offset =SUM(offsets(1:rank))

CALL MPI_File_seek(file_handle, my_offset, MPI_SEEK_SET, ierr)

CALL MPI_File_write(file_handle, TRIM(outstr), LEN(TRIM(outstr)), MPI_CHARACTER, MPI_STATUS_IGNORE, ierr) 
!Close the file
CALL MPI_File_close(file_handle, ierr) 
CALL MPI_Finalize(ierr) 
END PROGRAM simple_write
 

Я использую gfortran и OpenMPI.

Когда я его компилирую, я получаю следующую ошибку:

 Error: There is no specific subroutine for the generic ‘mpi_file_seek’ at (1)
 

Я не могу это понять. Что-то связано со старой версией OpenMPI в моем дистрибутиве Ubuntu?

Спасибо

Комментарии:

1. Вы используете неправильный тип для смещения. Оно должно быть `INTEGER(KIND=MPI_OFFSET_KIND)`

2. Это прекрасный пример того , как модуль MPI останавливает вас от неправильного вызова подпрограммы и получения тихих и трудных для отладки ошибок , с которыми вы могли бы include "mpif.h" столкнуться .

3. Еще лучше, use mpi_f08 если, если поддерживается вашей реализацией MPI, file_handle аргумент должен быть завернут, TYPE(MPI_File) и вы не можете просто передавать случайные целые числа в качестве дескрипторов файлов.