В этом разделе приведено ознакомительное описание подпрограмм ПВМ версии 3. Раздел отсортирован по функциям, выполняемым подпрограммами. Например, в подразделе об "обмене сообщениями" ведется речь обо всех подпрограммах передачи и приема данных между двумя задачами ПВМ и опциях обмена сообщениями ПВМ.
В ПВМ версии 3 все задачи ПВМ идентифицируются с помощью целого числа, предоставляемого pvmd. Далее по тексту, такой идентификатор задачи обозначается TID. Это обозначение похоже на обозначение идентификатора процесса (PID), используемое в системе UNIX, предполагающее прозрачность для пользователя; значение TID так же не имеет специального значения для пользователя. Фактически, ПВМ кодирует информацию в TID для своего собственного внутреннего использования.
Все подпрограммы ПВМ написаны на C. Приложения на C++ могут компоноваться с библиотекой ПВМ. Приложения на Fortran могут вызывать эти подпрограммы посредством интерфейса Fortran 77, поддерживаемого исходными текстами ПВМ версии 3. Данный интерфейс переводит аргументы, которые переданы при обращении на Fortran в соответствующие значения - если это нужно - для находящихся в более низком слое C-подпрограмм. Интерфейс так же затрагивает формы представлений символьных строк на Fortran и различные соглашения при именовании, которые разные Fortran-компиляторы используют при вызове C-функций.
В коммуникационной модели ПВМ принято, что любая задача может передавать сообщение любой другой задаче ПВМ и нет никаких ограничений на длину и количество таких сообщений. В то время, как все хосты имеют лимиты физической памяти, которые ограничивают потенциальное буферное пространство, коммуникационная модель не ограничивается этими частичными машинными лимитами, а подразумевает доступность и достаточность памяти. Таким образом, коммуникационная модель ПВМ предоставляет функции асинхронной блокирующей передачи, асинхронного блокирующего приема и неблокирующего приема. Согласно нашей терминологии, блокирующая передача - это задача, которая завершается так быстро, как освобождается для повторного использования буфер передачи, а асинхронная передача - передача, которая не зависит от состояния приемника, вызвавшего соответствующий прием до того, как передача завершится. В ПВМ версии 3 есть опции, которыми указывается, что данные должны передаваться прямо от задачи к задаче. В этом случае, если сообщение большое, передатчик может блокироваться до тех пор, пока приемник не вызовет соответствующий прием.
Неблокирующий прием непосредственно возвращает либо данные, либо флаг, говорящий о том, что данные не прибыли, в то время, как блокирующий прием завершается только после того, как данные появились а буфере приема. В дополнение к приведенным коммуникационным функциям типа "точка к точке", модель поддерживает широковещательную передачу набору задач, в частности определенной пользователем группе задач. Имеются так же функции для нахождения глобального максимума, вычисления глобальной суммы и др., приемлемые для группы задач. Специальные символы и метки могут использоваться для указания источника при приеме, тем самым, позволяя игнорировать контекст полностью или по частям. Подпрограмма может вызываться и с целью получения информации о принятых сообщениях.
Модель ПВМ гарантирует сохранение порядка сообщений. Если задача 1 посылает сообщение A задаче B, а затем эта же задача посылает сообщение B той же задаче, то сообщение A поступит задаче раньше, чем сообщение B. Более того, если оба сообщения возникнут до того, как задача 2 выполнит прием, то прием с указанием специальных символов будет всегда возвращать сообщение A.
Буферы сообщений распределяются динамически. Однако, максимальная длина сообщения, которое может быть передано или принято, ограничивается только объемом доступной памяти на данном хосте. В ПВМ версии 3.3 встроен только "ограничительный" текущий контроль. ПВМ может выдавать пользователю ошибку "Can't get memory" в тех случаях, когда суммарный объем входящих сообщений превышает размер доступной памяти, но при этом ПВМ не просит другие задачи остановить передачу для данного хоста.