
Лекции / Лекция 6
.docТехнологии и методы программирования. Лекция 6.
Максимально достижимое ускорение.
Оценим верхнюю границу эффективности:
Sp<=ts/ tp
При этом tp=f*ts+(1-f)*ts/p, где ts – всё время выполнения, f – доля последовательных, нераспараллеленых операций в алгоритме, tp — время выполнения последовательных операций. Тогда Sp<=ts/ tp = ts/(f*ts+(1-f)*ts/p) = 1/(f+(1-f)/p). Полученное соотношение называется законом Амдаля. Для паракомпьютера, при бесконечном количестве процессоров, верхняя граница эффективности стремится к 1/f. Так, в модифицируемой каскадной схеме сложения элементов последовательности f=n/log(n), значит, при размерности 16 ускорение не может быть выше 4 при любом количестве процессоров. Закон Амдаля используется в сравнении алгоритмов — чем меньше f, тем лучше эффективность. При этом предполагается, что f постоянно, хотя для большинства параллельных алгоритмов f зависит от размерности: чем меньше размерность, тем меньше f. Если оптимизировать число процессоров, и начать увеличивать размерность, что ускорение будет возрастать, так как f будет уменьшаться. Это называется эффектом Амдаля.
Пример: модифицированная каскадная схема сложения элементов последовательности.
Tp=n/p+log2p
f=1/p+log2p/n
Видно, что с ростом размерности f падает.
Экспериментальное определение f. (идея предложена Бакановым)
Баканов пришёл к выводу, что теоретически определить f тяжело, так как операции по разделению парных ветвей алгортма выполняются компилятором/средствами поддержки, работу которых теоретически предсказать трудно. Он предложил определять f экспериментально:
f=(p/Sp-1)/(p-1)
Для расчёта нужно построить график эффективности от числа процессоров, а затем методом наименьших квадратов определить уровень наклона и, по нему, f.
Бакановым было показано на кластере МГУ, что при умножении матриц f=0,051 при сложности алгоритма O(n3). Таким образом, оказалось, что оценка верхней границы ускорения по Амдалю сильно завышена, и было предложено использовать формулу
Sp=1/(1+(1-f)/p+c), где с — коэффициент деградации.
с=cw*ct
cw=wc/w
ct=tc/t, где с — коэффициент, определяющий свойства алгоритма, wc — количество операций коммуникации, w – общее число операций, ct — отношение вычислительной производительности платформы (tc) к вычислительной производительности сетевого оборудования (t). Эти коэффициенты могут быть рассчитаны экспериментально.
Закон Густавина — Барсена:
g=t(n)/(t(n)+π(n)/p), где t(n) – время выполнения последовательных операций, а π(n) – параллельных. Если при увеличении размерности g стремится к 0, то эффективность стремится к количеству процессоров — это характерно для хороших алгоритмов. Оценка ускорения с помощью g называется ускорением масштабирования.
В некоторых случаях стоит вопрос не о быстрейшем решении задачи, а о её решении хотя бы за какое-то реальное время. При этом необходимо добиться равномерной загрузки процессоров. Если равномерность вычислительной нагрузки сохраняется с ростом размерности задачи, то добавление дополнительных процессоров будет снижать время расчёта. Интегральная оценка нагрузки процессоров — мера эффективности параллельных вычислений.
Алгоритм называется масштабируемым, если при увеличении числа процессоров он обеспечивает рост ускорения при сохранении эффективности.
T0=pTp-T1, где T0 — время, которое тратится на накладные расходы: синхронизацию, разбиение на параллельные ветви, Tp – время выполнения на p процессорах, а T1 — на 1.
Tp=(T0+T1)/p
Sp=T1/Tp=p*T1/(T0+T1)
Ep=T1/(T0+T1)
Если p сохраняется, а размерность растёт, то повышается эффективность. Если размерность сохраняется, а количество процессов возрастает — эффективность падает. Таким образом можно сбалансировать алгоритм: увеличивать число процессоров в соответствии с ростом размерности так, чтобы эффективность была постоянной. В этом и заключается задача проектирования масштабируемого алгоритма.