Эта руководитель обрисовывает трудности, отчасти способные поспешно вставать при применении MPI в програмке на ФОРТРАН. Конечно, эта руководитель - совет юзерам - окончательно объясняет, как MPI глубоко трудится с ФОРТРАН. Впрочем, это не прибавление к эталону, а егообъяснение.
Как было замечено в главной спецификации MPI , интерфейс строго не соблюдает стереотипы несколькими маршрутами. Значит это вызывало некие трудности в програмках наязыке ФОРТРАН77 и стало наиболее в общем-то важным для программ на ФОРТРАН90, потомуюзеры обязаны быть попросту осмотрительны при применении ненамного свежих полномочий ФОРТРАН90. Возможно, эти нарушения вначале были адаптированы, хотя после чего возвращены ссвязи их значимостью для способности применения MPI . Кроме того остальная часть даннойруководители отчетливо оговаривает налицо вероятные трудности. Казалось, она добровольно замещает дискуссияпривязок ФОРТРАН однозначно неординарной спецификации MPI (для ФОРТРАН90, хотя не ФОРТРАН77). Итак, налицо последующие способности MPI несовместимыс ФОРТРАН90:
MPI-1 лично имеет немного функций, которые дорого берут address-sized информацию на входе и прекрасно отдают ее на выходе. Разумеется в Си эти доводы имелитип MPI_Aint ну а в ФОРТРАН вид INTEGER . Однако, на тех машинках, где целые количества менее адресов, данные функции лично имеют все шансы утратить информацию. Во всяком случае в MPI-2 внедрение этих функций не рекомендуется и они были измененыфункциями, совершенно получающими доводы INTEGER вида KIND=MPI_ADDRESS_KIND. Быть может множество по-хорошему свежих функций MPI-2 кроме тогополучают доводы INTEGER с KIND по умолчанию. Наконец, см. главу 1.6.
Проблемы в связи твердого определения типов. Все функции MPI саргументами выбора сравнивают настоящие доводы особенно всевозможных типов ФОРТРАНa содним и этим же столь фиктивным доводом. Кажется, это не допускалось ФОРТРАН77, ну а в ФОРТРАН90 возможно исключительно в случае перегрузки функции для любого на подобии. Надеюсь в Си данные трудности решались применением вправду формального довода void* .
Таким образом, этот часть технически неверен и правильно сможет вызвать оплошность в периодкомпиляции:
integer i(5) real x(5) … call mpi_send(x, 5, MPI_REAL, …) call mpi_send(i, 5, MPI_INTEGER, …) На практике, компиляторы не часто правильно делают что-нибудь не считая выдачи предотвращения, желаяговорят, что компиляторы ФОРТРАН90 наверное вернут оплошность.
Так ведь для ФОРТРАНa технически просто-напросто недопустима предоставление скалярного довода ввиде массива. Поэтому, ненамного последующий часть кода лично имеет возможность вызвать погрешность, ибодовод buf для MPI_SEND торжественно оглашен как assumed-size массив на подобии buf(*) .
Совет юзерам: В случае, коль скоро вы неожиданно наткнулись на 1 из задач, связанных с проверками типов, у вас есть возможность счастливо отделаться от нее, правильно используя флаг компилятора, компилируя по отдельности либо правильно используя реализацию MPI с расширеннойподдержкой ФОРТРАНa, как подробно описано в главе 8.2.4. Так вот, в качестве кандидатуры, коя будет специально трудиться мало-мальски с переменными, тихо являющимися по-старому локальными по отношению сфункции (хотя не к доводам функции) применяют по-хорошему ключевое слово EQUIVALENCE для творения иной очень-очень переменной с типом, слишком применимым для компилятора.[]
Проблемы, связанные с копированием этих и последовательностями. В MPI окончательно заложена по-своему неявная мысль того, что налицо постоянный кусочек памяти доступенчерез в целом линейное попросту адресное место. MPI копирует эти в память и изнее. Кстати, программа MPI подробно описывает месторасположение памяти серьезно предоставляя адреса исмещения в памяти. Пожалуй, в языке Си верховодила ассоциациипоследовательностей и указатели внимательно предполагают всю низкоуровневую текстуру.
В ФОРТРАН90 эти юзера не очень нужно находятся постоянно. Например, кусочек массива A(1:N:2) включает исключительно составляющие массива A с индексами 1,3,5,…. Вероятно, то ведь объективно и для массивов указателей, которыессылаются на таковой кусочек. Говорят, большинство компиляторов постараются, чтоб массив вкачестве по-хорошему фиктивного довода располагался довольно-таки в нескончаемой памяти раз он торжественно оглашен сявным объемом (к примеру, B(N) ) или же крайне имеет assumed size (к примеру, B(*) ). В конце концов, если нужно, они слепо продадут данное копированием массива в постояннуюпамять. В общем и ФОРТРАН77, и ФОРТРАН90 оговорены дозволять это копирование, хотянемногие компиляторы ФОРТРАН90 данное нарочно делают. Наверно, технически, стереотипы ФОРТРАН обязаны разрешать содержать массивы во фрагментированной памяти.
Так как фиктивные буферные доводы MPI - assumed-size arrays, что и ведет к суровымдилеммам с неблокирующими вызовами: компилятор в последствии возврата копирует кратковременныймассив обратно, а MPI охотно продолжает копировать эти в память, содержавшуюего. Например, вправду последующий часть:
Так как 1 довод для MPI_IRECV - assumed-size array ( buf(*) ), секциямассива a(1:100:2) перед передачей MPI_IRECV копируется во по-старому кратковременный массив взаправду в нескончаемой памяти. MPI_IRECV ворачиваетсянезамедлительно и эти копируются обратно в массив a . К счастью, позже MPI спокойно сможет постепенно начать запись по адресам скромно освобожденной памяти. В самом деле копированиетакже относительно считается задачей и для MPI_ISEND , потому что однозначно кратковременная память быть можетосвобождена до того, как все эти станут оттуда добросовестно переданы.
Большинство компиляторов ФОРТРАН90 Нарочно не делают копию, коль скоро довод полностьюсчитается массивом определенной формы, assumed-size array либо “по-человечески обычный” секцией (к примеру, A(1:N) ) очень-то похожего массива. (Понятие “напросто незатейливый” секции мы определим мало-мальски в последующем параграфе). Видимо также, многие компиляторы тут интерпретируют особенно динамические (allocatable) массивы поистине аналогично, как имассивы определенной формы (разумно желая нам по-особенному именит 1, который так добровольно не делает). Тем более, все серьезно обстоит вовсе не так дляassumed-shape и массивов указателей; т.к. им предоставляется возможность быть фрагментированы, часто быстро выполняется копирование. Действительно это тот вариант, который вызывает трудности с MPI , как подробно описано в прошлом параграфе.
“Простая” секция массива де-юре ориентируется так:
name ( [:,]… []:[] [,]… ) Это означает, умышленно присутствует ноль или же наиболее измерений, которые долго выбираются полностью, после этого одно измерение добровольно избираемое в отсутствии шага, после этого ноль либо наиболее измерений, избираемыхобычным индексом. По-видимому примеры: A(1:N), A(:,N), A(:,1:N,1), A(1:6,N), A(:,:,1:N) Благодаря направленному по колонкам индексированию ФОРТРАН, где 1 -ыйиндекс постоянно меняется скорее, очень несложная секция массива кроме того станет в общем-то постоянной. 1
Та ведь неувязка быть может и с в случае со скалярным доводом. Более того некоторые компиляторы, в том числе и для ФОРТРАН77 обычно делают копию неких скалярных доводов поумолчанию в вызванной упражнению. С другой стороны это крайне имеет возможность вызвать делему, проиллюстрированнуюв взаправду последующем образце:
call user1(a,rq) call MPI\_WAIT(rq,status,ierr) write (*,*) a subroutine user1(buf,request) call MPI\_IRECV(buf,…,request,…) end
Если a скопировано, MPI_IRECV опосля окончания взаимосвязи изменит копиюи не изменит само a .
Заметьте, что копирование практически непременно суждено случится для довода, которыйпредставляет налицо нетривиальное выражение (по крайней мере, одним оператором либо вызовомфункции), секцией, Разумно не избирающей по-старому нескончаемую часть очень-то собственного праотца (к примеру, A(1:n:2) ), указатель, чья гиперссылка - этовыражение, либо массив слишком неявной формы, который ( напрямиклибо косвенно) ассоциируется с таковой секцией.
Если есть функция компилятора, воспрещающая копирование доводов при вызовах ивозвратах операций, она обязана быть интегрирована.
Если компилятор делает копии при вызове упражнений для доводов, являющихсямассивами определенной формы или же assumed-size arrays, несложныхсекций этих массивов, скаляров, и у компилятора нет настроек, воспрещающих данное, он Лично не имеет возможности быть применен а прибавлениях, правильно использующих MPI_GET_ADDRESS , или же поистине всевозможные неблокирующие функций MPI . Короче говоря, если компилятор копирует скалярныеаргументы в вызванной упражнению и нет настройки, воспрещающей данное, таковой компиляторне быть может принят на вооружение в прибавлениях, правильно использующих гиперссылки на память межвызовами упражнений как в указанном случае.
Особые константы. MPI настоятельно совершенно просит набор в целом специальных “констант”, которые Лично не имеют возможности быть слепо проданы как в целом обычные константы языка ФОРТРАН, в томчисле MPI_BOTTOM, MPI_STATUS_IGNORE,
MPI_IN_PLACE, MPI_STATUSES_IGNORE и MPI_ERRCODES_IGNORE . Напротив в языке Си данноепродано как константные указатели, особенно традиционно NULL , и применяютсятам, где образец регулярно получает указатель полностью на переменную, но не саму столь переменную.
Оказалось, что в ФОРТРАН реализация этих налицо специальных констант лично имеет возможность настоятельно мысленно попросить применениесистем, выходящих за границы эталона ФОРТРАН. Ну что ж использование специальныхзначений для констант (к примеру, определение их через довольно-таки ключевое слово parameter ) кроме того нельзя, т.к. реализация лично не имеет возможности мысленно отличить данные ценностиот отчасти обычных этих. Обычно данные константы резко отнесены как предопределенныестатические вполне переменные (к примеру, совсем переменная, очень-очень явная предварительно в заявленном в MPI блоке COMMON ), окончательно надеясь на то, что компилятор передает эти поадресу. А теперь внутри упражнения адресок быть может предварительно получен неким приспособлением зарамками эталона ФОРТРАН (к примеру, расширениями ФОРТРАНa или же реализациейэтой функции на Си).
Порожденные разновидности ФОРТРАН90 . MPI не поддерживает определенно передачупорожденных типов ФОРТРАН90 однозначно фиктивным доводам с выбором. Естественно, и по правде, для реализаций MPI, сильно предоставляющих определенные интерфейсы через модуль mpi , компилятор решительно отвергнет таковой вид еще в период компиляции. Стало быть даже как скоро определенныеинтерфейсы не даются, юзеры обязаны самостоятельно знать, что ФОРТРАН90 мешаетгарантии ассоциации очередности для высоко порожденных типов. Например, массивпорожденных типов, состоящих из 2 составляющих быть может слепо продан как массивпервых частей, за коим немедленно надлежит массив вторых деталей. В сущности здесь крайне имеет возможность посодействоватьвнедрение атрибута SEQUENCE .
Следующий часть указывает 1 из поистине вероятных путей передачи высоко порожденных типовв ФОРТРАН. И все же пример самостоятельно представляет, что эти передаются в адрес.
type mytype integer i real x double precision d end type mytype type(mytype) foo integer blocklen(3), type(3) integer(MPI\ADDRESS_KIND) disp(3), base call MPI_GET_ADDRESS(foo%i, disp(1), ierr) call MPI_GET_ADDRESS(foo%x, disp(2), ierr) call MPI_GET_ADDRESS(foo%d, disp(3), ierr) base = disp(1) disp(1) = disp(1) - base disp(2) = disp(2) - base disp(3) = disp(3) - base blocklen(1) = 1 blocklen(2) = 1 blocklen(3) = 1 type(1) = MPI_INTEGER type(2) = MPI_REAL type(3) = MPI_DOUBLE_PRECISION call MPI_TYPE_CREATE_STRUCT(3, blocklen, disp, type, newtype, ierr) call MPI_TYPE_COMMIT(newtype, ierr) ! не очень превосходно пересылать foo%i заместо foo, хотя для скалярных! объектов вида mytype данное спокойно действуетcall MPI_SEND(foo%i, 1, newtype, …) Проблемы с регистровой оптимизацией. MPI лично имеет операции, которые лично имеют все шансы быть скрыты от кода юзера и осуществляться вдоль сним, с доступом к такой же памяти, что и код юзера. Несомненно примеры включают передачуданных для MPI_IRECV . Следовательно оптимизатор компилятора считает, что у него есть возможностьнайти периоды, как скоро копия очень переменной правильно сможет самостоятельно присутствовать в регистре в отсутствии перезагрузкииз памяти либо записи в нее. И действительно когда программа юзера глубоко трудится с регистровойкопией, а достойно спрятанная операция окончательно трудится с памятью, поспешно встает неувязка. Так или иначе эта руководительобговаривает подводные камешки регистровой оптимизации.
Когда переменная для упражнения ФОРТРАНa резонно считается более-менее локальной ( другими словами не модульили блок COMMON ), компилятор считает, что она лично не имеет возможности быть измененавызванной операцией, когда данное мало-мальски не настоящий довод вызова. Видите ли в болеепопулярной конвенции компоновщика от упражнения предполагается, что она сохранит и реконструирует вполне явные регистры. Поэтому, оптимизатор станетнадеяться, что регистр, содержавший ненамного правильную копию таковой попросту переменной до вызовабудет содержать ее и при возврате.
Обычно данное не оказывает большое влияние на юзеров. Но если же в програмке юзерабуферный довод для MPI_SEND, MPI_RECV и другие. примет на вооружение фамилия, котороескрывает в общем-то натуральный довод, юзер обязан почтительно направить свой взгляд на данную главу. По крайней мере один из образцов - MPI_BOTTOM с MPI_Datatype , содержащимабсолютный адресок. Оказывается другой прием - существо на подобии этих, который применяет 1 очень-то переменную как метку и осторожно действует с иными правильно используя MPI_GET_ADDRESS дляопределения их смещения от просто-напросто ловки. Тем не менее переменная-метка станет более-менее единственной, осторожно упомянутой в вызове. Собственно также особенно идет уделить внимание случаю, как скоро применяютсяте операции MPI , которые производятся вдоль прибавлению юзера.
Следующий образчик демонстрирует, что особенно допустимо обычно делать компиляторам ФОРТРАН.
Этот начальный код … быть может скомпилирован как: call MPI_GET_ADDRESS(buf, call MPI_GET_ADDRESS(buf,…) bufaddr, ierror) call MPI_TYPE_CREATE_STRUCT(1, call MPI_TYPE_CREATE_STRUCT(…) 1,bufaddr, MPI_REAL,type, error) call MPI_TYPE_COMMIT(type, call MPI_TYPE_COMMIT(…) ierror) val_old = buf register = buf val_old = register call MPI_RECV(MPI_BOTTOM,1, call MPI_RECV(MPI_BOTTOM,…) type,…) val_new = buf val_new = register
Компилятор не отмечает регистр недействительным, потому что крайне не имеет возможности вычислитьперемена ценности buf функцией MPI_RECV . И в самом деле доступ к buf сокрыт применением MPI_GET_ADDRESS и MPI_BOTTOM .
Следующий образчик иллюстрирует экстремальные, хотя свободно разрешенные способности.
Исходный код скомпилирован как или же как: call MPI_IRECV(buf, call MPI_IRECV(buf, call MPI_IRECV(buf, ..req) ..req) ..req) register = buf b1 = buf call MPI_WAIT(req,..) call MPI_WAIT(req,..) call MPI_WAIT(req,..) b1 = buf b1 := register
MPI_WAIT Слишком в параллельном потоке изменяет buf меж вызовом MPI_IRECV и окончанием MPI_WAIT . Но компилятор не видитвозможности конфигурации buf опосля возврата MPI_IRECV и сможетзагрузить buf ранее, нежели предписано воистину в начальном коде. Между прочим он хладнокровно не видит обстоятельств неиспользовать регистр для сохранения buf до вызова MPI_WAIT . Наоборот он кроме того правильно сможет заменить порядок следования операций, как в случае справа.
Мало того для избегания конфигурации около команд либо сбережения буфера в регистре естьдве способности возведения реализации кроссплатформенного кода на ФОРТРАН:
В будущем, атрибут VOLATILE рассматриваетсядля ФОРТРАН2000 и обязан станет долго дать буферу либо по-старому переменной нужныехарактеристики, хотя он станет уничтожать регистровую оптимизацию для хоть какого кода, содержащего буфер либо налицо переменную.
В языке Си, функции, которые лично имеют все шансы слепо поменять очень-то переменные, Быстро не являющиеся ееаргументами не станут продиравшаяся. Короче, это так, потому что получение указателей на объекты сохранения правильно используя оператор & и следующие гиперссылки на объект с внедрением указателя - часть языка. По правде говоря, компилятор Си знает таковой подтекст, потому, в целом случае трудностибыть не может. А кроме того тем минимум, есть компиляторы с опциональной брутальнойоптимизацией, которые крайне имеют все шансы быть не настолько по-человечески не опасны.
Next: Основная поддержка ФОРТРАНa Up: Поддержка языка ФОРТРАН Previous: Обзор   Contents
Вы должны быть зарегистрироавны чтобы оставить комментарий.