- •Вопрос36. Двухуровневая структура программ. Присоединение (ассоциирование) данных носителя к процедуре
- •Вопрос37. Трёхуровневая структура модуля. Присоединение (ассоциирование) данных модуля к программе
- •Вопрос 38. Модульные, внешние и внутренние программы
- •Вопрос 41. Оператор и конструкция forall
- •Вопрос 42. Оператор и конструкция where
Вопрос 41. Оператор и конструкция forall
В конструкции where управляющая маска задается в векторной форме, а в конструкции forall маска задается более гибко по отношению к индексированным переменным. Аналогично и выражения в блоке задаются по отношению к индексированным переменным. Другими словами выполняются маскированные конформные действия в пространстве некой секции. Пространства изменения индексов такой виртуальной секции задаются в заголовке forall триплетами, аналогично заданию триплетами секций массивов. Заголовок конструкции forall задает триплеты по ряду измерений и маску отбора к полученной секции по смыслу аналогичную where.
Аналогично DoWhile конструкция forall управляет блоком операторов, но в отличие от DoWhile управляющая маска векторная, в общем случае многомерная, но не скалярная. Действия над компонентами секции выполняются параллельно и независимо.
Триплеты, указывающие законы изменения индексов в секции, и маску для секции задают
в простом безблочном операторе forall (индексимярек=триплет, .. [, маска_секции]) единственный_простой_конформный
или в составном одноблочном операторе forall (индексимярек=триплет, .. индексимярек=триплет [, скалярная_маска_секции] ) .. .. маскированные действия, конформные секции, построенной по всем возможным комбинациям индексов из триплетов end forall
У Forall есть аналогии
с Where - оба задают работу с многомерным объектом
с вложенными Do - обе конструкции задают закон изменения индексов в виде арифметической прогрессии по триплету в заголовках
с Do - и в теле оператора forall элементы массивов адресуются по индексам, заданным в заголовке forall
Однако смысл адресации элементов массива в Do и в forall абсолютно разный
o в Do элементы массива выбираются последовательно по мере изменения индексов
o в forall элементы массива выбираются независимо-параллельно, по предварительно построенным всем возможным комбинациям индексов, порядок обработки в языке не фиксирован
Таким образом
DO - основа последовательного выполнения повторяющихся действий
Forall - основа параллельного выполнения повторяющихся действий
Любое присваивание массивов и WHERE можно переписать как FORALL, но некоторые FORALL не могут быть записаны только на уровне манипуляций с массивами в WHERE.
Например, легко записать через FORALL: WHERE(A /= 0.0) B = 1.0 / A - сами напишите
Однако, следующий пример FORALL нельзя записать на уровне манипуляций с массивами FORALL(I = 1:N, J = 1:N) H(I, J) = 1.0/(I + J - 1)
Этот оператор устанавливает элемент массива H(I, J) равным значению 1.0/ (I + J - 1) для любых пар значений I и J между 1 и N.
Forall задает
список имен индексов, варьируемых в секции
каждому поименованному индексу сопоставлен триплет, определяющий закон его изменения
после списка задается необязательная маска, конформная секции, которая записывается в терминах варьируемых индексов
над какими компонентами массивов, какие именно действия и в какой последовательности - задается в блоке оператора forall
порядок обработки компонент в языке не фиксирован
Порядок действий, соответствующих forall
по заданным триплетам создаются списки всех возможных значений индексов
далее формируются все комбинации индексов
по комбинациям индексов формируется секция и конформная ей маска
затем независимо-параллельно выполняются конформные действия в последовательности заданной в блоке
действия выполняются только для истинных значений конформной им маски
Получается, что это не цикл, а перечисление потенциально параллельных процессов.
Синтаксис записи триплетов в forall через двоеточие ещё раз подчёркивает
уместность аналогии с секциями, а не циклами
параллельность, а не последовательность
чтобы потенциально параллельная конструкция стала реально таковой, непременны 2 условия
1. распараллеливающий компилятор, как IFC
2. наличие многих процессоров