Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
int pvm_pklong(long *np, int count, int std) ; Значения типа short:
int pvm_pkshort(short *np, int count, int std) ; Строки:
int pvm_pkstr(char *cp) ;
Все функции упаковки, перечисленные в табл. 6.3, используются для сохранения массиваданных в буфере отправки. Обратите вни м ание на то, что каждая PVM-задача (см. рис.6.6) должна и м еть по крайней м ере один буфер отправки и один буфер приема. Каждал функция упаковки прини м ает указатель на м ассив соответствую щ его типаданных. Все функции упаковки, за исключением функции pvm_pkstr(), принимают общее количество элементов, подлежащих сохранению в массиве (а не количество байтов!). Для функции pvm_pkstr()предполагается, что символьный массив, с которым она работает, завершается значение м NULL.Каждал функция упаковки, за исключением функции pvm_pkstr(),в качестве последнего пара м етра прини м ает значение, которое представляет способ обхода элементов исходного массива при их упаковке в буфер отправки. Этот параметр часто называют шагом по индексу (stride). Например, если этот шаг равен четырем, то в буфер упаковки будет помещен каждый четвертый элемент исходного массива. Важно отметить, что до отправки каждого сообщения необходимо использовать функцию pvm_initsend(), которая очищает буфер и готовит его к пересылке следующего сообщения. Функция pvm_initsend()готовит буфер к пересылке сообщения в одном из трех форматов: XDR, Raw или In Place.
Формат XDR (External Z>ata .Representation) — это стандарт, используемый для описания и шифрования данных. Слелует иметь в виду, что компьютеры, включенные всрелу PVM, могут быть совершенно разными, т.е. среда PVM, например, может состоять из Sun-, Macintosh-, Crays- и AMD-компьютеров. Эти компьютеры могут отличаться размерами машинных слов и по-разному сохранять различные типы данных. В некоторых случалх компьютеры могут различаться и битовой организацией. Стандарт XDR позволяет компьютерам обмениваться данными вне зависимости от типа их архитектуры. Формат Raw используется для отправки данных в собственно м фор м ате компьютера-отправителя. При это м никакое специальное кодирование не при м еняется. Формат In Place в действительности не требует упаковки данных в буфере отправки, и адресату отправляются лишь указатели на данные и раз м ер данных. В это м случае задача-получатель напря м ую копирует данные. В библиотеке PVM эти три типа кодирования данных представляются соответствующи м и тре м я константа м и:
PvmDataDefaultXDR
PvmDataRaw Без специального кодирования
PvmDataInPlaceВ буфер отправки копируются лишь указатели и раз м ер данных
Вот пример: int BufferId;
BufferId = pvm_initsend(PvmDataRaw); //.. .
Здесь константа PvmDataRaw,переданнал функции pvm_initsend()в качестве параметра, означает, что данные упаковываются в буфер как есть, т.е. без специально г о кодирования. При успешном выполнении функция возвра щ ает номер буфера отправки (в данном случае он будет записан в переменную BufferId).Важно помнить, что хотя в каждый момент времени активным может быть только один буфер отправки, Любая PVM-задача может иметь несколько таких буферов, и с каждым из них связывается некоторый идентификационный номер.
В библиотеке PVM прелусмотрено несколько функций, имею щ их отношение к процелуре отправки.
Синопсис
# include «pvm3 .h»
int pvm_send(int taskid, int messageid); int pvm_psend(int taskid, int messageid,
char *buffer,int len, int datatype); int pvm_mcast(int *taskid,int ntask,int messageid);
В каждой из этих функций параметр taskidпредставл я ет собой идентификатор PVM-задачи, которая принимает сооб щ ение. При вызове функции pvm_mcast() параметр taskidозначает коллекцию задач, представл я емых идентификаторами, которые передаютс я в массиве *taskid.Параметр messageidуказывает идентификатор посылаемо г о сооб щ ени я. Идентификаторы сооб щ ений представл я ют собой целочисленные значени я, определенные пользователем. Они используются отправителем и получателем дл я идентификации сооб щ ени я, например:
pvm_bufinfo (N, &NumBytes, &MessageId, &Ptid) ; //. . .
switch(MessageId) {
case 1 : // Некоторые действия, break;
case 2 : // Другие действия, break
//. . .
}
В данном случае функци я pvm_bufinfo()используетс я дл я получени я информации о последнем сооб щ ении, прин я том в буфер приема N.Мы можем получить количество байтов, идентификатор сооб щ ени я (messageid)и узнать, кто его отправил. Знал значение messageid,мы можем выполнить соответствую щ ие логические действи я. Функци я pvm_send() посылает заданной задаче команду псевдоблокировани я, после приема которой задача блокируетс я до тех пор, пока отправитель не убедится в том, что сообщение было послано правиль н о. Задача-отправитель не ожидает реального получени я сооб щ ения. Функция pvm_psend() отправляет сооб щ ение непосредственно указанной задаче. Обратите внимание на то, что функция pvmj?send () имеет параметр buffer, используемый в качестве буфера для хранения посылаемого сообщения. Функция pvm_mcast () используется для отправки сообщения нескольким задачам одновременно. Аргументы, передавае м ые функции pvm_mcast (), включают массив идентификаторов задач-получателей сообщения (taskid), количество задач — участников «широковещания» (ntask) и идентификатор сообщения (messageid) для идентификации отправляемого сооб щ ения. На рис. 6.6 показано, что у каждой PVM-задачи есть собственный буфер отправки, который существует в течение про м ежутка вре м ени, длительности которого было бы достаточно, чтобы сообщение гарантированно дошло до адресата.
За исключение м управляющих сообщений, значение сообщений, которы м и обмениваются любые две PVM-задачи, заранее определено логикой конкретного приложения, т.е. назначение каждого сообщения должно быть заранее известно для задачи-отправителя и задачи-получателя. Эти сообщения передаются асинхронно, могут иметь любой тип данных и произвольную длину. Тем са м ы м д ля приложения обеспечивается максимальнал гибкость. Аналога м и отправляе м ых РУМкюоб щ ений являются принимаемые PVM-сооб щ ения. Так, за прие м сооб щ ений «отвечают» пять основных функций.
Синопсис
# inc lude " pvm3 . h»
int pvm_recv(int taskid, int messageid) ;
int pvm_nrecv(int taskid, int messageid) ;
int pvm_precv(int taskid, int messageid, char *buffer,
int size,int type, int sender,
Читать дальшеИнтервал:
Закладка: