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

Вопрос 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

  • если процессоров будет предостаточно

  • если процессоров будет недостаточно, то поочередно пачками, как решит компилятор и операционная система

  • ввиду многих задач и многих пользователей ситуация по числу свободных процессоров может меняться, что затрудняет наши измерения времени решения задачи

  • если компилятор не распараллеливает или процессор единственный, то действия выполняются поочередно по всем элементам, правда, программа выглядит покороче