Стандартът MPI наистина има разпоредби за езикова оперативна съвместимост - целият §16.3 на документа MPI 2.2 е посветен на езиковата оперативна съвместимост между Fortran и C.
§16.3.10 Междуезикова комуникация
Правилата за съответствие на типа за комуникации в MPI anr не са променени: спецификацията на типа данни за всеки изпратен елемент трябва да съвпада, в подписа на типа, със спецификацията на типа данни, използвана за получаване на този елемент (освен ако един от типовете не е MPI_PACKED
). Освен това типът на елемент от съобщението трябва да съответства на декларацията за тип за съответното местоположение на комуникационния буфер, освен ако типът не е MPI_BYTE
или MPI_PACKED
. Междуезикова комуникация е разрешена, ако отговаря на тези правила.
След това се показва пример, при който един и същ конструиран тип данни се използва за изпращане на съобщение от код на Fortran и за получаването му в част от C код. Типът е конструиран така, че да позволи на C кода да получава данните в буфер, който принадлежи на Fortran кода, но това, което е по-подходящо за вашия въпрос е, че C кодът използва тип данни, който е конструиран от Fortran MPI_REAL
. Използването на типове данни Fortran в C функции и обратното е напълно законно, ако има смисъл:
§16.3.6 MPI непрозрачни обекти - типове данни
... Ако тип данни, дефиниран на един език, се използва за комуникационно повикване на друг език, тогава изпратеното съобщение ще бъде идентично на съобщението, което би било изпратено от първия език: има достъп до същия комуникационен буфер и същото представяне преобразуването се извършва, ако е необходимо. Всички предварително дефинирани типове данни могат да се използват в конструктори на типове данни на всеки език. Ако даден тип данни е ангажиран, той може да се използва за комуникация на всеки език.
(предварително дефинирани MPI типове данни като MPI_REAL
и MPI_DOUBLE
са ангажирани)
Напротив, използването на типове данни Fortran от едната страна и C типове данни от другата е разрешено, но се счита за непреносимо:
§16.3.10 Междуезикова комуникация
... Реализациите на MPI могат да отслабят тези правила за съвпадение на типове и да позволят съобщенията да се изпращат с типове Fortran и да се получават с типове C и обратно, когато тези типове съвпадат. Т.е., ако типът Fortran INTEGER
е идентичен с типа C int
, тогава изпълнението на MPI може да позволи изпращането на данни с тип данни MPI_INTEGER
и получаването им с тип данни MPI_INT
. Такъв код обаче не е преносим.
(подчертаването е мое)
Промяната на REAL(8)
на DOUBLE PRECISION
не прави нищо за увеличаване на преносимостта на вашия код, тъй като стандартът Fortran не гарантира нищо относно представянето на типа DOUBLE PRECISION
- той само казва, че DOUBLE PRECISION
е алтернативен спецификатор за един вид тип REAL
, а именно вида с двойна точност, който трябва да има по-голяма десетична точност от реалната по подразбиране. Изпращането на REAL(8)
с тип данни MPI_DOUBLE_PRECISION
не е преносимо. Вместо това една преносима програма би използвала SELECTED_REAL_KIND
присъщия на Fortran заедно с MPI_Type_create_f90_real
, за да регистрира съответстващ MPI тип данни.
Най-добрият вариант IMHO е да разчитате на езиковата оперативна съвместимост между C и Fortran и да се придържате към едни и същи типове данни от двете страни. Тъй като вашият компилаторен пакет е достатъчно нов, можете да използвате механизма ISO_C_BINDING
на Fortran, за да получите REAL
и INTEGER
видове, съвместими с C, и да използвате C типовете данни в извикванията на Fortran. Например:
USE, INTRINSIC :: ISO_C_BINDING
REAL(C_DOUBLE), DIMENSION(10) :: darray
INTEGER(C_INT) :: ival
...
CALL MPI_SEND(darray, 10, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, ierr)
CALL MPI_BCAST(ival, 1, MPI_INT, 0, MPI_COMM_WORLD, ierr)
...
person
Hristo Iliev
schedule
14.08.2012
USE mpi
вместоinclude "mpif.h"
. - person Hristo Iliev   schedule 14.08.2012