Научная статья на тему 'Классификация программных циклов с одним оператором присваивания'

Классификация программных циклов с одним оператором присваивания Текст научной статьи по специальности «Математика»

CC BY
232
33
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ / РАЗБИЕНИЕ ЦИКЛА / ГРАФ ЗАВИСИМОСТИ / PARALLEL COMPUTATIONS / LOOP DISTRIBUTION / DEPENDENCE GRAPH

Аннотация научной статьи по математике, автор научной работы — Штейнберг Олег Борисович

Важным требованием к работе программы является быстродействие. Для его достижения создаются различные компьютерные архитектуры, в большинстве своем параллельные. Но для того чтобы использовать потенциал параллельной архитектуры, к последовательным программам применяются распараллеливающие преобразования. Особое внимание уделяется программным циклам небольшим по количеству текста участкам программы, требующим большого объема вычислений. Некоторые циклы могут хорошо параллельно выполняться на одной архитектуре и при этом быть пригодными лишь для последовательного исполнения на другой. Ранее Л. Лэмпортом и М. Вольфом были описаны классификации способов параллельных выполнений циклов. При этом основными видами параллельных архитектур являются SIMD и MIMD. В данной статье предлагается классификация циклов, в основе которой лежит граф информационных связей. Вершинами этого графа являются вхождения переменных, а дуги связывают две вершины в случае наличия между соответствующими вхождениями информационной зависимости. Далее устанавливается соответствие этих классов известным видам параллельных выполнений циклов. Некоторым классам соответствуют рекуррентные циклы, для распараллеливания которых могут быть использованы соответствующие специальные вспомогательные алгоритмы. Полученная классификация может быть использована, например, при создании распараллеливающих компиляторов.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Штейнберг Олег Борисович

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

CLASSIFICATION OF A PROGRAMMING LOOPS WITH ONE ASSIGNMENT STATEMENT

To use the potential of parallel architectures one should apply parallelizing transformations to serial programs. When program is being parallelized most of attention is focused on programming loops. They are small code fragments, which demand a huge amount of computations. Some loops are well executed in parallel on a single architecture and at the same time be suitable only for sequential execution on another. L. Lamport and M. Wolfe described the methods classifications of loops parallel execution earlier. It should be noted that the main types of parallel architectures are SIMD and MIMD. A classification of programming loops, which is based on the dependence graph, is proposed in this paper. The vertices of this graph are the occurrences of variables and the edges connect two vertices in the case of information dependence between the respective occurrences are exist. Further, a match of these classes to known types of loops parallel executions is described also. Some classes correspond to recurrent loops, which can be parallelized using special auxiliary algorithms. The resulting classification can be used, for example, when you create a parallelizing compilers.

Текст научной работы на тему «Классификация программных циклов с одним оператором присваивания»

ISSN 0321-3005 ИЗВЕСТИЯ ВУЗОВ. СЕВЕРО-КАВКАЗСКИИ РЕГИОН._ЕСТЕСТВЕННЫЕ НАУКИ. 2017. № 1

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION. NATURAL SCIENCE. 2017. No. 1

УДК 004.4'42 DOI 10.18522/0321-3005-2017-1-52-58

КЛАССИФИКАЦИЯ ПРОГРАММНЫХ ЦИКЛОВ С ОДНИМ ОПЕРАТОРОМ ПРИСВАИВАНИЯ*

© 2017 г О.Б. Штейнберг

CLASSIFICATION OF A PROGRAMMING LOOPS WITH ONE ASSIGNMENT STATEMENT

O.B. Steinberg

Штейнберг Олег Борисович - Южный федеральный универси- Oleg B. Steinberg - Southern Federal University, Vorovich тет, Институт математики, механики и компьютерных наук Institute of Mathematics, Mechanics and Computer Sci-наук им. И.И. Воровича, кандидат физико-математических наук, ence, Candidate of Physics and Mathematics, Senior Re-старший научный сотрудник, ул. Мильчакова, 8а, г. Ростов-на- searcher, Milchakova St., 8a, Rostov-on-Don, 344090, Дону, 344090, Россия, e-mail: olegsteinb@gmail.com Russia, e-mail: olegsteinb@gmail.com

Важным требованием к работе программы является быстродействие. Для его достижения создаются различные компьютерные архитектуры, в большинстве своем - параллельные. Но для того чтобы использовать потенциал параллельной архитектуры, к последовательным программам применяются распараллеливающие преобразования. Особое внимание уделяется программным циклам - небольшим по количеству текста участкам программы, требующим большого объема вычислений. Некоторые циклы могут хорошо параллельно выполняться на одной архитектуре и при этом быть пригодными лишь для последовательного исполнения на другой. Ранее Л. Лэмпортом и М. Вольфом были описаны классификации способов параллельных выполнений циклов. При этом основными видами параллельных архитектур являются SIMD и MMD. В данной статье предлагается классификация циклов, в основе которой лежит граф информационных связей. Вершинами этого графа являются вхождения переменных, а дуги связывают две вершины в случае наличия между соответствующими вхождениями информационной зависимости. Далее устанавливается соответствие этих классов известным видам параллельных выполнений циклов. Некоторым классам соответствуют рекуррентные циклы, для распараллеливания которых могут быть использованы соответствующие специальные вспомогательные алгоритмы. Полученная классификация может быть использована, например, при создании распараллеливающих компиляторов.

Ключевые слова: параллельные вычисления, разбиение цикла, граф зависимости.

To use the potential of parallel architectures one should apply parallelizing transformations to serial programs. When program is being parallelized most of attention is focused on programming loops. They are small code fragments, which demand a huge amount of computations. Some loops are well executed in parallel on a single architecture and at the same time be suitable only for sequential execution on another. L. Lamport and M. Wolfe described the methods classifications of loops parallel execution earlier. It should be noted that the main types of parallel architectures are SIMD and MIMD. A classification of programming loops, which is based on the dependence graph, is proposed in this paper. The vertices of this graph are the occurrences of variables and the edges connect two vertices in the case of information dependence between the respective occurrences are exist. Further, a match of these classes to known types of loops parallel executions is described also. Some classes correspond to recurrent loops, which can be parallelized using special auxiliary algorithms. The resulting classification can be used, for example, when you create a parallelizing compilers.

Keywords: parallel computations, loop distribution, dependence graph.

Введение цикла for языка С или цикл DO языка Fortran). В

основе приведенной классификации лежит граф

При распараллеливании программ особое вни- информационных связей. Циклы делятся на раз-

мание уделяется циклам. Некоторые из них могут личные типы исходя из того, какие зависимости в

хорошо параллельно выполняться на одной архи- них присутствуют.

тектуре и при этом быть пригодными лишь для по- Иногда распараллеливание циклов, в теле кото-

следовательного исполнения на другой. Поэтому в рых много операторов присваивания, с помощью

различных работах предпринимались попытки опи- преобразования «разбиение цикла» [4, 5] можно

сать различные схемы параллельного выполнения свести к распараллеливанию циклов, в теле кото-

циклов [1-3]. В данной статье предлагается новая рых мало операторов. Поэтому интересен вопрос о

классификация стандартных циклов (например, распараллеливании циклов, не допускающих раз-

! Исследование выполнено при финансовой поддержке РФФИ в рамках научного проекта № 16-31-60055 мол_а_дк.

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

биения, в частности, с одним оператором присваивания. Этот вопрос рассмотрен в данной статье. Понятие «распараллеливание цикла» неоднозначно. Оно может толковаться по-разному. Рассматриваются разные виды параллельного выполнения циклов. Показано, что для циклов с одним оператором присваивания не любые комбинации информационных зависимостей возможны.

Используемые понятия

В данной статье будут рассматриваться циклы

for(i = M; i<N; i++)

{

LoopBody(i);

}

содержащие счетчик (i), верхнюю (N) и нижнюю (M) границу. При этом N-M>0.

Считается, что переменные с разными именами не обращаются к одной и той же ячейке памяти (т.е. нет алиасов). Еще присутствует ограничение на индексные выражения вхождений массивов: они должны аффинно зависеть от счетчика цикла.

Определение 1. Вхождение переменной (occurrence) - это имя переменной в совокупности с тем местом в программе, в котором эта переменная появилась. Всякому вхождению (а для массивов -при конкретном значении индексного выражения) соответствует обращение к некоторой ячейке памяти. Если при обращении к ячейке памяти происходило чтение, то такое вхождение называется использованием (in), а если запись - генератором (out).

Определение 2. Говорят, что два вхождения порождают информационную зависимость (information dependence), если они обращаются к одной и той же ячейке памяти. От того, какого типа вхождения образуют дугу зависимости, дуги подразделяются на четыре типа: 1) если оба вхождения являются генераторами (out^out), зависимость называется выходной (output); 2) если вхождение, обращающееся первым к общей ячейке памяти, является генератором, а второе - использованием (out^in), зависимость называется потоковой или истинной (flow or true); 3) если вхождение, обращающееся первым к общей ячейке памяти, является использованием, а второе - генератором (in^out), зависимость называется антизависимостью (antidependence); 4) если оба вхождения являются использованиями (in^in), зависимость называется входной (input).

Определение 3. Информационная зависимость между вхождениями называется циклически независимой (loop independent dependence), если эти вхождения обращаются к одной и той же ячейке

NATURAL SCIENCE. 2017. No. 1

памяти на одной и той же итерации цикла. Иначе зависимость называется циклически порожденной (loop carried dependence) [6, с. 96; 7, с. 14].

Пример 1. Рассмотрим цикл, содержащий циклически порожденные зависимости:

for (i = 0; i<N; i++)

{

X[i] = X[i-1] + Y;

Y = I*2;

}

В данном цикле оба вхождения массива X и оба вхождения переменной Y образуют циклически порожденные истинные информационные зависимости. Они возникают потому, что первое вхождение массива X и второе вхождение переменной Y на итерации к обращаются к тем же ячейкам памяти, что и второе вхождение массива X и первое вхождение переменной Y на итерации к+1, где 0 < k<N-1. При этом вхождения переменной Y образуют еще и циклически независимую антизависимость.

Определение 4. В решении задачи преобразования программ ключевую роль играет граф информационных связей (dependence graph) [7-11]. Его вершинами являются вхождения переменных. Дуга (i, j) идет из i-й вершины в j-ю, если вхождения, соответствующие этим вершинам, порождают истинную, выходную или антизависимость. При этом к одной и той же ячейке памяти сначала обращается вхождение, соответствующее i-й вершине, а затем - j-й.

Иногда определение того, существует или нет информационная зависимость между парой вхождений, оказывается сложной задачей. При преобразованиях программ в таких случаях предполагают худшее. То есть считают, что такая зависимость существует. На графе информационных связей такие вершины соединяют дугой.

Определение 5. Зависимость будем называть неопределенной, если на момент построения графа информационных связей нет возможности определить, обращаются ли два вхождения к одной и той же ячейке памяти, или если обращаются, то какое из вхождений было раньше.

Пример 2. Рассмотрим следующий цикл, содержащий вхождения массива, возможно, порождающие информационную зависимость:

for(i = 0; i<N; i++)

{

X[i] = B[i] + 8; C = X[i+k] + B[i];

}

В данном примере на этапе компиляции неизвестно, будет ли присутствовать дуга информационной зависимости, связывающая вхождения массива X. Действительно, если, например, к = -1, то при-

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

сутствует дуга истинной зависимости, если к = 1 -антизависимости. Если к = N, то дуги зависимости вообще нет.

Немаловажную роль в процессе распараллеливания программ играет преобразование «разбиение цикла».

Суть разбиения цикла (loop distribution) состоит в том, чтобы заменить цикл, в теле которого много операторов, на эквивалентный фрагмент программы из нескольких циклов, в телах которых меньше операторов [5].

Способы параллельного выполнения циклов

Классификация циклов, описанная Лэмпортом.

Основными видами параллельных архитектур являются MIMD (many instructions, multiple data) и SIMD (single instructions, multiple data).

Распараллеливание на данные виды архитектур описано в 1974 г. в работе Л. Лэмпорта [1], который рассматривает параллельное выполнение программных циклов языка Fortran. Под распараллеливанием циклов понимается одновременное выполнение его итераций. В работе предложено два способа параллельного выполнения цикла: DoConc (Conc - сокращение от Concurrently) и DoSim (Sim -сокращение от Simultaneously).

Для первого способа выполнения цикла используется обозначение:

DO 99 CONC FOR ALL Ie S

99 LoopBody(I)

При таком выполнении цикла его тело для всех итераций исполняется независимо различными вычислительными устройствами (например, ядрами процессора). Это соответствует современному выполнению на MIMD-архитектуре, в частности, на многоядерных процессорах или высокопроизводительных кластерах. Одним из необходимых условий MIMD-выполнения является отсутствие в теле цикла циклически порожденных зависимостей.

Для второго способа выполнения цикла используется обозначение:

DO 99 SIM FOR ALL Ie S

99 LoopBody(I)

При таком выполнении цикла все инструкции тела цикла выполняются в порядке следования. При этом каждая инструкция выполняется сразу для всех итераций одновременно. SIMD-выполне-нию циклов соответствует выполнение на SIMD-архитектуре, в частности, на SIMD-устройствах современных процессоров, поддерживающих векторные команды. К успешным компьютерам прошлых лет с архитектурой SIMD относятся ILLIAC IV, Cray 1 и отечественный суперкомпьютер ПС-

NATURAL SCIENCE. 2017. No. 1

2000. SIMD-выполнение используется в современных графических ускорителях [12]. Для корректного SIMD-выполнения цикла необходимо, чтобы в теле цикла были только операторы присваивания и не было дуг графа информационных связей, идущих снизу вверх или слева направо. Следует отметить, что такие дуги могут быть только циклически порожденными.

Пример 3. Цикл, содержащий дугу, идущую снизу вверх.

for(i = 0; i< N; i++)

{

A[i] = B[i] + C[i]; D[i] = E[i]*A[i+1];

}

Дуга снизу вверх связывает два вхождения переменной A.

Пример 4. Цикл, содержащий дугу, идущую снизу вверх.

for(i = 0; i< N; i++)

{

A[i] = B[i] + A[i-1]*C[i];

}

Дуга слева направо связывает два вхождения переменной A.

В настоящее время многие вычислительные системы имеют гибридные архитектуры, поддерживая и MIMD- и SIMD-параллельные вычисления.

Для циклов, которые непосредственно не допускают параллельного выполнения, Л. Лэмпортом разработаны преобразования, которые могут привести к циклам, допускающим параллельное выполнение: методы гиперплоскостей и координат. Стоит отметить, что у Л. Лэмпорта было рассмотрено понятие информационной зависимости, но не было понятия графа информационных связей.

Классификация циклов, описанная Вольфом.

В [2] М. Вольф предлагает более обширную классификацию параллельных выполнений циклов, чем это сделал в своих работах Л. Лэмпорт. При этом М. Вольф, как и Л. Лэмпорт, не дает четкого определения, например, тому, что может содержаться в телах описываемых параллельных циклов. В целом речь идет о циклах, содержащих только операторы присваивания.

Первым из описываемых типов является forall, который соответствует DoSim из классификации Л. Лэмпорта.

Вторым - dopar, соответствующий DoConc Л. Лэмпорта.

Также описывается doall, который является частным случаем dopar, возникающим при отсутствии циклически порожденных зависимостей. Но М. Вольф не считает doall отдельным типом.

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

Далее упоминается doacross, который М. Вольф причисляет к параллельному типу выполнения цикла. Doacrass-выполнение состоит в том, что группа итераций выполняется на нескольких процессорах. При этом исполнение одних итераций зависит от результата выполнения других. Стоит отметить, что в некоторых других источниках [3] этот термин используется именно для описания параллельно выполняемых циклов. В частности, к такому виду циклов можно отнести следующий:

for (i = 0; i<N; i++)

{

X[i] = X[i-4]*A[i] + B[i];

}

где параллельно можно выполнять по четыре подряд идущие итерации.

Приводится и третий тип dosingle, для которого должно выполняться правило однократного присваивания. Этот тип параллельного выполнения подразумевает, что все использования переменной или элемента массива должны извлекать значение, уже присвоенное данной ячейке памяти. Четкого описания последовательности действий, необходимой для параллельного выполнения цикла dosingle, М. Вольфом не приводится. Ввиду этого и строгости условий на циклы применение данного типа распараллеливания на практике не используется.

Классификация циклов, содержащих один оператор

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Приведем классификацию циклов, в теле которых присутствует лишь один оператор, который является оператором присваивания. Классификация основана на наличии или отсутствии в этом операторе каких-либо видов информационных зависимостей.

Определение 6. Под Loopk будем понимать множество всех циклов, содержащих k операторов, которые являются операторами присваивания, не содержащими вызовов функций.

Определение 7. Классом Loop(None) будем называть множество всех циклов, не содержащих антизависимостей, а также выходных и потоковых зависимостей.

Определение 8. Классом Loop(Unknown) будем называть множество всех циклов, в которых присутствуют неопределенные зависимости.

Для других классов циклов будем использовать обозначение Loop(...), где в скобках через запятую будут указываться типы присутствующих или отсутствующих зависимостей. Например, Loop(A,O,F)

NATURAL SCIENCE. 2017. No. 1

описывает множество циклов в которых нет антизависимостей, зато присутствуют входные и потоковые зависимости.

Теорема 1. Не существует циклов из множества Loopi, в которых присутствуют дуги выходной и потоковой зависимостей, а дуг антизависимости нет.

Доказательство. Рассмотрим произвольный цикл, принадлежащий множеству Loopj, содержащий выходную зависимость. Так как она образуется генераторами, а он во всех циклах рассматриваемого множества всего один, то получаем, что выходная зависимость является циклически порожденной и образуется генератором, расположенным в левой части единственного оператора присваивания.

Возникают два варианта: генератор зависит от счетчика цикла; генератор не зависит от счетчика цикла.

Вариант 1. Рассмотрим случай одномерного массива. Ввиду условия аффинной зависимости индексных выражений получаем, что индексное выражение генератора имеет вид a*i+b (где a, b -целые, i - счетчик цикла). Стоит отметить, что a^0, иначе генератор бы не зависел от счетчика цикла, что относится к варианту 2.

for(i = 0; i<N; i++)

{

X[a*i+b] = ... ;

}

Обозначим через i\ и i2 две разные итерации, на которых генератор обращается к одной и той же ячейке памяти. В этом случае его индексные выражения будут равны a*ii+b = a*i2+b. Отсюда получаем i1=i2, что приводит к противоречию.

В случае многомерного массива следует взять первую размерность, в которой присутствует счетчик цикла с ненулевым коэффициентом. После чего доказательство повторяет случай одномерного массива.

Таким образом, получаем, что вариант 1 невозможен.

Вариант 2. Для того чтобы присутствовала потоковая зависимость, необходимо наличие использования той же переменной, что и генератор.

for(i = 0; i<N; i++)

{

X = ... X. ;

}

Но в этом случае цикл будет принадлежать множеству Loop( A,O, F).

Пример 5. Цикл, содержащий выходную зависимость, образованную вхождением индексной переменной.

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

for(i = 0; i<N; i++)

{

A[i mod 2] = B[i] + C[i] *D[i];

}

Такая зависимость возникла ввиду отсутствия ограничения на аффинность индексных выражений.

Теорема 2. Не существует циклов из множества Loopj, в которых присутствуют дуги выходной и антизависимости, а дуг потоковой зависимости нет.

Доказательство. Доказательство теоремы строится по аналогии с доказательством теоремы 1.

Теорема 3. Множества циклов Loop(None),

Loop(A,O,F), Loop(A,O,F) , Loop(A,O,F) , Loop(A, O, F), Loop(A, O, F) и Loop(Unknown) не

пересекаются.

Доказательство. Доказательство данной теоремы вытекает из определений соответствующих классов.

Теорема 4. Если цикл принадлежит множеству циклов Loopj, то он относится к одному из классов: Loop(None), Loop(Unknown), Loop(A,O,F), Loop(A,O,F) , Loop(A,O,F) , Loop(A,O,F) или Loop(A, O, F).

Доказательство. Рассмотрим произвольный цикл.

for(i = 0; i<N; i++)

{

}......;

Если в нем не присутствует ни одной зависимости, то он принадлежит множеству циклов Loop(None) и не принадлежит ни одному другому из рассматриваемых в теореме множеств.

Если в нем присутствует неопределенная зависимость, то он принадлежит множеству циклов Loop(Unknown) и не принадлежит ни одному другому из рассматриваемых в теореме множеств.

Нерассмотренными остались только циклы, в которых есть информационные зависимости и при этом нет неопределенных зависимостей. Эти циклы принадлежат оставшимся непересекающимся множествам Loop(A,O,F), Loop(A,O,F) , Loop(A,O,F) , Loop(A, O, F) и Loop(A,O, F).

Способы распараллеливания циклов, принадлежащих Loopj

В данном разделе будут рассматриваться только циклы, принадлежащие Loop1 . При этом для каж-

NATURAL SCIENCE. 2017. No. 1

дого класса будет рассмотрена возможность параллельного выполнения принадлежащих ему циклов.

Loopj (None).

Циклы, принадлежащие Loopj (None), пригодны как для SIMD-выполнения, так и MIMD-выполнения ввиду отсутствия каких-либо зависимостей.

Loop^A,O,F).

Цикл, принадлежащий Loopj (A, O,F), можно заменить на оператор присваивания, являющийся телом цикла, при этом вместо счетчика цикла следует поставить его последнее значение.

Пример 6. Цикл, принадлежащий Loop! (A,O,F),

for(i = 0; i<N; i++)

{

A = B[i] + C[i];

}

может быть заменен одним оператором (считается, что значение счетчика цикла не используется за его пределами)

A = B[N-1] + C[N-1];

Loop^(A,O,F) .

Циклы, принадлежащие Loopj (A,O,F), непригодны ни для SIMD-выполнения, ни для MIMD-выполнения ввиду присутствия циклически порожденной зависимости, идущей слева направо. При этом в случаях, когда зависимость является аффинной или дробно-линейной, к циклу можно применить распараллеливающие преобразования, описанные в [13, 14].

Loop! (Unknown).

Циклы, принадлежащие Loopj (Unknown), непригодны ни для SIMD-выполнения ни для MIMD-выполнения ввиду того, что зависимость может оказаться потоковой.

Loop!(A,O,F).

Циклы, принадлежащие Loopj (A, O, F), непригодны ни для SIMD-выполнения, ни для MIMD-выполнения ввиду присутствия циклически порожденной зависимости, идущей слева направо.

Loop^A, O, F).

Циклы, принадлежащие Loopj (A,O,F), непригодны ни для SIMD-выполнения, ни для MIMD-выполнения ввиду присутствия циклически порожденной зависимости, идущей слева направо.

Loopj(A, O, F).

Циклы, принадлежащие Loopj (A, O, F), пригодны для SIMD-выполнения, MIMD-выполнение может привести к некорректному результату, так как итерации выполняются не в порядке следования.

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

Пример 7. Рассмотрим цикл, принадлежащий классу Loop^A, O, F).

for(i = 0; i<N; i++)

{

A[i] = B[i] + A[i+1]*D[i];

}

Если при MIMD-выполнении запись в ячейку A [3] на итерации 3 будет выполнена раньше, чем чтение из A [3] на итерации 2, то при выполнении итерации 2 будет использоваться неверное (новое) значение A [3].

Заключение

Из всех циклов, тело которых содержит более одного оператора присваивания на предмет распараллеливания, следует рассматривать неразбивае-мые. Иначе, на предмет распараллеливания нужно проверять циклы, получаемые в результате разбиения.

Следует отметить, что если в теле цикла присутствует условный оператор, то цикл непригоден для SIMD-вычисления.

Циклы, принадлежащие классу Loop(None), пригодны как для SIMD-выполнения, так и MIMD-выполнения ввиду отсутствия каких-либо зависимостей.

Некоторые циклы, которые в данной статье отнесены к нераспараллеливаемым как для SIMD-выполнения, так и MIMD-выполнения, на самом деле имеют перспективу аппаратной поддержки ускорения на других архитектурах, например, конвейерных. В последние годы набирают популярность системы на кристалле, сочетающие универсальные вычислительные ядра и программируемый ускоритель (http://www.xilinx.com/). Ведутся работы по созданию компиляторов с высокоуровневых языков на такие программируемые архитектуры [15]. Приведенная в данной статье классификация может быть использована в таких компиляторах, которые должны иметь библиотеку описаний электронных схем, соответствующих представленным в статье классам циклов.

Литература

1. Lamport L. The parallel execution of DO loops // Commun. ACM. 1974. Vol. 17, № 2. P. 83-93.

2. Wolfe M. High performance compilers for parallel computing. Redwood City, 1996. 570 p.

3. Duo Liu, Yi Wang, Zili Shao, MinyiGuo, Jingling Xue Optimally Maximizing Iteration-Level Loop Parallelism // IEEE Transactions on Parallel and Distributed Systems (TPDS). 2012. Vol. 23, № 3. P. 564-572.

NATURAL SCIENCE. 2017. No. 1

4. Allen R., Kennedy K. Optimizing compilers for modern architectures. San Francisco; San Diego; New York; Boston; London; Sidney; Tokyo, 2002. 790 p.

5. Штейнберг О.Б. Минимизация количества временных массивов в задаче разбиения циклов // Изв. вузов. Сев.-Кавк. регион. Естеств. науки. 2011. № 5. С. 31-35.

6. Векторизация программ // Векторизация программ: теория, методы, реализация: сб. переводов ст. М., 1991. С. 246-267.

7. Штейнберг Б.Я. Математические методы распараллеливания рекуррентных программных циклов на суперкомпьютеры с параллельной памятью. Ростов н/Д., 2004, 192 с.

8. Арапбаев Р.Н. Анализ зависимостей по данным: тесты на зависимость и стратегии тестирования : дис. ... канд. физ.-мат. наук. Новосибирск, 2008. 116 с.

9. Бабичев А.В., Лебедев В.Г. Распараллеливание программных циклов // Программирование. 1983. № 5. С. 52-63.

10. Шульженко А.М. Исследование информационных зависимостей программ для анализа распараллеливающих преобразований : дис. ... канд. техн. наук. Ростов н/Д., 2006. 200 с.

11. Шульженко А.М. Автоматическое определение циклов ParDo в программе // Изв. вузов. Сев.-Кавк. регион. Естеств. науки. 2011. Приложение. № 5. C. 77-88.

12. Линев А.В., Боголюбов Д.К., Бастраков С.И. Технологии параллельного программирования для процессоров новых архитектур: учебник / под ред. В.П. Гергеля. М., 2010. 160 с.

13. Штейнберг О.Б. Распараллеливание рекуррентных циклов с нерегулярным вычислением суперпозиций // Изв. вузов. Сев.-Кавк. регион. Естеств. науки. 2009. № 2. С. 18-21.

14. Штейнберг О.Б., Суховерхов С.Е. Автоматическое распараллеливание рекуррентных циклов с проверкой устойчивости // Информационные технологии. 2010. № 1. С. 40-45.

15. Steinberg B.Y., Dubrov D.V., Mikhailuts Y.V., Roshal A.S., Steinberg R.B. Automatic High-Level Programs Mapping onto Programmable Architectures // Proceedings of the 13th International Conference on Parallel Computing Technologies, August 31 - September 4, 2015. Petrozavodsk, 2015. Vol. 9251. P. 474-485.

References

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

1. Lamport L. The parallel execution of DO loops. Commun. ACM. 1974, vol. 17, No. 2, pp. 83-93.

2. Wolfe M. High performance compilers for parallel computing. Redwood City, 1996, 570 p.

3. Duo Liu, Yi Wang, Zili Shao, MinyiGuo, and Jingling Xue. Optimally Maximizing Iteration-Level Loop

ISSN 0321-3005 IZVESTIYA VUZOV. SEVERO-KAVKAZSKII REGION.

NATURAL SCIENCE.

2017. No. 1

Parallelism. IEEE Transactions on Parallel and Distributed Systems (TPDS). 2012, vol. 23, No. 3, pp. 564-572.

4. Allen R., Kennedy K. Optimizing compilers for modern architectures. San Francisco, San Diego, New York, Boston, London, Sidney, Tokyo, 2002, 790 p.

5. Shteinberg O.B. Minimizatsiya kolichestva vremennykh massivov v zadache razbieniya tsiklov [Minimizing the number of temporary arrays in the task of partitioning cycles]. Izv. vuzov. Sev.-Kavk. region. Estestv. nauki. 2011, No. 5, pp. 31-35.

6. [Vectorization of programs]. Vektorizatsiya programm: teoriya, metody, realizatsiya [Vectorization of programs: theory, methods, implementation]. Collection of translations of articles. Moscow, 1991, pp. 246-267.

7. Shteinberg B.Ya. Matematicheskie metody rasparallelivaniya rekurrentnykh programmnykh tsiklov na superkomp'yutery s parallel'noi pamyat'yu [Mathematical methods for parallelizing recurrent program cycles on supercomputers with parallel memory]. Rostov-on-Don, 2004, 192 p.

8. Arapbaev R.N. Analiz zavisimostei po dannym: testy na zavisimost' i strategii testirovaniya : dis. ... kand. fiz.-mat. nauk [Analysis of data dependencies: dependency tests and testing strategies]. Novosibirsk, 2008, 116 p.

9. Babichev A.V., Lebedev V.G. Rasparallelivanie programmnykh tsiklov [Parallelization of program cycles]. Programmirovanie. 1983, No. 5, pp. 52-63.

10. Shul'zhenko A.M. Issledovanie informatsionnykh zavisimostei programm dlya analiza rasparallelivayu-

shchikh preobrazovanii : dis. ... kand. tekhn. nauk [Investigation of information dependencies of programs for analysis of parallelizing transformations]. Rostov-on-Don, 2006, 200 p.

11. Shul'zhenko A.M. Avtomaticheskoe opredelenie tsiklov ParDo v programme [The automatic detection of ParDo cycles in a program]. Izv. vuzov. Sev.-Kavk. region. Estestv. nauki. 2011, suppl. No. 5, pp. 77-88.

12. Linev A.V., Bogolyubov D.K., Bastrakov S.I. Tekhnologii parallel'nogo programmirovaniya dlya protsessorov novykh arkhitektur [Technologies of parallel programming for processors of new architectures]. Textbook. Ed. V.P. Gergel. Moscow, 2010, 160 p.

13. Shteinberg O.B. Rasparallelivanie rekurrentnykh tsiklov s neregulyarnym vychisleniem superpozitsii [Par-allelization of recurrent cycles with an irregular computation of superpositions]. Izv. vuzov. Sev.-Kavk. region. Estestv. nauki. 2009, No. 2, pp. 18-21.

14. Shteinberg O.B., Sukhoverkhov S.E. Avtoma-ticheskoe rasparallelivanie rekurrentnykh tsiklov s proverkoi ustoichivosti [Automatic parallelization of recurrent cycles with stability testing]. Informatsionnye tekhnologii. 2010, No. 1, pp. 40-45.

15. Steinberg B.Y., Dubrov D.V., Mikhailuts Y.V., Roshal A.S., Steinberg R.B. Automatic High-Level Programs Mapping onto Programmable Architectures. Proceedings of the 13th International Conference on Parallel Computing Technologies, August 31 - September 4, 2015. Petrozavodsk, 2015, vol. 9251, pp. 474-485.

Поступила в редакцию /Received

21 сентября 2016 г. /September 21, 2016

i Надоели баннеры? Вы всегда можете отключить рекламу.