<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Асинхронная модель вычислений с управлением на основе строгого частичного порядка</article-title>
      </title-group>
      <pub-date>
        <year>2016</year>
      </pub-date>
      <fpage>54</fpage>
      <lpage>67</lpage>
      <abstract>
        <p>Дальневосточный федеральный университет В статье предлагается асинхронная модель вычислений, отличительной особенностью которой является управление на основе строгого частичного порядка. Показано, что такой способ задания управления обладает рядом преимуществ для параллельных вычислений, в частности, позволяет представлять алгоритмы с высокой степенью непроцедурности, а также полностью отделяет управление от вычислений. Разработан алгоритм преобразования этой модели в известную асинхронную модель с управляющими операторами. На базе предложенной модели разработана и реализована система программирования Аспект. Ключевые слова: асинхронная модель вычислений, язык параллельного программирования, представление алгоритмов с высокой степенью непроцедурности.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>agora.guru.ru/pavt
ности представления алгоритмов через явное задание информационных и управляющих
зависимостей. За счет этого, а также за счет специализации системы на решении задач
численного моделирования, планируется добиться высокого качества автоматически
конструируемых параллельных программ, в том числе, возможности адаптации к различным
аппаратным архитектурам.</p>
      <p>Одной из задач в рамках поставленной цели является разработка подходящей модели
параллельных вычислений. Ее обсуждению и посвящена статья.
2. Асинхронная модель вычислений
2.1. Простая асинхронная модель вычислений
блоков, A = \bigl{ Ak | k \in 1, n\bigr} .</p>
      <p>
        Асинхронная модель вычислений была впервые предложена в работе [
        <xref ref-type="bibr" rid="ref3">6</xref>
        ] в
результате исследований принципов программирования для вычислительных устройств, способных
производить параллельную обработку информации.
      </p>
      <p>Асинхронная программа (или А-программа ) представляет собой набор P = (M, A), где
M – конечное множество переменных, M = \{ x1, x2, . . . , xm\} ; A – конечное множество
АМножество M называется памятью. Память состоит из переменных с неразрушающим
чтением и записью, стирающей предыдущее содержимое переменной. Выделяется
информационная IM и управляющая CM памяти: M = IM \cup CM .</p>
      <p>Каждый А-блок Ak образован четверкой (Mk, Tk, Ok, Ck), где Mk — подмножество
памяти M , используемое А-блоком Ak, причем Mk = TkIn \cup OkIn \cup OkOut \cup CkIn \cup CkOut, TkIn \subetq
M ,</p>
    </sec>
    <sec id="sec-2">
      <title>OkIn \subetq</title>
    </sec>
    <sec id="sec-3">
      <title>IM , OkOut \subetq</title>
    </sec>
    <sec id="sec-4">
      <title>IM , CkIn \subetq</title>
    </sec>
    <sec id="sec-5">
      <title>M , CkOut \subetq</title>
      <p>CM ; Tk — спусковая функция (или
триггерфункция), представляющая собой предикат Tk(x1, x2, . . . , xl), xi \in TkIn, i = 1, l; Ok —
операция, которая по значениям входных переменных x1, x2, . . . , xm вычисляет значения
выходных переменных y1, y2, . . . , yn, xi \in</p>
    </sec>
    <sec id="sec-6">
      <title>OkIn, yj \in</title>
      <p>OkOut, i = 1, m, j = 1, n; Ck — управляющий
оператор, который по значениям входных переменных x1, x2, . . . , xp вычисляет значения
выходных переменных y1, y2, . . . , yq, xi \in</p>
    </sec>
    <sec id="sec-7">
      <title>CkIn, yj \in</title>
      <p>CkOut, i = 1, p, j = 1, q. Под
«вычислением» понимается вычисление одной или несколких частично рекурсивных функций.</p>
      <p>Асинхронный вычислительный процесс — это множество T процессов \{ t1, t2, . . . , tn\} ,
где каждый процесс ti исполняет некоторый А-блок Ak, то есть вычисляет его операцию
Асинхронная система (или А-система ) есть набор правил, позволяющих произвести
Ok, а затем — управляющий оператор Ck.
вычисления для заданной А-программы P :
1. В произвольный момент времени вычисляются триггер-функции А-блоков из
некоторого непустого подмножества A\prime множества A-блоков A и формируется множество
= \bigl{ Ak | Ak \in A\prime
w\edg Tk = ИСТИНА, k = 1, n\bigr} ,
готовых к исполнению А-блоков A\prime :</p>
      <p>A\prime
A\prime
s\ubetq A, A\prime
s\ubetq</p>
      <p>A\prime .
2. Из множества готовых А-блоков A\prime выделяется некоторое подмножество A\prime , А-блоки
которого запускаются на исполнение. Для каждого А-блока создается
соответствующий процесс. Процессы исполняются независимо друг от друга.
3. Исполнение А-программы завершается, когда ни один процесс не исполняется и
значения триггер-функций всех А-блоков ложны.
Правила формирования множеств A\prime и</p>
      <p>A\prime асинхронной системой не регламентируются.
2.2. Асинхронная модель вычислений с массовыми операциями
С точки зрения параллельных вычислений, простая асинхронная модель вычислений
имеет тот недостаток, что она не позволяет явно описывать массовые вычисления. Их либо
приходится программировать внутри А-блоков, что скрывает большую часть параллелизма
алгоритма, либо необходимо задать фиксированное количество одинаковых А-блоков, что
не позволяет обрабатывать данные неизвестной длины, а также существенно увеличивает
размер программы.</p>
      <p>
        Для преодоления этих недостатков в [
        <xref ref-type="bibr" rid="ref4">7</xref>
        ] предложена асинхронная модель вычислений
с массовыми операциями , которая расширяет простую асинхронную модель вычислений
следующим образом:
b\ulet экземпляры А-блока обязательно отличаются хотя бы одним входным
параметром: OkiIn \not= OkjIn, причем различаться могут только компоненты одноименных
массивов;
b\ulet количество входных и выходных параметров всех экземпляров одного А-блока
совпадает: (| OkiIn| = | OkjIn| ) \wedg (| OkiOut| = | OkjOut| ).
      </p>
      <p>Здесь i \in \BbN , j \in \BbN , i n\ot= j.
3. Значение триггер-функции проверяется для всех невыполняющихся экземпляров Ai .
k
Любой экземпляр Aik с истинным значением триггер-функции Tki может начать
исполнение, которое состоит в исполнении операции Oki, а затем управляющего оператора
Ci .</p>
      <p>k
2.3. Асинхронная модель вычислений с управлением на основе строгого
частичного порядка
В моделях, описанных выше, управление полностью определяется управляющими
операторами и скрыто внутри них, что делает эту информацию недоступной для анализа,
который необходим для автоматизированного распределения ресурсов. Кроме того, для
повышения уровня параллельного программирования необходимы более явные средства
задания управления.</p>
      <p>Асинхронная модель вычислений с управлением на основе строгого частичного порядка
отображает информацию об управлении на уровне модели, изменяя асинхронную модель
вычислений с массовыми А-блоками следующим образом:
i</p>
      <p>k
1. Экземпляр А-блока Aik описывается четверкой (Mki, Tki, Oki, Rki), где Mki, Tki и Oki имеют
прежнее значение, а Rki есть строгий частичный порядок, заданный на подмножестве
Cki экземпляров А-блоков А-программы A: \lange Cki , Rki\rangle , которое будем также обозначать
l\ange Cki , &lt;\rangle . Rk = \bigcup Rki, R = \bigcup Rk.
2. Каждый экземпляр А-блока исполняется не более одного раза. Многократное
исполнение простого А-блока можно представить в виде одного массового А-блока (если
снять ограничение на то, что экземпляры А-блока обязательно отличаются хотя бы
одним входным параметром, то есть требование Mki \not= Mkj исчезает), где каждому
исполнению простого А-блока соответствует один экземпляр массового А-блока. Такое
изменение позволяет однозначно идентифицировать исполнение любого экземпляра
его именем, что необходимо для задания управления частичным порядком.</p>
      <p>
        А-программа, определенная таким образом, позволяет определить любую частично
рекурсивную функцию даже в случае, когда операции экземпляров А-блоков реализуют лишь
простейшие вычислимые функции. Доказательство этого факта можно найти в [
        <xref ref-type="bibr" rid="ref5">8</xref>
        ].
      </p>
      <p>
        Степень непроцедурности представления алгоритмов в асинхронной программе можно
регулировать на двух уровнях:
b\ulet первоначальная степень непроцедурности определяется программистом при разбиение
алгоритма на А-блоки;
b\ulet при конструировании параллельной программы имеется возможность уменьшить
степень непроцедурности за счет группировки [
        <xref ref-type="bibr" rid="ref6">9</xref>
        ], что может существенно сократить
накладные расходы на исполнение параллельной программы.
3. Конструирование асинхронных программ
      </p>
      <p>Реализация управления в асинхронной модели вычислений на основе строгого
частичного порядка может быть выполнена во время исполнения программы в режиме
интерпретации, однако более эффективно до начала исполнения сгенерировать специализированный
код, который реализует корректное управление. Для этого необходимо формально
определить содержимое управляющих операторов, а также разработать алгоритмы,
позволяющие автоматически преобразовывать управление на основе строгого частичного порядка в
управление на основе управляющих операторов.
3.1. Определение управляющего оператора</p>
      <p>
        Признак завершения А-блока . Это формальное определение было предложено в
работе [
        <xref ref-type="bibr" rid="ref7">10</xref>
        ]. Каждому экземпляру Aik в управляющей памяти ставится в соответствие
переменная логического типа, которую будем называть признаком завершения экземпляра Aik и
обозначать P (Aik). Истинность значения переменной P (Aik) означает, что экземпляр Aik
завершил исполнение. Если значение переменной ложно, то экземпляр может быть неготовым
к исполнению, готовым к исполнению либо исполняться. В начальном состоянии памяти
P (Aik) = ЛОЖЬ для всех Aik, Ak \in A, k = 1, n.
      </p>
      <p>Управляющий оператор Cki присваивает переменной P (Aik) значение ИСТИНА,
проверяет все экземпляры, которые могут начать исполнение после завершения Aik, и добавляет
в множество готовых экземпляров те из них, у которых признак завершения всех
предшествующих экземпляров имеет значение ИСТИНА и которые имеют истинное значение
триггер-функции.</p>
      <p>А-программа представляет собой набор P = (M, A, A0), где M и A имеют прежнее
значение, а A0 есть множество А-блоков, готовых к исполнению сразу после старта
Апрограммы.
Достоинства:
b\ulet независит от типа переменной (простая, структурная);
b\ulet независит от типа управления (прямое, потоковое);
b\ulet объем управляющей памяти зависит от количества А-блоков.
Недостатки:
b\ulet в случае реализации экземпляра А-блока с помощью А-программы, невозможно
отслеживать вычисление отдельных переменных, а только всех переменных целиком;
b\ulet чем больше зависимостей у экземпляра А-блока, тем сложнее вычислить
триггерфункцию.</p>
      <p>Признак готовности переменной . Каждой переменной xj \in M в управляющей памяти
ставится в соответствие переменная логического типа, которую будем называть признаком
готовности переменной xj и обозначать P (xj). Если xj — структурная переменная, то
каждому компоненту x\=[j] ставится в соответствие собственный признак готовности P (x\=[j]).
Истинность переменной P (xj) означает, что переменная xj вычислена. В начальном
состоянии памяти P (xj) = ИСТИНА для переменных, содержащих исходные данные задачи и
P (xj) = ЛОЖЬ для всех остальных переменных, xj \in M , j = 1, m.</p>
      <p>Управляющий оператор Cki присваивает всем переменным P (xq), где xq \in OkiOut
значение ИСТИНА, проверяет все экземпляры, которые могут начать исполнение после
завершения Aik, и добавляет в множество готовых экземпляров те из них, у которых признак
готовности всех входных переменных имеет значение ИСТИНА и которые имеют истинное
значение триггер-функции.</p>
      <p>Достоинства:
b\ulet возможно запускать зависимые блоки по мере вычисления переменных.
Недостатки:
b\ulet чем больше входных переменных, тем сложнее вычислить триггер-функцию (если
входная переменная А-блока является структурной, необходимо проверить готовность
всех ее компонент);
b\ulet объем управляющей памяти зависит от количества переменных;
b\ulet затруднена реализация прямого управления, когда информационные зависимости
между А-блоками отсутствуют.</p>
      <p>Подход на основе признаков готовности переменной хорошо подходит для
теоретических работ. С точки зрения практической реализации более перспективен подход на основе
признаков завершения А-блоков. Определим для него А-систему асинхронной модели
вычислений с массовыми А-блоками через набор правил:
1. В пустое множество готовых экземпляров A\prime включаются все экземпляры из
множества A0, у которых истинно значение триггер-функции: A\prime = \{ Ak | Tki = ИСТИНА, Ak \in
i</p>
      <p>A0\} .
2. Из множества готовых экземпляров A\prime выбирается некоторое подмножество A\prime ,
экземпляры которого запускаются на исполнение. Для каждого экземпляра А-блока
создается процесс tk,i, который вычисляет его операцию Oi , а затем управляющий
k
оператор Ci . В результате в множество A\prime , возможно, будут добавлены новые
экземk
пляры. Каждый экземпляр А-блока выполняется не более одного раза.
3. Выполнение А-программы завершается, когда множество A\prime становится пустым и не
существует исполняющихся процессов.
3.2. Алгоритм конструирования управляющих операторов</p>
      <p>Для автоматического конструирования управляющих операторов, определенных через
признак завершения А-блока, предлагается использовать следующий алгоритм:
ВХОД : асинхронная программа P с управлением на основе строгого частичного порядка,
экземпляр А-блока Ai .</p>
      <p>k
ВЫХОД : код управляющего оператора Cki для экземпляра А-блока Ai .
k
ШАГИ :
1. Генерируется команда, которая установит признак завершения для Aik в значение
ИСТИНА.
2. Формируется множество S экземпляров А-блоков, зависящих от Aik: S = \{ Slj | Aik &lt;
Sj, Slj \in A, (Aik, Slj) \in R}\ . В результате исполнения экземпляра Aik каждый экземпляр
l</p>
      <p>Slj потенциально может стать готовым к исполнению.
3. Для каждого экземпляра Slj:
b\ulet формируется множество U экземпляров А-блоков, которые должны исполниться
до запуска Slj: U = \{ Uqp | Uqp &lt; Slj, Uqp \in A, (Uqp, Slj) \in R}\ ;
b\ulet генерируется команда создания переменной с именем f lagjl и ей присваивается
значение ИСТИНА;</p>
      <p>p
b\ulet для каждого элемента Uq \in U генерируется команда, объединяющая значение
признака завершения P(Uqp) со значением переменной f lagjl по принципу И;
b\ulet генерируется набор команд, который:
– проверяет значение переменной f lagjl;
– если оно истинно, проверяет значение триггер-функции Tlj экземпляра Slj;
– если значение триггер-функции Tlj истинно, добавляет экземпляр Slj в
множество готовых к исполнению экземпляров.</p>
      <p>Для правильного функционирования алгоритма необходимо обеспечить корректную
синхронизацию. Действительно, пусть R = \{ (A &lt; C), (B &lt; C)\} и пусть исполнение
экземпляров A и B находится на стадии исполнения их управляющих операторов, причем уже
выполнены команды P (A) = ИСТИНА и P (B) = ИСТИНА. Тогда проверка множества U
и триггер-функции T А-блока C в каждом из управляющих операторов окажется истинной
и каждый управляющий оператор добавит А-блок C в множество готовых к исполнению
А-блоков, что неверно. Поэтому код, выполняющий изменение признака готовности
экземпляра А-блока Aik и проверку всех зависимых экземпляров из множества S на предмет их
готовности должен быть атомарным с точки зрения остальной программы.
4. Система программирования Аспект</p>
      <p>
        Система программирования Аспект [
        <xref ref-type="bibr" rid="ref8">11</xref>
        ] на практике реализует идеи асинхроной
модели вычислений с управлением на основе строгого частичного порядка и позволяет задать
представление алгоритма с необходимой степенью непроцедурности и частичным
распределением ресурсов, а затем автоматически сконструировать асинхронною программу по этому
представлению.
      </p>
      <p>В основе архитектуры системы Аспект лежит ее разделение на два компонента:
транслятор с языка Аспект и исполнительную подсистему. Транслятор осуществляет перевод
Аспект-программы в асинхронную программу с массовыми А-блоками на языке C++, а
исполнительная подсистема обеспечивает поддержку времени выполнения (управление
потоками, памятью, очередями готовых А-блоков).
4.1. Язык программирования Аспект</p>
      <p>
        Ключевым компонентом системы Аспект является язык программирования Аспект [
        <xref ref-type="bibr" rid="ref9">12</xref>
        ].
К его основным характеристикам можно отнести:
1. Явное описание зависимостей между операциями. В императивных языках на
множестве операций задается линейный порядок, что ограничивает возможности
параллельного исполнения программ. В отличие от них, Аспект позволяет на множестве
операций задать частичный порядок.
3. Частичное распределение ресурсов. Как и в императивных языках, в Аспект
допускается повторное присваивание значения переменной. Это означает, что в одной
переменной программы могут находиться (в разное время) значения различных переменных
алгоритма.
4. Разделение управления и вычислений. В дополнение к обычным библиотекам,
накапливающим «хорошие» решения задач, Аспект позволяет создавать библиотеки,
накапливающие «хорошие» управляющие конструкции.
5. Ориентация на регулярные структуры данных. Язык программирования Аспект
ориентирован на решение задач численного моделирования, поэтому основой
организации вычислений являются массовые А-блоки (фрагменты вычислений), позволяющие
эффективно обрабатывать регулярные структуры данных, а основой представления
данных – массивы.
6. Представление вычислений внутри А-блока с помощью внешнего языка. Для этого
может использоваться один из существующих языка программирования (в настоящее
время поддерживается только C++). Такой подход облегчает изучение языка Аспект,
позволяет легче переносить существующий код и использовать современные
оптимизирующие компиляторы.
      </p>
      <p>Если в императивных языках все команды по умолчанию исполняются
последовательно, а участки программы, пригодные для параллельного исполнения, необходимо явно
указать, то в языке Аспект используется прямо противоположный подход: по умолчанию
считается, что все А-блоки могут исполняться параллельно, а если необходим порядок (например,
из-за зависимости по данным), то его необходимо явно задать.</p>
      <p>Для иллюстрации возможностей языка Аспект по заданию управления рассмотрим
Аспект-программу, решающую задачу умножения матриц (см. рис. 1). В программе
заданы матрицы A, B и C, состоящие из N \times N элементов. Каждый элемент есть матрица
размера M \times M (фрагмент данных Frg). Кроме того, определен фрагмент кода Mult,
который получает три матрицы (фрагменты данных X, Y и Z) на вход и добавляет произведение
X на Y к выходу (фрагмент данных Z). Вычисления задаются на языке C++.</p>
      <p>В секции «task computation» задан массовый А-блок S с областью применимости (0..N
1) \times (0..N - 1) \times (0..N - 1), при этом имя S[i][j][k] обозначает соответствующий экземпляр S.
Каждый экземпляр осуществляет вычисление фрагмента кода Mult с фрагментами данных,
указанными для экземпляра в качестве фактических параметров.</p>
      <p>В секции «task control» на множестве экземпляров А-блока S задан такой частичный
порядок, что каждый k -й экземпляр А-блока должен выполниться перед соответствующим
program MultMatrix
preface {
const i n t M = 3;
const i n t N = 3;
};
data fragments</p>
      <p>double Frg [M ][ M ];
code fragments</p>
      <p>Mult ( in Frg X , Frg Y , Frg Z; out Frg Z) {
f o r ( i n t i =0; i &lt;M; ++ i)
f o r ( i n t k =0; k &lt;M; ++ k)
f o r ( i n t j =0; j &lt;M; ++ j)</p>
      <p>Z[i ][ j] += X[i ][ k ]* Y[k ][ j ];
};
task data</p>
      <p>Frg A[N ][ N ];
Frg B[N ][ N ];</p>
      <p>Frg C[N ][ N ];
task computations</p>
      <p>S[i ][ j ][ k ]: Mult (A[i ][ k], B[k ][ j], C[i ][ j], C[i ][ j ])</p>
      <p>where i: 0..N -1 , j: 0..N -1 , k: 0..N -1;
task control</p>
      <p>S[i ][ j ][ k] &lt; S[i ][ j ][ k +1];
end</p>
      <p>Рис. 1. Умножение матриц (инициализация данных и вывод результата опущены)
(k+1 )-м экземпляром. Управление отражает тот факт, что для вычисления C[i][j]
необходимо просуммировать все матрицы, полученные в результате вычисления произведения
фрагментов A[i][k] на B[k][j] (это делается внутри фрагмента Mult добавлением
результата умножения к старому значению C[i][j]), и для исключения «гонки» данных (data race)
суммирование необходимо выполнять последовательно.</p>
      <p>Все экземпляры А-блока S[i][j][k] с одинаковым индексом k могут исполняться
одновременно, при этом, если выполнился экземпляр S[i][j][k], то экземпляр S[i][j][k+1] может
стартовать, не дожидаясь завершения исполнения других экземпляров с индексом k, то
есть нет барьерной зависимости между «слоями» вычислений.
4.2. Транслятор с языка Аспект</p>
      <p>Рассмотрим результаты работы транслятора c языка Аспект, полученые после
трансляции Аспект-программы, приведенной на рис. 1. Наибольший интерес представляют две
сгенерированные процедуры:
b\ulet aplMain(), отвечающая за инициализацию А-Программы (см. рис. 2). Эта процедура
реализует п. 1 определения А-системы из раздела 3.1. В результате ее исполнения
все экземпляры S[i][j][0] будут добавлены в множество готовых экземпляров, так как
будет ложно условие зависимости в силу проверки (k-1) &gt;= 0. Выражения вида
«(0)», «if(true)» являются заготовками. В случае использования более сложного
управления (индексации с помощью выражений, не пустых триггер-функций и др.), они
будут заполнены полезными вычислениями. Использование таких заготовок в тексте
программы не приводит к потере производительности, так как любой современный
оптимизирующий компилятор сможет исключить их из результирующего бинарного
кода.
b\ulet aplControlS(int i, int j, int k), реализующая управляющий оператор для экземпляра
А-блока S[i][j][k] (см. рис. 3) согласно алгоритму из п. 3.2. Вначале процедуры
проверяется, существуют ли экземпляры, зависимые от исполнившегося экзепляра. Только
при их наличии захватывается примитив синхронизации и они проверяются на
готовность к исполнению.
Процедуры, начинающиеся с префикса «es», относятся к исполнительной подсистеме.
};</p>
      <p>}
4.3. Результаты тестовых испытаний</p>
      <p>В таблицах 1 и 2 приведены результаты тестовых испытаний Аспект-программы
умножения матриц. Тестирование проводилось на машине с 4 процессорами Intel Xeon Х7350
(16 ядер) под управлением Cent OS 5.3 64 bit. Размер матрицы брался равным 5040x5040,
а размер фрагмента данных – 90x90. Время выполнения тестов указано в секундах.
Таблица 1. Результаты измерений производительности программы умножения матриц
Реализация
Аспект-программа демонстрирует практически линейное ускорение, а также
существенное превосходство над C++/OpenMP-реализацией. Это объясняется блочным
представлением алгоритма, за счет которого достигается более эффективное использование
кэшпамяти. По этой же причине блочный код лучше масштабируется.</p>
      <p>
        Подробное обсуждение результатов тестовых испытаний выходит за рамки статьи. В
работе [
        <xref ref-type="bibr" rid="ref8">11</xref>
        ] можно найти результаты тестирования системы Аспект при решении задачи
LUразложения, в работе [
        <xref ref-type="bibr" rid="ref7">10</xref>
        ] – при решении задачи методом конечных разностей, а в работе [
        <xref ref-type="bibr" rid="ref5">8</xref>
        ]
– решение прикладных задач методом Монте-Карло и методом «частицы-в-ячейках».
inline void aplControlS ( i n t i , i n t j , i n t k)
{
bool aplS_0 = ( true ) &amp;&amp; (i &gt;= (0) &amp;&amp; i &lt;= ((N -1)))
&amp;&amp; (j &gt;= (0) &amp;&amp; j &lt;= ((N -1)))
&amp;&amp; (( k +1) &gt;= (0) &amp;&amp; (k +1) &lt;= ((N -1)));
i f ( aplS_0 )
      </p>
      <p>esSpinLock ( aplSLock [i -(0)][ j -(0)][( k +1) -(0)]);
aplS [i -(0)][ j -(0)][ k -(0)] = true ;</p>
      <p>// Control for operation S
i f ( aplS_0 ) {
bool res = true ;
bool aplS0 = ( true ) &amp;&amp; (i &gt;= (0) &amp;&amp; i &lt;= ((N -1)))
&amp;&amp; (j &gt;= (0) &amp;&amp; j &lt;= ((N -1)))
&amp;&amp; (k &gt;= (0) &amp;&amp; k &lt;= ((N -1)));
bool aplS1 = aplS0 ;
aplS1 = aplS1 &amp;&amp; aplS [i -(0)][ j -(0)][ k -(0)];
res = res &amp;&amp; ((! aplS0 &amp;&amp; ! aplS1 ) | (! aplS0 &amp;&amp; aplS1 ) |</p>
      <p>( aplS0 &amp;&amp; aplS1 ));
i f ( res )</p>
      <p>esAddMassiveItemToQueue (0 , i , j , (k +1));
};
i f ( aplS_0 )</p>
      <p>esSpinUnlock ( aplSLock [i -(0)][ j -(0)][( k +1) -(0)]);
};</p>
      <p>Рис. 3. Управляющий оператор для А-блока S
Таблица 2. Ускорение программы умножения матриц
Ускорение
Аспект
С++/OpenMP
1
1
1
Количество ядер
2
4
8</p>
      <p>16
1,99 3,97 7,84 15,39
5. Близкие работы</p>
      <p>
        Наиболее близким к предложенному подходу с концептуальной точки зрения можно
считать программирование с типами управления [
        <xref ref-type="bibr" rid="ref11">14</xref>
        ]. Здесь также возможно
представление алгоритмов с разной степенью непроцедурности, управление также полностью
отделено от вычислений, возможно конструирование сложного управления на основе простых
элементов. В то же время массовое управление не поддерживается, что с точки зрения
параллельных вычислений является существенным недостатком.
      </p>
      <p>
        В работе [
        <xref ref-type="bibr" rid="ref12">15</xref>
        ] для описания структуры алгоритмов предлагается использовать граф
информационных зависимостей, или граф алгоритма. По сути, граф алгоритма - это его
максимально непроцедурное представление, ориентированное на описание свойств алгоритма
и их анализ. Язык Аспект также позволяет представлять алгоритмы в максимально
непроцедурной форме, хотя ориентирован на представление с меньшей степенью
непроцедурности, так как оно лучше подходит для автоматического конструирования параллельных
программ.
      </p>
      <p>
        Из реализованных языков для параллельных вычислений наиболее близким к
языку Аспект является язык Барс [
        <xref ref-type="bibr" rid="ref13">16</xref>
        ]. Как и Аспект, язык Барс имеет развитые средства
конструирования управления, разделение управления и вычислений, позволяет записывать
выражения в непроцедурной форме. Массовые операции можно реализовать с помощью
просачивания унарной операции на данные произвольной структуры (например, массивы),
а массовое управление — с помощью бинарного просачивания С-формул, однако механизм
формирования структур вычислений для такого просачивания не проработан. В настоящее
время проект не развивается. Работоспособная версия для современных суперкомпьютеров
также отсутствует.
      </p>
      <p>
        Весьма интересным является проект PLASMA [
        <xref ref-type="bibr" rid="ref14">17</xref>
        ] под руководством Джека Донгарры.
В проекте реализуется перспективная идея представления алгоритмов линейной алгебры в
виде множества фрагментов, или, в терминологии авторов, «плиток» (tiles), что близко к
представлению в виде множества А-блоков. Однако реализуется она в форме библиотеки, то
есть конкретной реализации конкретных алгоритмов, и не предоставляет средств
разработки произвольных программ. Поэтому, в частности, здесь не возникает достаточно сложных
вопросов об условных операциях и асинхронных подпрограммах, которые имеются в языке
Аспект.
6. Заключение
      </p>
      <p>В статье предложена асинхронная модель вычислений с управлением на основе
строгого частичного порядка. Разработан алгоритм преобразования этой модели в известную
асинхронную модель вычислений с управляющими операторами. На базе предложенной
модели разработана и реализована система программирования Аспект.</p>
      <p>Дальнейшее направление исследований связано с разработкой системы синтеза
параллельных программ на базе вычислительных моделей, выходным языком которой будет
являться язык программирования Аспект.
Литература
1. Андрианов А.Н., Бугеря А.Б., Ефимкин К.Н., Колударов П.И. Модульная
архитектура компилятора языка Норма+. Препринты ИПМ им. М. В. Келдыша. 2011.
№ 064. 16 с.
3. Lastovetsky A. Adaptive parallel computing on heterogeneous networks with mpC //</p>
      <p>Parallel Computing. 2002. Vol. 28. No. 10. Pp. 1369–1407.
4. Kale L.V., Bhatele A. Parallel Science and Engineering Applications: The Charm++</p>
      <p>Approach. CRC Press, 2013. 123 P.
5. Chamberlain B.L., Callahan D., Zima H.P. Parallel Programmability and the Chapel
Language // International Journal of High Performance Computing Applications. 2007.</p>
      <p>Vol. 21. No. 3. Pp. 291–312.
11. Arykov S.B., Malyshkin V.E. Asynchronous Language and System of Numerical Algorithms
Fragmented Programming // Proceedings of the 10th International Conference on Parallel
Computing Technologies (PaCT’2009). Berlin: Springer-Verlag, 2009. LNCS 5698. Pp. 1–7.
15. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВПетербург,
2002. 608 с.
17. Buttari A., Langou J., Kurzak J., Dongarra J. A class of parallel tiled linear algebra
algorithms for multicore architectures // Parallel Computing. 2009. Vol. 35. No. 1.
Pp. 38–53.
Asynchronous model of computation
controlled by strict partial order</p>
      <sec id="sec-7-1">
        <title>S.B. Arykov</title>
      </sec>
      <sec id="sec-7-2">
        <title>Far Eastern Federal University</title>
        <p>The article proposes an asynchronous model of computation, the distinguishing feature
of which is computation control based on strict partial order. It’s shown that such
approach to define control in the program provides several advantages for parallel
computing, in particular, allows to represent algorithms with high level of non-procedurality
and completely separates control from computations. An algorithm of convertation of
that model to well-known asynchronous model with control operators is developed.
Aspect programming system was designed and developed on the basis of the proposed
model.</p>
        <p>Keywords: asynchronous model of computations, parallel programming language, algorithms
representation with high non-procedurality
3. Lastovetsky A. Adaptive parallel computing on heterogeneous networks with mpC //</p>
        <p>Parallel Computing. 2002. Vol. 28. No. 10. Pp. 1369–1407.
4. Kale L.V., Bhatele A. Parallel Science and Engineering Applications: The Charm++</p>
        <p>Approach. CRC Press, 2013. 123 P.
5. Chamberlain B.L., Callahan D., Zima H.P. Parallel Programmability and the Chapel
Language // International Journal of High Performance Computing Applications. 2007.</p>
        <p>Vol. 21. No. 3. Pp. 291–312.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Andrianov</surname>
            <given-names>A.N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bugerya</surname>
            <given-names>A.B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Efimkin</surname>
            <given-names>K.N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Koludarov</surname>
            <given-names>P.I.</given-names>
          </string-name>
          <article-title>Modulnaya arkhitektura kompilyatora yazyka Norma+ [Modular architecture of Norma+ language compiler]. Preprinty IPM im</article-title>
          . M. V. Keldysha [Preprints of Keldysh institute of applied mathematics].
          <year>2011</year>
          . No.
          <volume>064</volume>
          . 16 P.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Bakhtin</surname>
            <given-names>V.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Klinov</surname>
            <given-names>M.S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kryukov</surname>
            <given-names>V.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Podderyugina</surname>
            <given-names>N.V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pritula</surname>
            <given-names>M.N.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Sazanov</given-names>
            <surname>Yu</surname>
          </string-name>
          .L.
          <article-title>Rasshirenie DVM-modeli parallelnogo programmirovaniya dlya klasterov s geterogennymi uzlami [Extension of DVM parallel programming model for clusters with heterogeneous nodes]. Vestnik Yuzhno-Uralskogo gosudarstvennogo universiteta: seriya «Matematicheskoe modelirovanie i programmirovanie» [Bulletin of the South Ural State University: series of "Mathematical Modeling and Programming"</article-title>
          ].
          <year>2012</year>
          . No.
          <volume>18</volume>
          (
          <issue>277</issue>
          ). Issue 12. Pp.
          <volume>82</volume>
          -
          <fpage>92</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          6.
          <string-name>
            <surname>Kotov</surname>
            <given-names>V.E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Narinyani</surname>
            <given-names>A.S.</given-names>
          </string-name>
          <article-title>Asinkhronnye vychislitelnye protsessy nad pamyatyu [Asynchronous computational precesses on the memory</article-title>
          ] // Kibernetika [Cybernetics].
          <year>1966</year>
          . No.
          <issue>3</issue>
          . Pp.
          <volume>64</volume>
          -
          <fpage>71</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          7.
          <string-name>
            <surname>Valkovskiy</surname>
            <given-names>V.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Malyshkin</surname>
            <given-names>V.E.</given-names>
          </string-name>
          <article-title>Sintez parallelnykh programm i sistem na vychislitelnykh modelyakh [Parallel programs and systems synthesis on the basis of computational models]</article-title>
          .
          <source>Novosibirsk: Nauka</source>
          ,
          <year>1988</year>
          . 129 P.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          8.
          <string-name>
            <surname>Arykov S.B.</surname>
          </string-name>
          <article-title>Yazyk i sistema fragmentirovannogo parallelnogo programmirovaniya zadach chislennogo modelirovaniya: Dissertatsiya na soiskanie uchenoy stepeni kandidata ifziko-matematicheskikh nauk [Parallel fragmented programming language and system for numerical simulation tasks</article-title>
          :
          <source>PhD Thesis]: 05.13</source>
          .11 / Institut sistem informatiki im. A.P.
          <string-name>
            <surname>Ershova SO RAN [A.P. Ershov</surname>
          </string-name>
          <article-title>Institute of Informatics Systems SB RAS]</article-title>
          .
          <source>Novosibirsk</source>
          ,
          <year>2010</year>
          . 195 P.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          9.
          <string-name>
            <surname>Arykov</surname>
            <given-names>S.B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Malyshkin</surname>
            <given-names>V.E.</given-names>
          </string-name>
          <article-title>Algoritmy konstruirovaniya asinkhronnykh programm zadannoy stepeni neprotsedurnosti metodom gruppirovki [Algorithms of asynchronous programs construction with predefined level of non-procedurality based on grouping method] // Vestn</article-title>
          . Novosib. gos. un-ta.
          <source>Seriya: Informatsionnye tekhnologii [Bulletin of the Novosibirsk State University: series of Information technologies]</source>
          .
          <year>2009</year>
          . Vol.
          <volume>7</volume>
          . No.
          <issue>1</issue>
          . Pp.
          <volume>3</volume>
          -
          <fpage>15</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          10.
          <string-name>
            <surname>Arykov S</surname>
          </string-name>
          .B.
          <article-title>Asinkhronnoe programmirovanie chislennykh zadach [Asynchronous programming of numerical tasks]. Parallelnye vychislitelnye tekhnologii (PaVT'</article-title>
          <year>2010</year>
          ):
          <article-title>Trudy mezhdunarodnoj nauchnoj konferentsii (Ufa, 29 marta - 2 aprelya 2010) [Parallel Computational Technologies (PCT'</article-title>
          <year>2010</year>
          ):
          <source>Proceedings of the International Scientific Conference (Ufa, Russia, March</source>
          ,
          <fpage>29</fpage>
          - April, 2,
          <year>2010</year>
          )]. Chelyabinsk, Publishing of the South Ural State University,
          <year>2010</year>
          . Pp.
          <volume>28</volume>
          -
          <fpage>39</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          11.
          <string-name>
            <surname>Arykov</surname>
            <given-names>S.B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Malyshkin</surname>
            <given-names>V.E.</given-names>
          </string-name>
          <string-name>
            <surname>Asynchronous</surname>
          </string-name>
          <article-title>Language and System of Numerical Algorithms Fragmented Programming //</article-title>
          <source>Proceedings of the 10th International Conference on Parallel Computing Technologies (PaCT</source>
          '
          <year>2009</year>
          ). Berlin: Springer-Verlag,
          <year>2009</year>
          . LNCS 5698. Pp.
          <volume>1</volume>
          -
          <fpage>7</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          12.
          <string-name>
            <surname>Arykov S.B. Yazyk</surname>
          </string-name>
          programmirovaniya Aspekt [Programming Language Aspect] // Izvestiya Tomskogo politekhnicheskogo universiteta [Bulletin of the Tomsk Polytechnic University].
          <year>2008</year>
          . Vol.
          <volume>313</volume>
          , No. 5. Pp.
          <volume>89</volume>
          -
          <fpage>92</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          13.
          <string-name>
            <surname>Arykov S.B. Defining</surname>
          </string-name>
          <article-title>Order of Execution in Aspect Programming Language // In Proceeding of International Conference "Modern Technologies and the development of polytechnic education"(Vladivostok, September 14-18th</article-title>
          <year>2015</year>
          ). WIT Press,
          <year>2015</year>
          (in press).
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          14.
          <string-name>
            <surname>Kotov</surname>
            <given-names>V.E.</given-names>
          </string-name>
          <article-title>Parallelnoe programmirovanie s tipami upravleniya [Parallel programming with control types</article-title>
          ] // Kibernetika [Cybernetics].
          <year>1979</year>
          . No.
          <issue>3</issue>
          . Pp.
          <volume>1</volume>
          -
          <fpage>13</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          15.
          <string-name>
            <surname>Voevodin</surname>
            <given-names>V.V.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Voevodin</given-names>
            <surname>Vl</surname>
          </string-name>
          .V.
          <article-title>Parallelnye vychisleniya [Parallel computing]</article-title>
          .
          <source>St. Petersburg: BKhVPeterburg</source>
          ,
          <year>2002</year>
          . 608 P.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          16.
          <string-name>
            <surname>Bystrov</surname>
            <given-names>A.V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dudorov</surname>
            <given-names>N.N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kotov</surname>
            <given-names>V.E.</given-names>
          </string-name>
          <article-title>O bazovom yazyke [About the core language] // V kn. Yazyki i sistemy programmirovaniya [In book: Programming languages and systems]. Novosibirsk: CC SB AS USSR</article-title>
          ,
          <year>1979</year>
          . Pp.
          <volume>85</volume>
          -
          <fpage>106</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          17.
          <string-name>
            <surname>Buttari</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Langou</surname>
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kurzak</surname>
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dongarra</surname>
            <given-names>J.</given-names>
          </string-name>
          <article-title>A class of parallel tiled linear algebra algorithms for multicore architectures // Parallel Computing</article-title>
          .
          <year>2009</year>
          . Vol.
          <volume>35</volume>
          . No.
          <issue>1</issue>
          . Pp.
          <volume>38</volume>
          -
          <fpage>53</fpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>