1 1 Возможные недопонимания

В некоторых случаях может сложиться впечатление, что кластер не работает, или работает совсем не так, как это следует из теории. Мне несколько раз приходилось общаться с людьми, которые попробовали развернуть тестовый кластер и прогнать на нем пример из предыдущего раздела (уравнение теплопроводности). Результаты получались неожиданные: параллельная программа работала в лучшем случае не медленнее, чем обычная последовательная. Сразу скажу, теория, описанная в предыдущих разделах, работает, когда кластер состоит из одинаковых узлов с одинаковым быстродействием. Однако, часто случается, что для тестирования параллельных программ используются доступные на момент проведения эксперимента компьютеры, обладающие различным быстродействием. Это и есть источник неожиданных разочарований.

Кластер из N узлов работает с эффективным быстродействием, равным быстродействию самой медленной машины, умноженному на N. Если не предпринять дополнительных действий.

Для того, чтобы понять, что в реальности происходит с параллельной программой, работающей на кластере, состоящим из неодинаковых узлов, возьмем нашу программу расчета уравнения теплопроводности diffp.f. Размер разностной сетки для нашего эксперимента возьмем равным 3000x3000 элементов. Кластер для эксперимента будет построен из трех машин, обладающих различным быстродействием.


Node1 Node2 Node3 Node1,Node2 Node1,Node3 All
Размер сетки 3000x3000 3000x3000 3000x3000 3000x1500 3000x1500 3000x1000
t, Node1
34,04 сек.

14,24 сек. 14,24 сек. 9,09 сек.
t, Node2
11,92 сек.
6,07 сек.
3,95 сек.
t, Node3

63,33 сек.
23,28 сек. 15,22 сек.
Время исполнения теоретическое 34,04 сек. 11,92 сек. 63,33 сек. 14,24 сек. 23,28 сек. 15,22 сек.
Время исполнения реальное 32,76 сек. 12,15 сек. 62,23 сек. 13,86 сек. 23,97 сек. 15,81 сек.

Экспериментальный кластер, с которым мы будем работать, состоит из трех узлов с различным быстродействием. Самый быстрый узел - Node2. Самый медленный - Node3. Это видно в первых трех колонках приведенной таблицы: параллельная программа с сеткой 3000х3000, запущенная в виде одного процесса, показывает заметно разное время исполнения на различных узлах.

Далее мы разбиваем сетку попалам и пытаемся выполнить параллельную программу, задействовав по два разных узла - четвертая и пятая колонки сводной таблицы. И, наконец, делим сетку на три равных части (шестая колонка) и запускаем программу на всех трех узлах кластера.

Теоретически общее быстродействие кластера не превышает быстродействия самого медленного узла кластера. При условии, что объем вычислений на всех узлах одинаков, что имеет место быть в нашем эксперименте. Результаты, собранные в таблице, демонстрируют именно такое поведение кластера. Плюс-минус небольшие накладные расходы на передачу данных по сети. Мы видим, что время, потраченное программой непосредственно на вычисления, различается в соответствии с быстродействием узла. Но, поскольку кроме собственно вычислений каждый процесс параллельной программы вынужден синхонизироваться с остальными процессами, то на быстрых узлах после каждой итерации имеется период ожидания, необходимый для того, чтобы медленные узлы "догнали" более быстрые.

Другими словами, если мы производим вычисления над разностной сеткой размером 3000х3000 элементов с помощью кластера, состоящего из трех узлов, и равномерно распределяем сетку между узлами, то есть по 3000х1000 элементов, то время выполнения параллельной программы 3000х3000 на трех узлах будет примерно равно времени выполнения параллельной программы 3000х1000 на самом медленном узле кластера. Именно такой результат получился в нашем эксперименте.

Для получения же максимального быстродействия кластера при различии мощности узлов, необходимо разностную сетку поделить между узлами НЕ равномерно, а в соответствии со скоростными характеристиками узлов.

В нашем случае сетка должна быть поделена примерно следующем образом:
Node1: 3000x683
Node2: 3000x1950
Node2: 3000x367

При таком распределении сетки общее время выполнения параллельной программы в моем эксперименте было равно 8,28 сек., что почти вдвое лучше, чем при равномерном распределении области вычислений. При таком "правильном" разбиении сетки таблица результатов будет выглядеть уже так:


Node1 Node2 Node3 All, optimal
Размер сетки 3000x3000 3000x3000 3000x3000 3000x(838|1950|367)
t, Node1
34,04 сек.

6,36 сек.
t, Node2
11,92 сек.
7,81 сек.
t, Node3

63,33 сек. 4,60 сек.
Время исполнения теоретическое 34,04 сек. 11,92 сек. 63,33 сек. 7,81 сек.
Время исполнения реальное 32,76 сек. 12,15 сек. 62,23 сек. 8,28 сек.

Copyright © 1998-2011 Юрий Сбитнев