Подпрограмма pvm_mytid() возвращает TID текущего
процесса и может вызываться неограниченное число раз. Она регистрирует
данный процесс в ПВМ - если это первый вызов ПВМ. Любой системный
вызов ПВМ (не только pvm_mytid) будет регистрировать задачу
в ПВМ, если перед этим вызовом задача не зарегистрирована, но общая
практика требует для обеспечения регистрации вызова pvm_mytid.
int info = pvm_exit(void)
call pvmfexit(info)
Подпрограмма pvm_exit сообщает локальному pvmd
о том, что процесс "покинул" ПВМ. Эта подпрограмма не завершает
процесс принудительно - он может продолжать выполнять задачу наряду
с другими процессами UNIX. Пользователи обычно вызывают pvm_exit
прямо перед выходом - в своих программах на C и прямо перед STOP
- в своих программах на Fortran.
int numt = pvm_spawn (char *task, char **argv, int flag,
Подпрограмма pwm_spawn запускает до ntask копий
исполняемого файла task на виртуальной машине. argv
- это указатель на массив аргументов для task, причем конец
массива указывается с помощью NULL. Если задача не получает
аргументы, то argv равняется NULL. Аргумент flag
используется для указания опций, которые обобщены в табл. 12.
Табл. 12. Опции порождения потомков в PVM.
Значение
Опция
Cмысл
Эти имена предопределены в pvm3/include/pvm3.h. На Fortran
все имена предопределяются в параметрических конструкциях, которые
могут быть найдены в секции include файла pvm3/include/pvm3.h.
PvmTaskTrace - это новая возможность ПВМ версии 3.3. Она
заставляет порождаемые задачи генерировать трассировочные события.
PvmTaskTrace используется XPVM. Иначе, пользователь должен
с помощью pvm_setopt() указать, когда генерировать трассировочные
события.
При возврате, numt присваивается количество успешно порожденных
задач или код ошибки, если ни одна из задач не смогла стартовать.
Если задачи были запущены, то pwn_spawn вернет вектор, состоящий
из идентификаторов порожденных задач; если не смогли стартовать лишь
некоторые задачи, соответствующие коды ошибок помещаются в последние
ntask - numt позиций вектора.
Вызов pvm_spawn() может также запускать задачи и на мультипроцессорах.
В случае с Intel iPSC/860 накладываются следующие ограничения. Каждый
порождающий вызов получает подкуб размера ntask и загружает
программу task во все соответствующие станции. ОС iPSC/860
имеет распределительное ограничение: 10 подкубов для всех пользователей,
так что лучше запустить блок из задач в iPSC/860 одним вызовом, чем
несколькими. Два самостоятельных блока задач, порожденные в iPSC/860
раздельно, все равно могут взаимодействовать друг с другом так же,
как и с другими задачами ПВМ, даже считая, что они существуют в разных
подкубах. ОС iPSC/860 имеет еще одно ограничение: сообщения, следующие
от станций во "внешний мир" должны быть меньше, чем 256 КБайтов.
int info = pvm_kill (int tid)
call pvmfkill (tid, info)
Подпрограмма pvm_kill() принудительно завершает некоторую
задачу ПВМ, идентифицированную TID. Эта подпрограмма разработана
для принудительного завершения задач, которые должны завершаться вызовами
pvm_exit(), следующими за exit().
int info = pvm_catchout (FILE *ff)
call pvmfcatchout (onoff)
По умолчанию ПВМ записывает stdout и stderr порожденных
задач в файл протокола /tmp/pvml.<uid>. Подпрограмма pvm_catchout
заставляет вызывающую задачу "захватывать" выходной поток последовательно
порожденных задач. Символы, выводимые в stdout или stderr
дочерних задач, собираются демонами pvmd и отсылаются в форме
сообщений родительской задаче, которая "метит" каждую строку
и добавляет ее в указанный файл (для C) или выводит в стандартный
поток вывода (для Fortran). Все выводимое на экран предваряется информацией
о том, какая из задач сгенерировала вывод на экран, а завершение каждого
вывода метится с целью помочь разграничить "перекрывающиеся"
выходные потоки нескольких задач.
Если pvm_exit вызывается предком тогда, когда активен сбор
выходных потоков, он будет блокироваться до тех пор, пока все выводящие
задачи не отработают - в том порядке, в котором они осуществляли весь
свой вывод. Во избежание такой ситуации, можно "выключить сбор
выходных потоков" вызовом pvm_catchout(0) перед тем, как
вызвать pvm_exit.
Новые возможности ПВМ версии 3.3 включают и возможность регистрировать
специальные задачи ПВМ для обработки заданий по включению новых хостов,
размещению задач на хостах и запуску новых задач. С этой целью создается
интерфейс для "продвинутых" пакетных планировщиков (примерами
могут быть Condor, DQS и LSF), которые подключаются к ПВМ и позволяют
выполнять задания ПВМ в пакетном режиме. Такие регистрирующие подпрограммы
также создают интерфейс для разработчиков отладчиков - для стимулирования
удовлетворительных разработок сложных отладчиков специально для ПВМ.
Имена таких подпрограмм: pvm_reg_rm(), pvm_reg_hoster()
и pvm_reg_tasker(). Эти "продвинутые" функции не
имеют значения для среднестатистического пользователя ПВМ и потому
здесь подробно не представляются.
Знаете ли Вы, что оптимум по Парето - это вектор x* О X, доставляющий заданной вектор-функции f(x) значение, для которого не найдётся такого e R 0, чтобы выполнялось следующее: x*+e О X, ни один компонент f(x*+e) не меньше соответствующего компонента f(x) и хотя бы один компонент больше.