Параллельное программирование: Учебное пособие, страница 88

Таким образом, всего 8 разновидностей операции передачи сообщений.

Для подпрограмм приема существует только 2 разновидности:

MPI_[I]Recv.

В результате, например, подпрограмма MPI_Irsend выполняет передачу "по готовности" (r) в неблокирующем режиме (I), MPI_Bsend выполняет буферизованную (B) передачу с блокировкой, a MPI_RECV выполняет блокирующий прием сообщений. Подпрограмма приема любого типа может принять сообщения от любой подпрограммы передачи.

5.2  Блокирующие операции обмена

Блокирующие операции приостанавливают выполнение вызывающего процесса, заставляя процесс ожидать завершения передачи данных. Блокировка гарантирует выполнение действий в заданном порядке, но и создает условия для возникновения тупиковых ситуаций, когда оба процесса-участника обмена "точка-точка" блокируются одновременно.

5.2.1  Стандартный обмен

Сообщение, отправленное в стандартном режиме, может в течение некоторого времени перемещаться по коммуникационной сети параллельной вычислительной системы из компьютера в компьютер, увеличивая тем самым загрузку сети. Поэтому в MPI-программах рекомендуется соблюдать следующие правила:

·  блокирующие операции обмена следует использовать осторожно, поскольку в этом случае возрастает вероятность тупиковых ситуаций;

·  если для правильной работы процесса имеет значение последовательность приема сообщений, источник должен передавать новое сообщение, только убедившись, что предыдущее уже принято. В противном случае может нарушиться детерминизм выполнения программы;

·  сообщения должны гарантированно и с достаточно большой частотой приниматься процессами, которым они посылаются, иначе коммуникационная сеть может переполниться, что приведет к резкому падению скорости ее работы. Это, в свою очередь, снизит производительность всей системы.

Основными подпрограммами двухточечного обмена сообщениями являются MPI_Send и MPI_Recv. MPI_Send— это подпрограмма стандартной блокирующей передачи. Она блокирует выполнение передающего процесса до завершения передачи сообщения (что, однако, не гарантирует завершения его приема на принимающей стороне). В нотации языка С++ объявление этой подпрограммы имеет следующий вид :

int MPI_Send(void *buf, int count, MPI_Datatype

datatype, int dest, int tag, MPI_Comm comm)

MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR)

Вторая строка— заголовок процедуры для языка FORTRAN. В литературе, описывающей параллельное программирование в среде MPI эта пара языков программирования упоминается одновременно, как следствие удовлетворения запросов программистов-системщиков, разрабатывающих новые процедуры и программы, так и программистов-естествоиспытателей, разрабатывающих программы моделирования и исследования реальных объектов, привыкших к лексической простоте и семантической ясности операторов фортрана. В данной книге в основном будет использоваться нотация, соответствующая языку С++.

Входные параметры подпрограммы MPI_Send:

·  buf — адрес первого элемента в буфере передачи с именем buf;

·  count — количество элементов в буфере передачи;

·  datatype — тип MPI каждого пересылаемого элемента;

·  dest — ранг процесса-получателя сообщения, представляемый целым числом от 0  до  n-1, где nчисло процессов в области взаимодействия, определяемый коммуникатором с именем comm;

·  tag — тег (бирка, ярлык, метка) сообщения, представляемый целым числом, нумерующим очередность отсылки сообщений от одного и того же источника к одному и тому же приемнику, что сохраняет заданную очередность приема независимо от маршрута;

·  comm — идентификатор частного (локального) коммуникатора;

·  IERR — код завершения подпрограммы Фортрана; для процедур-функций на языке С++ код завершения является возвращаемым целочисленным значением этой функции, что определяется ее описателем типа int.

По умолчанию реакцией системы на возникновение ошибки во время выполнения программы является ее останов. Реакцию можно изменить с помощью вызова подпрограммы MPI_Errhandler_set, однако MPI в большинстве реализаций не гарантирует нормального продолжения работы параллельной программы после возникновения ошибки.