2006 Ответы на экзаменационные вопросы по ПОД (Lilalbrother), страница 11
Описание файла
PDF-файл из архива "2006 Ответы на экзаменационные вопросы по ПОД (Lilalbrother)", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 11 страницы из PDF
Например,in( "P", int i, FALSE );Этой функции соответствует любой кортеж, который состоит из трех элементов:значением первого элемента является "P", второй элемент может быть любым целымчислом, а третий должен иметь значение FALSE. Подходящими кортежами могут быть ("P", 5, FALSE) или ( "P", 135, FALSE) и т.п., но не ( "P", 7.2, FALSE) или ( "Proc", 5,FALSE).
Если параметру функции in соответствуют несколько кортежей, то случайнымобразом выбирается один из них. После нахождения кортеж удаляется из пространствакортежей, а неопределенным формальным элементам параметра-кортежа, содержащимсяв вызове данной функции, присваиваются соответствующие значения. В предыдущемпримере переменной i присвоится 5 или 135. Если в пространстве кортежей ни одинкортеж не соответствуют функции, то вызвавший ее процесс блокируется до тех пор, покасоответствующий кортеж в пространстве не появится.Элемент кортежа в функции in считается формальным, если перед ним стоитопределитель типа. Если используется переменная без определителя типа, то берется еезначение и элемент рассматривается как фактический параметр.
Например, во фрагментепрограммыint i = 5;in( "P", i, FALSE );функции in, в отличие от предыдущего примера, соответствует только кортеж ("P", 5,FALSE).Если переменная описана до вызова функции и ее надо использовать какформальный элемент кортежа, можно использовать ключевое слово formal или знак '?'.Например, во фрагменте программыj = 15;in( "P", formal i, j );последнюю строку можно заменить и на оператор in("P", ?i, j). В этом примере функции inбудет соответствовать, например, кортеж ("P", 6, 15), но не ("P", 6, 12). Конечно же,формальными могут быть и несколько элементов кортежа одновременно:in ( "Add_If", int i, bool b);Если после такого вызова функции в пространстве кортежей будет найден кортеж("Add_If", 100, TRUE), то переменной i присвоится значение 100, а переменной b значение TRUE.Функция READ отличается от функции in лишь тем, что выбранный кортеж неудаляется из пространства кортежей.
Все остальное точно так же, как и у функции in.Этой функцией удобно пользоваться в том случае, когда значения переменных менять ненужно, но к ним необходим параллельный доступ из нескольких процессов.Функция EVAL похожа на функцию out. Разница заключается лишь в том, чтодополнительным элементом кортежа у eval является функция пользователя.
Длявычисления значения этой функции система Linda порождает параллельный процесс, наоснове работы которого она формирует кортеж и помещает его в пространство кортежей.Например,eval ("hello", funct( z ), TRUE, 3.1415);При обработке данного вызова система создаст новый процесс для вычисления функцииfunct( z ). Когда процесс закончится и будет получено значение w = funct( z ), впространство кортежей будет добавлен кортеж ("hello", w, TRUE, 3.1415).
Функция,вызвавшая eval, не ожидает завершения порожденного параллельного процесса ипродолжает свою работу дальше. Следует отметить и то, что пользователь не может явноуправлять размещением порожденных параллельных процессов на доступных емупроцессорных устройствах - это Linda делает самостоятельно.Параллельная программа в системе Linda считается завершенной, если всепорожденные процессы завершились или все они заблокированы функциями in и read.32. MPI: общая структура. Основные отличия MPI-2 от MPI-1.Наиболее распространенной технологией программирования параллельныхкомпьютеров с распределенной памятью в настоящее время является MPI. Мы ужеговорили о том, что основным способом взаимодействия параллельных процессов в такихсистемах является передача сообщений друг другу.
Это и отражено в названии даннойтехнологии — Message Passing Interface. Стандарт MPI фиксирует интерфейс, которыйдолжны соблюдать как система программирования MPI на каждой вычислительнойсистеме, так и пользователь при создании своих программ. Современные реализации чащевсего соответствуют стандарту MPI версии 1.1. В 1997—1998 годах появился стандартMPI-2.0, значительно расширивший функциональность предыдущей версии.
Однако досих пор этот вариант MPI не получил широкого распространения. Везде далее, если иногоне оговорено, мы будем иметь дело со стандартом 1.1.MPI поддерживает работу с языками С и Fortran. В данной книге все примеры иописания всех функций будут даны с использованием языка С. Однако это совершенно неявляется принципиальным, поскольку основные идеи MPI и правила оформленияотдельных конструкций для этих языков во многом схожи.Полная версия интерфейса содержит описание более 120 функций.Интерфейс поддерживает создание параллельных программ в стиле MIMD, чтоподразумевает объединение процессов с различными исходными текстами. Однако напрактике программисты гораздо чаще используют SPMD-модель, в рамках которой длявсех параллельных процессов используется один и тот же код.
В настоящее время всебольше и больше реализаций MPI поддерживают работу с нитями.Все дополнительные объекты: имена функций, константы, предопределенные типыданных и т. п., используемые в MPI, имеют префикс MPI_. Например, функция посылкисообщения от одного процесса другому имеет имя MPi_Send. Если пользователь не будетиспользовать в программе имен с таким префиксом, то конфликтов с объектами MPIзаведомо не будет. Все описания интерфейса MPI собраны в файле mpi.h, поэтому вначале MPI-программы должна стоять директива #include <mpi.h>.MPI-программа — это множество параллельных взаимодействующих процессов.Все процессы порождаются один раз, образуя параллельную часть программы.
В ходевыполнения MPI-программы порождение дополнительных процессов или уничтожениесуществующих не допускается.Каждый процесс работает в своем адресном пространстве, никаких общихпеременных или данных в MPI нет. Основным способом взаимодействия междупроцессами является явная посылка сообщений.Для локализации взаимодействия параллельных процессов программы можносоздавать группы процессов, предоставляя им отдельную среду для общения —коммуникатор.
Состав образуемых групп произволен. Группы могут полностью входитьодна в другую, не пересекаться или пересекаться частично. При старте программы всегдасчитается, что все порожденные процессы работают в рамках всеобъемлющегокоммуникатора, имеющего предопределенное имя MPI_COMM_WORLD. Этот коммуникаторсуществует всегда и служит для взаимодействия всех процессов MPI-программы.Каждый процесс MPI-программы имеет уникальный атрибут номер процесса,который является целым неотрицательным числом.
С помощью этого атрибутапроисходит значительная часть взаимодействия процессов между собой. Ясно, что водном и том же коммуникаторе все процессы имеют различные номера. Но посколькупроцесс может одновременно входить в разные коммуникаторы, то его номер в одномкоммуникаторе может отличаться от его номера в другом. Отсюда два основных атрибутапроцесса: коммуникатор и номер в коммуникаторе.Если группа содержит п процессов, то номер любого процесса в данной группележит в пределах от 0 до п - 1. Подобная линейная нумерация не всегда адекватноотражает логическую взаимосвязь процессов приложения.
Например, по смыслу задачипроцессы могут располагаться в узлах прямоугольной решетки и взаимодействоватьтолько со своими непосредственными соседями. Такую ситуацию пользователь можетлегко отразить в своей программе, описав соответствующую виртуальную топологиюпроцессов. Эта информация может оказаться полезной при отображении процессов программы на физические процессоры вычислительной системы. Сам процесс отображения вMPI никак не специфицируется, однако система поддержки MPI в ряде случаев можетзначительно уменьшить коммуникационные накладные расходы, если воспользуетсязнанием виртуальной топологии.Основным способом общения процессов между собой является посылка сообщений.
Сообщение — это набор данных некоторого типа. Каждое сообщение имеетнесколько атрибутов, в частности, номер процесса-отправителя, номер процессаполучателя, идентификатор сообщения и др. Одним из важных атрибутов сообщенияявляется его идентификатор или тэг. По идентификатору процесс, принимающийсообщение, например, может различить два сообщения, пришедшие к нему от одного итого же процесса. Сам идентификатор сообщения является целым неотрицательнымчислом, лежащим в диапазоне от 0 до 32 767. Для работы с атрибутами сообщенийвведена структура MPistatus, поля которой дают доступ к значениям атрибутов.На практике сообщение чаще всего является набором однотипных данных,расположенных подряд друг за другом в некотором буфере.
Такое сообщение можетсостоять, например, из двухсот целых чисел, которые пользователь разместил всоответствующем целочисленном векторе. Это типичная ситуация, на нее ориентированобольшинство функций MPI, однако такая ситуация имеет, по крайней мере, дваограничения. Во-первых, иногда необходимо составить сообщение из разнотипныхданных. Конечно же, можно отдельным сообщением послать количество вещественныхчисел, содержащихся в последующем сообщении, но это может быть и неудобно программисту, и не столь эффективно. Во-вторых, не всегда посылаемые данные занимаютнепрерывную область в памяти. Если в Fortran элементы столбцов матрицы расположеныв памяти друг за другом, то элементы строк уже идут с некоторым шагом. Чтобы послатьстроку, данные нужно сначала упаковать, передать, а затем вновь распаковать.Чтобы снять указанные ограничения, в MPI предусмотрен механизм для введенияпроизводных типов данных (derived datatypes).
Описав состав и схему размещения впамяти посылаемых данных, пользователь в дальнейшем работает с такими типами также, как и со стандартными типами данных MPI.Поскольку собственные типы данных и виртуальные топологии процессов используютсяна практике не очень часто, то в данной книге мы не будем их описывать подробно.33.
MPI: синхронное и асинхронное взаимодействие процессов.int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Commcomm)buf - адрес начала буфера посылки сообщенияcount - число передаваемых элементов в сообщенииdatatype - тип передаваемых элементовdest - номер процесса-получателяmsgtag - идентификатор сообщенияcomm - идентификатор группыБлокирующая посылка сообщения с идентификатором msgtag, состоящего из countэлементов типа datatype, процессу с номером dest. Все элементы сообщения расположеныподряд в буфере buf. Значение count может быть нулем. Тип передаваемых элементовdatatype должен указываться с помощью предопределенных констант типа.