Язык "Concurrent Prolog". Язык " *Lisp" ( "Star-Lisp")
Язык "Concurrent Prolog" является расширением логического языка "Prolog" и предназначен для параллельного программирования логических систем. В соответствии с тремя основными логическими операциями (унификация, "и"-объединение "and", "или"-объединение "or") в языке "Concurrent Prolog" имеются три возможных способа параллельной обработки предложений:
а) параллельная унификация, при которой могут параллельно обрабатываться как пара отдельных параметров логического предложения, так и комплексные параметры с многими ПЭ (рекурсивно);
б) "и" ("and")–параллельность, при которой логические предложения (в правилах или запросах) объединяются логической операцией "i" и могут оцениваться параллельно, если они не зависят друг от друга, т.е. если они не содержат совместных свободных переменных;
в) "или" ( "or")–параллельность, при которой несколько правил или фактов, относящихся к одному и тому же предложению (логическому выражению), могут обрабатываться одновременно.
В языке "Concurrent Prolog" логическое предложения разделяется на две группы: Guard и Body, которые разделяются Commit-оператором:
A G1 … Gm | B1 … Bn ( m, n > 0)
Goal Guard Commit Body
Применение "or"– параллельности допускается только в пределах группы Guard. Первая успешно обработанная группа Guard выполняет Commit-операцию и останавливает ею все другие "or"– параллельные процессы.
Группа Body обрабатывается "i"–параллельно в пределах, допустимых с точки зрения синхронизации взаимозависимых логических предложений, которая обеспечивается с помощью так называемых "read-only" - переменных, обозначаемых знаком вопроса "?". Процесс, обратившийся с целью чтения к "read-only"-переменной, которая в этот момент еще не определена, блокируется до тех пор, пока эта переменная синхронизации получит определение от другого предложения-процесса.
Ниже приведен пример использования языка "Concurrent Prolog" при программировании скалярного произведения (каждый оператор записывается в отдельной строке):
Вызов программы: s_prod ( [1,2,3], [4,5,6], SP). Þ SP=32
s_prod ( [ ], [ ], 0 ):- | s_prod ( [H1 | T1], [H2 | T2 ], X ):- |
X:= H1* H2 + Rest?, s_prod ( T1?, T2?, Rest ).
В этом примере Commit-оператор предотвращает ненужный поиск альтернативного предложения (ограничения "or"– параллельности), поскольку здесь нет множества предложений с одинаковым заголовком. Оба предложения (присвоения и рекурсивного вызова) выполняются параллельно, причем операция присвоения должна подождать, пока ее переменная синхронизации Rest? не примет числового значения от рекурсивного вызова процедуры s_prod.
Язык " *Lisp" ( "Star-Lisp"). Язык "*Lisp" ( "Star-Lisp") базируется на языке "Common Lisp" и содержит следующие параллельные конструктивы, встроенные в "Lisp"-среду:
а) параллельные системные функции с префиксом "*" в скалярной или векторной версиях;
б) параллельные операторы с суффиксом "!!" в скалярной или векторной версиях;
в) функции def-vp-set ("define virtual processor set") совместно с машинно-зависимой функцией greate-geometry, позволяющие выделять из общих процессорных структур определенные группы (многомерные блоки) программных элементов (ПЭ).
Собственный номер каждого ПЭ может быть получен с помощью таких функций:
self!! – выдает адресный объект, который охватывает все размерности декларированной решетки;
self_adress!! - выдает "адрес отправителя" для каждого ПЭ;
self_address_grid!!(!!n) - выдает адресный объект только для n-мерной решетки;
Для локальной передачи данных через быструю решетчатую структуру используется конструктив *news, который выполняет локальный обмен данными вдоль решетки между выражением-источником и целевой переменной величиной. Конструктив news!! возвращает назад "локально перемещенные" данные выражения-источника.
Для глобальной передачи данных через медленный маршрутизатор применяется конструктив *pset, выполняющий глобальный обмен данными между отправителем и целевой переменной величиной, а также конструктив pref!, который возвращает назад "глобально обмененные" данные отправителя.
Редукция вектора в скаляр осуществляется с помощью стандартных функций:
*and *or *xor *logand *logior *logxor *sum *min *max *integer-lehgth
Индикация булевого численного значения всех физических ПЭ осуществляется с помощью функции *light.
Ниже приведен пример использования языка "*Lisp" при программировании оператора Лапласа (каждый оператор "*Lisp" записывается в отдельной строке):
(def-vp-set grid ’ (100) (100)) (*defvar pixel) …
( with vp-set grid) (*setpixel (-!! (*!!pixel (!! 4))
(news!!pixel 0 1) (news!!pixel 0 -1) (news!! pixel 1 0) (news!! pixel -1 0))))
Дата добавления: 2023-01-28; просмотров: 354;