- •Вопрос36. Двухуровневая структура программ. Присоединение (ассоциирование) данных носителя к процедуре
- •Вопрос37. Трёхуровневая структура модуля. Присоединение (ассоциирование) данных модуля к программе
- •Вопрос 38. Модульные, внешние и внутренние программы
- •Вопрос 41. Оператор и конструкция forall
- •Вопрос 42. Оператор и конструкция where
Вопрос 42. Оператор и конструкция where
Ветвление where по форме записывается аналогично If в 3 разновидностях с количеством блоков 2, 1, 0
-
if (скаляр-условие) then ! с 2 блоками .. .. блок ДА else if .. .. блок НЕТ end if
where (конформное_условие ) ! с 2 блоками .. .. блок ДА - _действия, конформные условию else where .. .. блок НЕТ - действия, конформные условию end where
if (скаляр-условие) then ! с 1 блоком .. .. блок ДА end if
where (конформное_условие ) ! с 1 блоком .. .. блок ДА - действия, конформные условию end where
if (скаляр-условие) единственный_простой_! 0 блоков
where (конформное_условие ) единственный_простой_конформный ! 0 блоков
Отметим внешнее сходство if и where - оба они ветвления. Однако есть кардинальное отличие
if задает скалярное ветвление, группируя действия над скалярами или векторами целиком
where - это векторное покомпонентное ветвление, которое группирует параллельные действия над компонентами векторов, матриц, многомерных массивов, секций с непременным требованием конформности условия и действий
Имеется также определенное сходство where с Do - оба могут обрабатывать массивы. Правда, Do может задавать закон изменения лишь одного индекса массива по какому-либо измерению, а where обеспечивает работу по всем компонентам массива независимо, не важно, сколько в нем измерений. Следует подчеркнуть, что имеется принципиальное различие Do и where:
Do обрабатывает компоненты вектора последовательно
where обрабатывает компоненты вектора независимо, параллельно
Так что where - это вовсе не цикл, а перечисление потенциально параллельных процессов. Реально параллельность достигается только в случае распараллеливающего компилятора и наличия многих процессоров. В случае, когда компилятор не умеет распараллеливать, конструкция where для одномерного массива как бы заменяет Do и If.
Порядок действий, соответствующих where
вычисляется конформная маска
затем над всеми элементами конформных массивов выполняются конформные действия - одно или несколько в последовательности заданной в блоке where
действия выполняются только для истинных значений в маске
действия выполняются параллельно
Как всегда, параллельность - это прежде всего независимость процессов, потенциальная способность - в том смысле, что это станет реальностью,
если будет использован распараллеливающий компилятор IFC
если процессоров будет предостаточно
если процессоров будет недостаточно, то поочередно пачками, как решит компилятор и операционная система
ввиду многих задач и многих пользователей ситуация по числу свободных процессоров может меняться, что затрудняет наши измерения времени решения задачи
если компилятор не распараллеливает или процессор единственный, то действия выполняются поочередно по всем элементам, правда, программа выглядит покороче