#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)
и вы не можете просто передавать случайные целые числа в качестве дескрипторов файлов.