Я хочу транслировать непрерывные переменные, не связанные с памятью (INTEGERS и REAL(8)) из моего основного процесса во все остальные процессы в реализации MPI FORTRAN90, но поскольку это моя первая попытка как на FORTRAN, так и на MPI (я привык только к C/ C++), у меня есть несколько вопросов:
В настоящий момент я использую вызов MPI_TYPE_CREATE_STRUCT, но знаю, что могу также использовать вызовы MPI_PACK/MPI_UNPACK, которые требуют дополнительных операций копирования из памяти в память. Поскольку объем передаваемых данных в этом случае невелик, какое решение предлагает наилучшие характеристики? Есть ли какое-либо другое решение, которое я не знаю и которое быстрее/проще реализовать (может быть, один вызов MPI_BCAST для каждой переменной?)?
В случае пользовательского типа данных MPI, как мне объявить переменную (или здесь группу переменных известного типа данных) только одной переменной нового типа данных? Я имею в виду, что теперь, когда моя структура MPI PARAMETER_READ создана (см. код ниже), как мне сообщить компилятору, что я хочу, чтобы все мои переменные (nmin, dout, nmax, ncellsmax, ncells, ns, dt, del) хранились в памяти сгруппироваться все вместе, чтобы стать только одной новой переменной типа PARAMETER_READ?
Где я могу объявить свои пользовательские типы данных? Должен ли я объявить их внутри a:
ЕСЛИ(ранг==0) ТО
объявление нового типа данных
КОНЕЦ
петля или снаружи?
Вот мой код (я сохранил только интересные части):
PROGRAM SIM_3D
USE IO
USE MPI_MOD
IMPLICIT NONE
INTEGER :: nmin, dout, nmax, ncellsmax
INTEGER, DIMENSION(3) :: ncells, ns
REAL(8) :: dt,
REAL(8), DIMENSION(3) :: del
CALL init_MPI
IF(rank == master) THEN
CALL readParams(ncells, del, nmin, dout, nmax, dt, ns, ncellsmax) ! All these values are read by the master process in an external *.txt file using a custom subroutine readParams in the IO module.
CALL BCAST_PARAM
ENDIF
END PROGRAM SIM_3D
Где MPI_MOD:
MODULE MPI_MOD
USE MPI
INTEGER, PARAMETER :: master = 0
INTEGER :: ierror, rank, num_proc
INTEGER, DIMENSION( MPI_STATUS_SIZE ) :: status
INTEGER :: NUMBER_OF_BLOCKS = 2
INTEGER, DIMENSION(2) :: ARRAY_OF_BLOCKLENGTHS = (/ 10, 4/)
INTEGER, DIMENSION(2) :: ARRAY_OF_DISPLACEMENTS = (/ 40, 32/)
INTEGER, DIMENSION(2) :: ARRAY_OF_TYPES = (/ MPI_INTEGER, MPI_REAL/)
CONTAINS
SUBROUTINE init_MPI
IMPLICIT NONE
CALL MPI_INIT(ierror)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,num_proc,ierror)
END SUBROUTINE init_MPI
SUBROUTINE BCAST_PARAM
IMPLICIT NONE
CALL MPI_TYPE_CREATE_STRUCT(NUMBER_OF_BLOCKS, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, ARRAY_OF_TYPES, PARAMETER_READ, IERROR)
CALL MPI_TYPE_COMMIT (PARAMETER_READ, IERROR)
*I would like to put all the variables to be sent in a PARAMETER_READ type variable called BUFFER*
CALL MPI_BCAST(BUFFER,1,PARAMETER_READ,master,MPI_COMM_WORLD,IERROR)
END SUBROUTINE BCAST_PARAM
END MODULE MPI_MOD
Я даже не уверен, что мое собственное объявление типа данных правильное... Большое спасибо за то, что прочитали меня, ваша помощь будет очень признательна. С наилучшими пожеланиями.
MPI_BCAST
, поэтому я хочу «упаковать» — или что-то эквивалентное — данные только в одном переменная, которую можно использовать вMPI_BCAST
. В таком случае, почему вы не рекомендуете использовать пользовательский тип данных MPI сMPI_TYPE_CREATE_STRUCT
? - person Pierre Renard   schedule 22.08.2014MPI_CREATE_DARRAY
для передачи каждому узлу трехмерного массива, созданного из части большего исходного трехмерного массива, который содержит данные, которые он должен обращаться. Как только мой пользовательский тип данных MPI создан, как мне его использовать и объявить все мои подмассивы? На самом деле я не знаю, как использовать пользовательские типы данных MPI после их создания, как воздействовать на значения переменных этого нового типа. - person Pierre Renard   schedule 22.08.2014PARAMETER_READ
в вашем вопросе, вам также необходимо создать эквивалентный производный тип Fortran - этоparameter_read_type
в моем ответе. Fortran не знает о типе данных MPI, а MPI не знает о типе Fortran, поэтому вы должны использовать их вместе. Вы объявляете переменную Fortran какparameter_read_type
, присваиваете свои данные ее компонентам, затем можете использоватьMPI_BCAST
сPARAMETER_READ
для передачи ее остальным процессам. - person Yossarian   schedule 22.08.2014ARRAY_OF_DISPLACEMENTS = (/ 40, 32/)
должно бытьARRAY_OF_DISPLACEMENTS = (/ 0, 40/)
. - person Yossarian   schedule 22.08.2014MPI_TYPE_CREATE_DARRAY
, например, «подмассив», И объявить стандартный массив Fortran, например, «буфер», того же размера? Тогда я смогуMPI_BCAST(buffer,1,subarray,master,cartesian_comm,ierror)
- person Pierre Renard   schedule 25.08.2014MPI_CART_COORD
, но я пока не могу скомпилировать свой код, потому что он все еще неполный и содержит некоторые ошибки. Спасибо за помощь. Кстати, спасибо, что заметили ошибку. - person Pierre Renard   schedule 25.08.2014