Главная > Анализ зависимости данных
1994
Имя входного файла: c.in
Имя выходного файла: c.out
Ограничение времени: 30 секунд

Для определения того, могут ли итерации цикла выполняться параллельно (на векторном компьютере) используется анализ зависимости данных. Ваша задача провести анализ зависимости данных для оператора цикла с оператором присваивания одномерному массиву.

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

  • Присваивание ни разу не выполнится.
  • Присваивание выполнится ровно один раз.
  • Присваивание выполнится ровно два раза.
  • Присваивание может быть выполнено параллельно на векторном компьютере.
  • Зависимость данных не позволяет произвести параллельные вычисления.

Оператор присваивания записывается в виде

A [expr] := expr2

где в качестве индексов массива A могут быть следующие выражения:

n  I  I-m  I+m  n*I  n*I+m  n*I-m

Здесь m и n - целые числа в диапазоне -32768..+32767. Выражение в правой части присваивания является арифметическим выражением, записанным по правилам языка Pascal. Выражение не содержит строковых констант и комментариев. Все вырезки из массива A удовлетворяют описанным выше требованиям.

Оператор цикла задается в виде LOOP mm,nn,pp. Цикл задает выполнение оператора присваивания для каждого I от mm до nn с шагом pp. Если pp не задано, то шаг считается равным 1. Границы и шаг цикла являются целыми числами в диапазоне -32768..+32767. Шаг цикла pp≠0.

Оператор может быть выполнен параллельно, если после присваивания элементу массива A (левая часть присваивания), его значение не используется в правой части оператора. Анализ зависимости не выполняется, если цикл работает один или два раза.


Исходные данные

Файл исходных данных содержит одну или более строк, каждая из которых содержит цикл с оператором присваивания в виде:

LOOP mm,nn,pp: A [expr] := expr2

или

LOOP mm,nn: A [expr] := expr2

Длина строки файла исходных данных не превосходит 80 символов.


Вывод программы

Для каждого исходного оператора цикла вывести в выходной файл 2 строки: сам оператор и результат анализа зависимости данных:

        
Не выполнится ни разу
Выполнится один раз
Выполнится два раза
Параллельное исполнение
Требует последовательного исполнения


Пример

c.in
LOOP 1,32767: A [I] := A [I]+1
LOOP 1,7: A [-2*I+50] := A [I-1]+A [I+40]
LOOP 2,800,2: A [I] := -2.03E-17*A [2*I-1]+A [I]
LOOP 7,1,-1: A [I] := A [I+6]*3
LOOP 2,-90,30: A [I] := 2
LOOP 2,3: A [I] := A [I]*4.0
c.out
LOOP 1,32767: A [I] := A [I]+1
Параллельное исполнение
LOOP 1,7: A [-2*I+50] := A [I-1]+A [I+40]
Требует последовательного исполнения
LOOP 2,800,2: A [I] := -2.03E-17*A [2*I-1]+A [I]
Параллельное исполнение
LOOP 7,1,-1: A [I] := A [I+6]*3
Требует последовательного исполнения
LOOP 2,-90,30: A [I] := 2
Не выполнится ни разу
LOOP 2,3: A [I] := A [I]*4.0
Выполнится два раза

 
Hosted by uCoz