СКИПОДы 2007 полная версия (1127795), страница 45
Текст из файла (страница 45)
Реализации могут иметь расширенное толкование семантики, в частности,допускать использование функций типа TASKID в позициях переменных этого типа.Некоторые реализации могут запрещать в операторах приема сообщений неявные циклы,управляемые параметром, находящимся в этом же списке ввода. Так, в Фортране МВКзапрещены такие конструкции: RECEIVE (<..>) N, (KM(I),I=1,N)Асинхронный режим передачи сообщенийИспользование данного способа обмена сообщениями делает программу еще менеекритичной к согласованию операторов обмена сообщениями, так как процесс-отправительпродолжает работу после передачи сообщения, не дожидаясь конца фактической передачисообщения (и даже начала, так как система интерпретации "должна" сразу же, скопировавпередаваемые данные в буфер, "отпустить" процесс) .
Получатель сообщений этого типаможет выдавать директиву приема сообщения, только удостоверившись в наличии нужногосообщениявпочтовомящикепроцессаприпомощифункций:TESTMSG,TESTTAG,PROBE. Выполнение оператора RECEIVE без проверки наличиясообщения в почтовом ящике процесса, по аналогии с синхронным способом обмена,приводит к задержки выполнения процесса до приема сообщения с заказанным тегом и,возможно, с заданным именем отправителя. Но в отличие от синхронного способа,асинхронный способ позволяют проводить селекцию поступающих сообщений при помощиконструкций выбора.
Пусть процесс может получать сообщения с тегом 1, но от процесса TI- скаляр целого типа, а от процесса TM(1) - массив из 100 целых чисел. Тогда,прием такихсообщений может быть запрограммированно так:IF (TESTTAG(1)) THENSELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMEND SELECTEND IF или:SELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMCASE DEFAULTGO TO 2END SELECT 2 CONTINUEОжидание этих сообщений, то есть, по аналогии с синхронной передачей сообщений,прерывание работы процесса до получения сообщения (в данном случае любого изожидаемого) записывается так:SELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMEND SELECTЕсли сообщения различаются тегами, то конструкция их ожидания может иметь вид:SELECT MESSAGECASE(1)RECEIVE (1) K147CASE(2,TM(1))RECEIVE (2) KMEND SELECTРежим передачи сообщений без ожиданияПередачи сообщений этого типа рекомендуется использовать для передачи данных"впрок", заблаговременно.
Если после операторов SEND / RECEIVE без ожидания,поместить операторы: CALL MSDONE(L),семантика операторов будет совпадать с семантикой асинхронных операторов. Следуетиметь ввиду, что при использовании операторов данного вида в цикле без использованияпроцедур ожидания фактической передачи сообщений возможно искажение передаваемыхданных; семантика функции TESTFLAG при этом будет двусмысленной.Структура элементов списка передаваемых сообщенийСтруктура элементов списка передаваемых (принимаемых) сообщений, как объявлено,совпадает с списком ввода вывода операторов обмена Фортрана.
Широкие возможностипредоставляет аппарат неявных циклов.Пусть имеются описания: REAL A(10),B(5,5). Тогда оператор:SEND(ALL)A,(B(I),I=1,5),(B(I,1),I=1,5),(B(I,I),I=1,5) перешлет всем процессампрограммы следующие объекты: - массив А целиком, - первый столбец массива В, диагональные элементы массива В.Этим способом можно организовать не только передачу (прием) любых вырезок ихмассивов, но и множества одинаковых данных, например, переслать пять копий массива В:SEND(ALL)(B,I=1,5)Идентификация абонентов при передачи сообщений в языке ФортранGNS.Идентификация абонентовИдентификация абонентов при организации передачи сообщений может производится поимени процесса (массиву имен) или идентификатору задачи, по описанию которойобразован процесс.
Есть способы безадресных (широковещательных) посылок сообщений "всем", и приема от произвольного отправителя сообщений с заказанной "маркой" - тегом.Идентификация абонентов может быть произведена:а) По имени процессаОсновным способом идентификации абонентов при передаче сообщений являетсязадание имени процесса (системного идентификатора) переменными типа TASKID истандартными функциями этого типа MYTASKID, РАRENT и МАSTER. Использованиеэтих стандартных функций является единственным первоначальным способом сослаться изпорождаемых процессов на имена порождающих процессов, так как начальный диалогмежду процессами возможен только на уровне порожденный-порождаемый.
Путем обменасообщениями можно организовать передачу имен процессов для организации произвольнойабонентской сети.Переменные типа TASKID - параметры операторов передачи сообщений могут:- ссылаться на функционирующий процесс,- ссылаться на завершенный процесс,- иметь значение .NOTASKID.,- быть не инициализированными.148Реакция программы на три последних случая не оговаривается в языке и определяетсяреализацией. Одно из решений - игнорирование оператора обмена сообщениями с такимипараметрами (кроме синхронных операторов, для которых такой случай следует считать"авостом" в программе). Процесс-отправитель имеет возможность организоватьдублирование передаваемых сообщений для передачи их одновременно несколькимпроцессам-получателем.
Для этого допускается задание абонентов в параметрах операторапередачи сообщений в виде массива типа TASKID. Сообщение будет передано при этомвсем процессам, на которые есть ссылки через элементы массива. Данная массоваяоперация предпочтительнее передачи сообщений, организованной по-элементнойциклической конструкцией. Цикл предписывает порядок перебора элементов массива абонентов передачи, а для синхронного обмена и завершение очередной передачи допосылки следующего сообщения. Массовая операция обмена может проводитьсяпараллельно и независимо для всех заказанных абонентов. Массовые операцииассиметричны, нельзя заказать ожидание сообщения от нескольких процессов сразу.Теговая идентификация сообщений и конструкции выбора допускает некоторую вольностьв указаниях об именах отправителей.б) По имени программной единицы-задачиЗадание в операторе передачи сообщений в качестве адресата - получателя именипрограммной единицы-задачи означает рассылку сообщений всем процессам,образованным по описанию указанной задачи на момент выполнения оператора.
Случай,когда к этому моменту не было образовано ни одного процесса по указанному образцу,можно рассматривать по аналогии с передачей сообщения процессу с "именем" .NOTASKID. . Возможность задать в качестве адресата имя главного процесса уточняется вописаниях входных версий языка.в) Безымянные абонентыСпециальный идентификатор ALL в параметре адресата-получателя сообщенияпредписываетпередатьданноесообщениевсемпроцессампрограммы,инициализированным на данный момент.Передача сообщений двумя последними способами предполагает возможностьпараллельной рассылки сообщений и исключение процесса, выполняющего операторпередачи сообщения, из списка абонентов - получателей.г) Помеченные сообщенияПри передаче сообщений асинхронным способом сообщения при отправлениипомечаются целым числом - тегом. Эта разметка дает возможность абонентамидентифицировать сообщения от разных операторов передачи сообщений одного процесса.Получив сообщение с заданным тегом, процесс может узнать имя отправителя, черезаппарат SENDERов.
Это замечание верно и для передачи сообщений без ожидания.Адаптация последовательных программ к параллельнымархитектурам. Векторизация и распараллеливание циклов.Методы координат, гиперплоскостей.Автоматическое распараллеливание последовательных программ.11.6 Автоматическое распараллеливаниеМультипроцессорныекомплексыпозволяютвоспользоватьсяпреимуществамипараллелизма. Большинство программ пишутся для последовательного выполнения.Вычислительные системы получают больше пользы от параллельной обработки благодарямультипрограммному выполнению нескольких процессов, чем используя параллелизм в149рамках одного процесса. Обнаружение параллелизма (распараллеливание), выполняемоепрограммистами, языковыми трансляторами, аппаратными средствами или операционнымисистемами — это сложная проблема, вызывающая сегодня особый интерес.
Независимо оттого, каким образом в конце концов будет обнаруживаться параллелизм,мультипроцессорные системы позволяют с успехом использовать его, одновременновыполняя параллельные ветви вычислений.Параллелизм в программах может быть либо явным, либо неявным (скрытым). Явныйпараллелизм программист указывает в своей программе при помощи специальнойконструкции, обозначающей параллельное вычисление, например COBEGIN/COEND,следующим образом:COBEGIN;оператор-1;оператор-2;…оператор-n;COEND;В мультипроцессорной системе, рассчитанной на реализацию параллелизма, каждый изпрограммных операторов может выполнять отдельный процессор, с тем, чтобы всевычисления завершались быстрее, чем при чисто последовательной работе.Явное указание параллелизма налагает определенную ответственность на программиста.Это достаточно трудоемкая процедура, причем в ряде случаев программист можетошибочно указать, что определенные операции можно выполнять параллельно, в то времякак в действительности этого делать нельзя.
Программист может упустить многиеситуации, допускающие распараллеливание. Весьма вероятно, что программист обнаружитпараллелизм и закодирует его явным образом в наиболее очевидных ситуациях. Однакомногие случаи параллелизма вручную в алгоритмах обнаружить трудно, поэтому они будутпросто пропускаться.Одно из довольно неприятных последствий явного указания параллелизма заключается втом, что программы могут оказаться более сложными для модификации. При внесенииизменений в программу, имеющую большое число явных параллельных конструкций, легкоможно допустить ошибки, причем, вообще говоря, довольно тонкие.Реально, на что можно надеяться при решении подобной проблемы,— это наавтоматическое обнаружение неявного параллелизма, т.
е. параллелизма, присущегоалгоритму, но не указанного явно программистом. В компиляторы, операционные системыи аппаратные средства компьютеров необходимо включать специальные механизмыраспараллеливания. Это с гораздо большей вероятность, чем явное указание параллелизма,обеспечит создание быстро выполняющихся и корректных программ.Два распространенных способа, реализуемых в компиляторах для использования неявногопараллелизма программ,— это расщепление цикла и редукция высоты дерева.11.6.1 Расщепление циклаПрограммный цикл предполагает многократное выполнение некоторой последовательностиоператоров, называемой телом цикла, до тех пор, пока не станет истиннымсоответствующее условие завершения.