Учебное пособие: Новый подход к построению методов межпроцедурного анализа программ
CALL Q(...,Ap (op1 ,...,opp ),...)
...
END
SUBROUTINE Q(...,Aq ,...)
DIMENSION Aq (lq1 :uq1 ,...,lqq :uqq )
...
END
Пусть элементы массива Aq , представляющие часть входных и выходных данных подпрограммы Q, представлены в виде области Wq , описанной с помощью набора линейных равенств и неравенств. Требуется пересчитать эту область в терминах вырезки из соответствующего фактического параметра-массива Ap .
Запишем условие Гpq того, что два элемента массивов Ap (y1 ,..., yp ) и Aq (j1 ,..., jq ) ссылаются на одну и ту же область памяти:
где .
Тогда пересечение трех областей W=Wq ÇГpq Ç{lpi £yi £upi , i =1,p} неявно задает область Wp массива Ap , соответствующую области Wq массива Aq . Для получения явного описания Wp необходимо получить проекцию (p+q)-мерной области W на p-мерное подпространство, соответствующее массиву Ap . Это можно сделать с помощью исключений Фурье-Моцкина [12,13], если равенство Гpq линейно. Определение условий его линейности рассматривается дальше.
Если равенство Гpq нелинейно, то при некоторых условиях можно получить более простое условие. Если массивы Ap и Aq имеют одинаковое число элементов в первых (d-1) размерностях (то есть {upi - lpi = uqi - lqi , 1 £ i £ d-1}), и {opi =lpi , 1 £ i £ d-1}, то добавим в описание области W равенства {yi - lpi =ji - lqi , 1 £ i £ d-1} и составим частичное уравнение ранга d:
где .
Это уравнение проще, чем Гpq , и в реальных случаях может оказаться линейным, в то время как полное уравнение таковым не является. Если количество размерностей с одинаковым числом элементов равно q, но меньше p, то в описание области W вместо условия Гd pq нужно добавить равенства {yi =opi , | i=q+1,p }.
Для того, чтобы получить проекцию (p+q)-мерной области W на p-мерное пространство, необходимо исключить переменные, введенные для описания Wq , из всех равенств и неравенств. Это можно сделать методом Фурье-Моцкина [12,13], если все ограничения, содержащие эти переменные, линейны. Так как в описание Wq входят только линейные ограничения, нелинейность по данным переменным может возникнуть только в равенстве Гpq (Гd pq ). Кроме того, для проведения дальнейшего анализа программы важно, чтобы все получающиеся ограничения также были линейными. Поэтому нужно выделить условия на внешние переменные, при которых Гpq (Гd pq ) будет линейным по всем переменным.
Для этого берем равенство Гpq (Гd pq ), приводим в нем подобные, после чего приравниваем к нулю все нелинейные части. Если из получившихся равенств можно выразить переменные, введенные для описания Wq , через внешние переменные, и подстановка этих выражений в ограничения вместо переменных не входит в противоречие с заданными ограничениями на внешние переменные, то добавим к равенству Гpq (Гd pq ) с зануленными нелинейными частями ограничения {lpi £yi £upi |1£i£p} и {lqi £ji £uqi |1£i£q}. После этого исключаем из получившихся линейных ограничений все переменные, кроме внешних, и получаем искомые ограничения на внешние переменные.
4 Определение параллелизма по графу алгоритма
Циклы, все итерации которых информационно независимы, будем называть PARDO циклами. Независимость итераций сразу говорит о возможности их выполнения в любом порядке, в частности, параллельно. Данный вид параллелизма исключительно важен на практике, прежде всего, в силу простоты использования.
Точное определение информационной структуры программ позволяет точно выделять все PARDO циклы расширенного базового класса программ с помощью следующего критерия. Предположим, что исследуется цикл с параметром i1 .
Для того чтобы цикл обладал свойством ParDo, необходимо и достаточно, чтобы для любой тройки (Fk , Dk , Nk ) графа алгоритма данного цикла включение Dk Í Gk было верным на множестве Nk , где
Gk - область, задаваемая равенством f1 k = i1 ,
f1 k - первая компонента векторной функции Fk из тройки.
Разработан эффективный алгоритм, позволяющий проверять указанное включение Dk ÍGk , и, следовательно, определять независимость итераций циклов.
5 Пример применения техники межпроцедурного анализа
В качестве примера рассмотрим и проанализируем с использованием описанных методов следующийнебольшой фрагмент программы:
SUBROUTINE P(L, M, N)
DIMENSION A(L, M, N), B(L, M, N)
...
DO K = 2, N-1