1.6.4 Упаковка данных
Для FORTRANа существует только одна функция, которая управялет упаковкой данных всех типов.
callpvmfpack( what, xp, nitem, stride, info )
В пареметре what указывается тип упаковываемых данных. Параметр xp является первым элементом массива данных. Пареметры nitem и stride описаны выше. Параметр info - возвращаемое значение. Значения параметра what представлены в следующей таблице:
STRING 0 REAL4 4
BYTE1 1 COMPLEX8 5
INTEGER2 2 REAL8 6
INTEGER4 3 COMPLEX16 7
Константы, соответствующие значениям параметра what определены в файле pvm3/include/fpvm3.h. Некоторые производители могут расширять этот список дополнительными данными, например INTEGER8, REAL16 и др.
Приведем пример использования всех этих функций:
CALL PVMFINITSEND(PVMRAW, INFO)
CALL PVMFPACK( INTEGER4, NSIZE, 1, 1, INFO )
CALL PVMFPACK( STRING, `row 5 of NXN matrix', 19, 1, INFO )
CALL PVMFPACK( REAL8, A(5,1), NSIZE, NSIZE , INFO )
CALL PVMFSEND( TID, MSGTAG, INFO )
Приемипосылкаданных
call pvmfsend( tid, msgtag, info )
call pvmfmcast( ntask, tids, msgtag, info )
Функция pvm_send() помечает сообщение тагом msgtag и выполняет немедленную пересылку данных процессу с соответствющим идентификатором tid.
Функция pvm_mcast() помечает сообщение тагом msgtag и выполняет немедленную пересылку данных все процессам, имеющим идентификаторы, совпадающими со значениями, хранящимися в массиве tids. Длина массива tids равна ntask.
Следующие функции предназначены для совмещения работы по упаковке данных и их пересылке:
call pvmfpsend( tid, msgtag, xp, cnt, type, info )
Эти функции упаковывают массив определенного параметром type типа в буфер и передают его процессу, идентифицированному параметром tid. В FORTRANе типы данных определены так же, как и для процедуры pvmfpack().
Система PVM содержит несколько методов для организации приема сообщений. Причем отсутствует соотыктствие функций. То есть нет такого ограничения, когда сообщение, посланное процедурой pvm_psend должно быть обязательно принято процедурой с именем тип pvm_precv. Вне зависимости от того, как было послано сообщение, принято оно может быть либым из возможных вариантов. То же замечание касается адресной и мультикастной (multicast) передачи.
Следующие процедуры осуществляют блокирующий прием сообщений:
call pvmfrecv( tid, msgtag, bufid )
Эти процедуры инициируют процесс ожидания поступления сообщения, помеченного тагом msgtag от процеса с идентификатором tid (если сообщение еще не пришло). В случае, когда значения параметров tid и/или msgtag равны -1, осуществляется ожидание сообщения от любого процесса и/или сообщения с любым тагом.
После того, как сообщение получено, эти процедуры возвращают управление вызвавшей их программе, передав в bufid идентификатор буфера, в который помещено полученное сообщение. Значение bufid<0 сигнализирует о возникшей ошибке. Аналогом блокирующей функции являются функция
call pvmfnrecv( tid, msgtag, bufid )
Параметры и возвращаемое значение этой функции аналогичны используемым в блокирующей функции. Отличие заключается в том, что вызов pvm_nrecv не инициирует процесс ожидания сообщения. В случае, если ожидаемое сообщение еще не поступило, в bufid возвращается 0. Функция pvm_nrecv может быть вызвана в процессе счета неоднократно.
В случае, когда ожидание сообщения не должно прерывать выполнение программы, для проверки факта получения сообщения можно использовать слудующую функцию:
call pvmfprobe( tid, msgtag, bufid )
Если ожидаемое сообщение еще не пришло, эта функция возвращает bufid=0. По пришествии сообщения в bufid возвращается значение отличное от нуля. Функцию можно вызывать неоднократно, заполняя время между вызовами какой-либо другой продуктивной работой. Функция pvm_probe не получает сообщение, для его получение необходимо воспользоваться одной из соответствующих функций.
Вместо последовательного вызова процедур блокирующего приема сообщения и распаковки буфера с извлечением данных в локальные переменные можно использовать функцию
call pvmfprecv( tid, msgtag, xp, cnt, type, rtid, rtag, rcnt, info )
Эту функцию можно использовать для приема сообщений, в которых содержатся однотипные данные. Вызов этой функции инициирует процесс ожидания сообщения, помеченного тагом msgtag от процесса с идентификатором tid. По поступлении сообщения pvm_precv распаковывает данные общим объемом len * (size of data type) в буфер buf.
Типы данных в FORTRAN-программах такие же, как это дано в описании функции pvmfpack.
Описание параметров функций:
tid ID процесса откуда мы ждем сообщение. "-1" означает "любой процесс".
msgtag Ожидаемый таг сообщения. "-1" означает "любое сообщение".
vp Указатель на массив (переменную) куда будут помещены полученные данные.
xp Массив (переменная) куда будут помещены полученные данные. (FORTRAN)
cnt Количество ожидаемых элементов указанного типа.
type Тип получаемых данных (см. выше).
rtid Возвращаемый параметр. ID процесса, откуда пришло сообщение.
rtag Возвращаемый параметр. Таг (метка) полученного сообщения.
rcnt Возвращаемый параметр. Длина полученного сообщения (кол-во элементов).
info Содержит на выходе PvmOk если все нормально и отрицательное значение в случае ошибки.
1.6.5 Распаковка полученных данных
Функции распаковки данных, записанных в приемном буфере, применяются в той же последовательности, в какой применялись функции упаковки данных в посылаемое сообщение.
call pvmfunpack( what, xp, nitem, stride, info )
Параметр xp - массив, куда будут помещены распакованные данные.
Параметры nitem и stride имеют тот же смысл, что и в соответствующих функциях упаковки (см. выше).
Параметр what был так же описан выше.
1.6.6 Отладка в PVM
По умолчанию только текст, выводимый родительской задачей (то есть той, которую вы сами запустили с терминала) окажется на экране. Стандартный вывод задач, запускаемых функцией pvm_spawn(), по умолчанию перенаправляется в LOG-файл исполняющей системы PVM ($PVM_TMP/pvml.*). Функция
callpvmfcatchout( onoff, info )
позволяет перенаправить его в любой другой открытый для записи файл, например, фрагмент
call pvmfcatchout (1, info);
callpvmfspawn (...
в родительской задаче весь вывод от всех запускаемых под-задач перенаправит на экран. При этом PVM гарантирует, что строки от разных задач не будут "налезать" одна на другую, и каждая строка будет предваряться идентификатором той задачи, которая ее вывела. Использование pvm_catchout() имеет два недостатка: а) между посылкой строки в файл или на экран из под-задачи и ее фактическим там появлением может быть задержка неизвестной заранее длительности, и, б) если объем выводимой диагностики от разных задач очень велик, очень трудно разобраться в поведении какой-то одной конкретной задачи.
1.6.7 Установка PVM
Установка системы PVM на компьютере, работающем под управлением операционной системы Linux достаточно проста и не требует каких либо длительных настроек. Cистема PVM распространяется бесплатно и в исходных кодах. Исходники PVM вы можете найти на этом сайте или непосредственно на сайте разработчиков по адресу http://www.netlib.org/pvm3/index.html.
Для установки PVM в вашей системе необходимо создать каталог, где будет располагаться система PVM. Будем считать, что мы устанавливаем PVM в каталог /pvm3. В этот каталог вы должны распаковать архив с исходниками системы.
tarzxvfpvm3.3.4.tgz
Перед сборкой и запуском PVM вы должны установить переменную окружения $PVM_ROOT, указав в ней полный путь к каталогу, в котором хранится система. Если вы используете в качестве командной оболочки csh, вам необходимо добавить следующую строку в файл .cshrc:
setenvPVM_ROOT=/pvm3
Если же вы используете оболочки, которые используют .profile, наприемр sh или ksh, или bash, которая использует .bashrc, тогда добавьте в соответствующий файл такую команду:
exportPVM_ROOT=/pvm3
Так же вы должны определить другие переменные окружения, необходимые для функционирования PVM, добавив после команды определения PVM_ROOT содержимое соответствующих командной оболочке файлов: pvm3/lib/cshrc.stub, pvm3/lib/kshrc.stub или pvm3/lib/bashrc.stub.
По умолчанию PVM использует протокол rsh для общения с другими компьютерами кластера. Если вы хотите rsh заменить на ssh, вы должны изменить файл /pvm3/conf/LINUX.def, прописав в переменной ARCHCFLAGS параметр RSHCOMMAND, определив для него полный путь к команде ssh (например /usr/bin/ssh). Например на моем кластере файл /pvm3/conf/LINUX.def выглядит так:
#
ARCHCFLAGS = -DSYSVSIGNAL -DNOWAIT3 -DRSHCOMMAND=\"/usr/bin/ssh\" \
-DNEEDENDIAN -DFDSETNOTSTRUCT -DHASERRORVARS \
-DCTIMEISTIMET -DSYSERRISCONST -DNOTMPNAM
ARCHDLIB =
ARCHDOBJ =
ARCHLIB =
HASRANLIB =t
AR =ar
PVM_ARCH =LINUX
MAKE =make
В дальнейшем будем считать, что виртуальная машина была собрана именно с такими изменениями, то есть с заменой rsh на ssh.
После изменения всего того перелогинтесь в систему, чтобы изменения, сделанные вами в профайлах вступили в силу.
Для сборки и установки PVM, находясь в каталге /pvm3, выполните команду make. По окончании ее работы система PVM готова к запуску. Следует отметить, что для уменьшения проблем, связаных с настройкой PVM на узлах кластера, на всех машинах кластера PVM следует устанавливать в один и тот же каталог.
Глава 2. Обучение будущих учителей сетевому администрированию
В настоящее время использование локальных и глобальных сетей компьютеров является повсеместной. Локальные сети, в настоящее время, стали практически единственным способом организации работы персональных компьютеров. Но знания об их организации, о технических особенностях их функционирования и управление ими остаются до сих пор в основном уделом профессионалов.