Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы 36-42.docx
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
38.69 Кб
Скачать

Вопрос 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.      наличие многих процессоров