WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 || 3 | 4 |   ...   | 8 |

Элемент i определяет смещение (относительно recvbuf), с которым поместить входящие данные из процесса i recvtype Тип данных элементов буфера приема (дескриптор) comm Коммуникатор (дескриптор) Выходной параметр recvbuf Адрес буфера приема (указатель) MPI_Allreduce Объединяет значения из всех процессов и распределяет результат всем процессам int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входные параметры sendbuf Начальный адрес буфера посылки (указатель) count Число элементов в буфере посылки (целое число) datatype Тип данных элементов буфера посылки (дескриптор) op Операция (дескриптор) comm Коммуникатор (дескриптор) Выходной параметр recvbuf Начальный адрес буфера приема (указатель) MPI_Alltoall Посылает данные от всех процессов всем int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, MPI_Comm comm) Входные параметры sendbuf Начальный адрес буфера посылки (указатель) sendcount Число элементов, посылаемых каждому процессу (целое число) sendtype Тип данных элементов буфера посылки (дескриптор) recvcount Число элементов, полученных от любого процесса (целое число) recvtype Тип данных элементов буфера приема (дескриптор) comm Коммуникатор (дескриптор) Выходной параметр recvbuf Адрес буфера приема (указатель) MPI_Alltoallv Посылает данные от всех процессов всем, со смещением int MPI_Alltoallv(void *sendbuf, int *sendcnts, int *sdispls, MPI_Datatype sendtype, void *recvbuf, int *recvcnts, int *rdispls, MPI_Datatype recvtype, MPI_Comm comm) Входные параметры sendbuf Начальный адрес буфера посылки (указатель) sendcounts Целочисленный массив, равный размеру группы, определяющий число элементов, посылаемых каждому процессу sdispls Целочисленный массив (длиной, равной размеру группы).

Элемент j определяет смещение (относительно sendbuf), по которому брать исходящие данные, предназначенные для процесса j sendtype Тип данных элементов буфера посылки (дескриптор) recvcounts Целочисленный массив, равный размеру группы, определяющий максимальные числа элементов, которые могут быть получены от каждого процесса rdispls Целочисленный массив (длиной, равной размеру группы).

Элемент i определяет смещение (относительно recvbuf), по которому разместятся входящие данные из процесса i recvtype Тип данных элементов буфера приема (дескриптор) comm Коммуникатор (дескриптор) Выходной параметр recvbuf Адрес буфера приема (указатель) MPI_Barrier Блокирует процесс, пока все процессы не достигнут этой подпрограммы.

int MPI_Barrier(MPI_Comm comm) Входной параметр comm Коммуникатор (дескриптор) Примечание. Блокирует вызывающую программу, пока все члены группы не вызвали эту подпрограмму; возврат в любом процессе произойдет только после того как все члены группы сделают вызов.

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

В дальнейшем разработчики реализации могут изменить алгоритм, чтобы использовать "блоки" (см. MPI_Bcast).

MPI_Bcast Рассылает сообщение из процесса с номером "корень" всем другим процессам группы.

int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) Входные/выходные параметры buffer Начальный адрес буфера (указатель) count Число элементов в буфере (целое число) datatype Тип данных буфера (дескриптор) root Номер корня широковещательной передачи (целое число) comm Коммуникатор (дескриптор) Алгоритм. При отсутствии аппаратной поддержки, эта функция использует деревоподобный алгоритм, чтобы разослать сообщение блокам процессов. Затем используется линейный алгоритм, чтобы разослать сообщение из первого процесса в блоке всем другим процессам.

MPIR_BCAST_BLOCK_SIZE определяет размер блоков. Если он установлен в 1, функция эквивалентна использованию чистого алгоритма дерева.

Если он установлен равным размеру группы или большим, это – чистый линейный алгоритм. Значение должно корректироваться, чтобы определить наиболее эффективное значение на различных машинах.

MPI_Bsend Основная посылка сообщения с указанной пользователем буферизацией int MPI_Bsend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) Входные параметры buf Начальный адрес буфера посылки (указатель) count Число элементов в буфере посылки (неотрицательное целое число) datatype Тип данных элемента буфера посылки (дескриптор) dest Номер адресата (целое число) tag Идентификатор сообщения (целое число) comm Коммуникатор (дескриптор) Примечания. Эта посылка обеспечена для удобства; она позволяет пользователю посылать сообщения без опасения относительно того, где они буферизованы (поскольку пользователь сам должен обеспечить буферное пространство MPI_Buffer_attach). Решая, сколько буферного пространства необходимо распределить, помните, что буферное пространство недоступно для повторного использования последующим MPI_Bsend, если Вы не уверены, что сообщение было получено. Например, следующий код не распределяет достаточного буферного пространства:

MPI_Buffer_attach(b, n*sizeof(double)+ MPI_BSEND_OVERHEAD);

for (i=0; i

} потому что достаточное буферное пространство предусмотрено только для одиночной посылки и цикл может начать вторую MPI_Bsend прежде, чем первая выполнится, используя буфер.



В программах на C Вы можете вынуждать доставку сообщений при помощи MPI_Buffer_detach(&b, &n);

MPI_Buffer_attach(b, n);

(MPI_Buffer_detach не будет завершаться, пока все буферизованные сообщения не доставлены.) См. также MPI_Buffer_attach, MPI_Ibsend, MPI_Bsend_init MPI_Bsend_init Формирует дескриптор для буферизованной посылки int MPI_Bsend_init(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) Входные параметры buf Начальный адрес буфера посылки (указатель) count Число посланных элементов (целое число) datatype Тип каждого элемента (дескриптор) dest Номер адресата (целое число) tag Идентификатор сообщения (целое число) comm Коммуникатор (дескриптор) Выходной параметр request Запрос связи (дескриптор) MPI_Buffer_attach Присоединяет определяемый пользователем буфер к посылке int MPI_Buffer_attach(void *buffer, int size) Входные параметры buffer Начальный адрес буфера (указатель) size Размер буфера в байтах (целое число) Примечания. Данный размер должен быть равен сумме размеров всех ожидающих обработки Bsend, которые Вы предполагаете иметь, плюс несколько сотен байтов для каждой Bsend, которую Вы делаете. Для целей вычисления размера Вы должны использовать MPI_Pack_size. Другими словами, в коде MPI_Buffer_attach(buffer, size);

MPI_Bsend(..., count=20, datatype=type1,...);

...

MPI_Bsend(..., count=40, datatype=type2,...);

значение size при вызове MPI_Buffer_attach должно превосходить значение, вычисленное при помощи:

MPI_Pack_size(20, type1, comm, &s1);

MPI_Pack_size(40, type2, comm, &s2);

size = s1 + s2 + 2 * MPI_BSEND_OVERHEAD;

MPI_BSEND_OVERHEAD дает максимальное количество пространства, которое может использоваться в буфере BSEND подпрограммами. Это значение находится в mpi.h.

См. также MPI_Buffer_detach, MPI_Bsend MPI_Buffer_detach Удаляет существующий буфер (для использования в MPI_Bsend и т.п.) int MPI_Buffer_detach(void *bufferptr, int *size) Выходные параметры buffer Начальный адрес буфера (указатель) size Размер буфера в байтах (целое число) Примечание. Причина того, что MPI_Buffer_detach возвращает адрес и размер отсоединяемого буфера, состоит в том, чтобы позволить вложенным библиотекам заменять и восстанавливать буфер. Например, рассмотрите int size, mysize, idummy;

void *ptr, *myptr, *dummy;

MPI_Buffer_detach(&ptr, &size);

MPI_Buffer_attach(myptr, mysize);

...

... библиотечный код...

...

MPI_Buffer_detach(&dummy, &idummy);

MPI_Buffer_attach(ptr, size);

Это подобно действию Unix signal routine и имеет те же самые сильные (это просто) и слабые стороны (это работает только для вложенного использования). Обратите внимание: для того, чтобы работал данный подход, MPI_Buffer_detach должна возвратить MPI_SUCCESS даже когда не имеется никакого отсоединяемого буфера. В этом случае возвращается размер, равный нулю.

MPI_Cancel Отменяет запрос связи int MPI_Cancel(MPI_Request *request) Входной параметр request Запрос связи (дескриптор) Примечание. Отмена была реализована только для запросов приема;

для запросов посылки это – пустая операция. Вероятнее всего, использование MPI_Cancel ожидается в схемах мульти-буферизации, где спекулятивно делаются вызовы MPI_Irecv. Когда вычисление завершается, некоторые из этих запросов приема могут оставаться; использование MPI_Cancel позволяет пользователю отменять эти неудовлетворенные запросы. Отмена операции посылки намного более трудна, поскольку посылка обычно будет, по крайней мере частично, выполнена (информация относительно идентификатора сообщения и размера, номер процесса источника обычно посылаются адресату немедленно). MPICH поддержит эту возможность при выпуске следующих версий; однако пользователи уведомляются, что отмена посылки, будучи локальной операцией, вероятно, обойдется дорого (обычно породит одно или более внутренних сообщений).

Пустые дескрипторы. Спецификация MPI 1.1 в разделе по непрозрачным объектам запрещает использование пустого дескриптора в качестве параметра. Текст из стандарта: пустой параметр дескриптора – ошибочный входной параметр вызовов MPI, если исключение явно не установлено в тексте определения функции. Такое исключение допустимо для дескрипторов объектов запросов в вызовах Wait и Test (разделы «Communication Completion» and «Multiple Completions»). В противном случае, пустой дескриптор может быть передан только функции, которая распределяет новый объект и возвращает ссылку на него в дескрипторе.

MPI_Comm_compare Сравнивает два коммуникатора int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result) Входные параметры comm1 Коммуникатор 1 (дескриптор) comm2 Коммуникатор 2 (дескриптор) Выходной параметр result Целое число, равное MPI_IDENT, если контексты и группы одинаковы ; MPI_CONGRUENT, если различны контексты, но идентичны группы; MPI_SIMILAR, если различны контексты, но подобны группы; в противном случае – MPI_UNEQUAL Примечание. Использование MPI_COMM_NULL в качестве одного из параметров MPI_Comm_compare является ошибкой.

MPI_Comm_create Создает новый коммуникатор int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *comm_out) Входные параметры comm Коммуникатор (дескриптор) group Группа, которая является подмножеством группы comm (дескриптор) Выходной параметр comm_out Новый коммуникатор (дескриптор) См. также MPI_Comm_free MPI_Comm_dup Дублирует существующий коммуникатор со всей кэшируемой информацией int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *comm_out) Входной параметр comm Коммуникатор (дескриптор) Выходной параметр newcomm Копия comm (дескриптор) См. также MPI_Comm_free MPI_Comm_free Помечает объект коммуникатора для освобождения int MPI_Comm_free(MPI_Comm *commp) Входной параметр comm Коммуникатор, который будет разрушен (дескриптор) Пустые дескрипторы. Спецификация MPI 1.1 в разделе по непрозрачным объектам запрещает освобождение пустого коммуникатора (см.





примечание к разделу MPI_Cancel).

MPI_Comm_group Выбирает группу, связанную с данным коммуникатором int MPI_Comm_group(MPI_Comm comm, MPI_Group *group) Входной параметр comm Коммуникатор Выходной параметр group Группа в коммуникаторе Примечание. Использование MPI_COMM_NULL в качестве параметра MPI_Comm_group является ошибкой. Ранние версии MPICH позволяют использовать MPI_COMM_NULL в этой функции. В интересах поддержки мобильности прикладных программ разработчики реализации изменили поведение MPI_Comm_group для устранения этого нарушения стандарта MPI.

MPI_Comm_rank Определяет номер вызывающего процесса в коммуникаторе int MPI_Comm_rank(MPI_Comm comm, int *rank) Входной параметр comm Коммуникатор (дескриптор) Выходной параметр rank Номер вызывающего процесса в группе коммуникатора comm (целое число) MPI_Comm_remote_group Выбирает удаленную группу, связанную с данным интеркоммуникатором int MPI_Comm_remote_group(MPI_Comm comm, MPI_Group *group) Входной параметр comm Коммуникатор (должен быть интеркоммуникатором) Выходной параметр group Удаленная группа коммуникатора MPI_Comm_remote_size Определяет размер удаленной группы, связанной с интеркоммуникатором int MPI_Comm_remote_size(MPI_Comm comm, int *size) Входной параметр comm Коммуникатор (дескриптор) Выходной параметр size Число процессов в группе comm (целое число) MPI_Comm_size Определяет размер группы, связанной с коммуникатором int MPI_Comm_size(MPI_Comm comm, int *size) Входной параметр comm Коммуникатор (дескриптор) Выходной параметр size Число процессов в группе коммуникатора comm (целое число) Примечание. MPI_COMM_NULL не рассматривается как допустимый параметр этой функции.

MPI_Comm_split Создает новые коммуникаторы, основываясь на цветах и ключах (split – разбиение) int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) Входные параметры comm Коммуникатор (дескриптор) color Контроль над назначением подмножества (неотрицательное целое число) key Контроль над назначением номера (целое число) Выходной параметр newcomm Новый коммуникатор (дескриптор) Примечание. color должен быть неотрицательным или MPI_UNDEFINED.

Алгоритм. Используемый в настоящее время алгоритм, по мнению разработчиков, имеет ряд неэффективных мест, которые могут быть устранены. Вот то, что пока сделано:

1) Из цветов и ключей формируется таблица (имеет также поле «следующий»).

2) Таблицы всех процессов объединяются с использованием MPI_Allreduce.

3) Для всех создаваемых коммуникаторов размещаются два контекста.

Одни и те же два контекста могут использоваться для всех созданных коммуникаторов, поскольку коммуникаторы не будут перекрываться.

4) Если локальный процесс имеет цвет MPI_UNDEFINED, можно возвратить NULL comm.

5) Элементы таблицы, которые соответствуют цвету локального процесса, сортируются по ключу / номеру.

6) Группа создается из отсортированного списка, а коммуникатор создается из этой группы и предварительно размещенных контекстов.

См. также MPI_Comm_free MPI_Finalize Завершает выполнение среды MPI int MPI_Finalize() Примечание. Все процессы должны перед выходом вызвать эту подпрограмму. Число процессов, продолжающих работать после вызова этой подпрограммы, не определено; лучше всего после вызова MPI_Finalize не выполнять намного более чем return rc.

MPI_Finalized Указывает, вызывалась ли MPI_Finalize int MPI_Finalized(int *flag) Выходной параметр flag Флажок – true, если MPI_Finalize вызвалась, и false – иначе.

MPI_Gather Собирает вместе значения из группы процессов int MPI_Gather(void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Входные параметры sendbuf Начальный адрес буфера посылки (указатель) sendcount Число элементов в буфере посылки (целое число) sendtype Тип данных элементов буфера посылки (дескриптор) recvcount Число элементов для любого одиночного приема (целое число, имеющее значение только в корне) recvtype Тип данных элементов буфера recv (значимый только в корне) (дескриптор) root Номер получающего процесса (целое число) comm Коммуникатор (дескриптор) Выходной параметр recvbuf Адрес буфера приема (указатель, значимый только в корне) MPI_Gatherv Собирает в определенные места из всех процессов в группе int MPI_Gatherv(void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int *recvcnts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm) Входные параметры sendbuf Начальный адрес буфера посылки (указатель) sendcount Число элементов в буфере посылки (целое число) sendtype Тип данных элементов буфера посылки (дескриптор) recvcounts Целочисленный массив (размером, равным длине группы) содержащий число элементов, которые получены от каждого процесса (значимый только в корне) displs Целочисленный массив (размером, равным длине группы).

Pages:     | 1 || 3 | 4 |   ...   | 8 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.