Лекция: MPI_Comm comm);

void *buf1 — адрес переменной, где хранится аргумент глобальной функции

void *buf2 — адрес переменной, где будет храниться результат действия глобальной функции

int count — количество аргументов на одном процессе

MPI_Datatype type — тип аргументов и результата в терминологии MPI

MPI_Op op — идентификатор глобальной операции

int root — идентификатор процесса, на котором будет записан результат глобальной операции

MPI_Comm comm — идентификатор коммуникатора группы, которой принадлежат процессы

Процесс, обратившийся к данной функции проверят свой rank с параметром root. Если совпадает, то он собирает со всех процессов переменную, находящуюся buf1, выполняет глобальную операцию op и записывает результат по адресу buf2. Собирает со всех и у себя тоже. Если идентификатор не совпадает с root, то процесс передает переменную, находящуюся по адресу buf1, количества count и типа type.

Если результат нужно сохранить на всех процессах, то пользуются функцией:

int MPI_Allreduse(void *, void *, int, MPI_Datatype,MPI_Op,MPI_Comm);

Обе функции возвращают 0 в результате успешного завершения.

Функция сбора данных в один массив

int MPI_Gather(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm);// r – откуда, w — куда

void *bufr — адрес переменной или массива, которая будет считываться

int rcount — количество принимаемой информации от каждого процесса

MPI_Datatype rtype — тип элементов в принимаемом сообщении

void *bufw — адрес массива, куда будет записана информация

int root — идентификатор где будет сохранен массив

Процесс с номером root получает последовательно от всех процессов и от себя тоже данные, находящиеся по адресу bufr и записывает по адресу bufw. Если необходимо собрать массив на всех процессах, то пользуются функцией:

MPI_Allgather(void*, int*, MPI_Datetype, void*, int*, MPI_Datatype, MPI_Comm);

Функции возвращают 0 в случае успешного завершения.

Функция рассылки частей массива на все процессы

int MPI_Scatter(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm);

Процесс root из массива по адресу bufr по rcount элемента типа rtype рассылает последовательно по номеру процесса и себе тоже. Все остальные процессы получают от root данные и записывают по адресу bufw, wcount элементов типа wtype, которые должны совпадать. Все процессы принадлежат группе с коммуникатором comm.


 

6. Функции обмена с блокировкой: MPI_Send(), MPI_Recv(), MPI_Ssent(),MPI_Bsend(), MPI_Rsend(), MPI_Buffer_attach(), MPI_Buffer_detach().

Функции передачи с блокировкой

int MPI_Send (void* buf, int count, MPI_Datatype type, int des, int msgtag, MPI_Comm comm)

void *buf — адрес переменной или массива, откуда будет передаваться информация

int count — количество элементов в передаваемом сообщении

MPI_Datatype type — тип элементов передаваемого сообщения в терминологии MPI

int des — идентификации процесса получателя

int msgtag — идентификатор сообщения, должен совпадать у переедающего и принимающего процессов

MPI_Comm comm — идентификатор коммуникатора группы, которой принадлежат переедающие и принимающие процессы

Функция MPI_Send — передача точка-точка

При обращении к функции данные будут либо переданы, либо помещены в буфер, если процесс-получатель не готов к обмену и закончит работу успешно. Блокировка означает, что на момент реального обмена будут переданы те данные, которые были на момент обращения к функции. То есть выполняется на данные. Это обеспечивается тем, что в буфер помещаются значения. Функция возвращает 0 в случае успешного завершения, иначе код ошибки. Так как после выполнения функции нельзя быть уверенным, что сообщение было передано ввели следующие 3 функции с теми же параметрами:

-int MPI_Ssend(...) — синхронная передача, завершение работы функции возможно только после того, как сообщение полностью передано. Если процесс-получатель не готов приему, возможно бесконечное ожидание.

— int MPI_Bsend(...) — программист сам создает буфер, куда помещается передаваемое сообщение. Для этого необходимы функции:

int MPI_Buffer_attach(void* buffer, int size); — выделение буферного пространства в памяти.

int MPI_Buffer_detach(void* buffer, int* size); — освобождение буферного пространства в памяти.

int MPI_Rsend(...) — передача по готовности. Функция сразу передает сообщение, если процесс-получатель не готов к приему, функция завершается с ошибкой. Все функции возвращают 0 или код ошибки.

Функция приема сообщения

int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int msgtag, MPI_Comm comm,

MPI_Status *status);

void *buf — адрес переменной или массива, куда будет записана полученная информация

int count — количество элементов в принятом сообщении. Можно указывать значение больше, чем будет получено, будет записано столько, сколько элементов пришло.

MPI_Datatype type — тип элементов в принятом сообщении в терминологии MPI

int source — идентификатор процесса-отправителя. Можно указывать константу

MPI_ANY_SOURCE, то есть будет получено сообщение от любого процесса, годового к обмену.

int msgtag — идентификатор сообщения, должен совпадать у переедающего и принимающего

MPI_Comm comm — идентификатор коммуникатора группы, которому принадлежат переедающие и принимающие процессы.

MPI_Status *status — указатель на структуру MPI_Status, куда будут записаны атрибуты принятого сообщения, возвращаемое значение.

Функция возвращает 0, иначе код ошибки.

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


еще рефераты
Еще работы по информатике