Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ГОСЫ / Paral_programirovanie_otvety_3vopros

.pdf
Скачиваний:
182
Добавлен:
15.02.2016
Размер:
717.98 Кб
Скачать

Вопросы по курсу “Параллельные вычисления”.

1. Цели и задачи параллельной обработки данных. Особенности выполнения параллельных вычислений на общей и распределенной памяти. SMP-системы их преимущества и недостатки. Безобменные средства распараллеливания.

Цель параллельных вычислений - ускорить выполнение алгоритма за счет совмещения выполнения множества вычислительных операций над данными. Параллельный алгоритм должен:

1. при использовании интерфейса передачи данных выполнить:

а) оптимальное распределение данных по процессам,

б) при необходимости эффективный обмен данными,

в) по возможности обеспечить равномерную вычислительной нагрузки процессоров.

2.при использовании без обменных средств распараллеливания выделить блоки алгоритма, в

которых возможно выполнять параллельные вычисления, обращаясь к разным областям общей памяти.

Использовать параллельные вычисления стало возможным с появлением многопроцессорных вычислительных систем. Понятие нити (thread, light-weight process −

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

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

С появлением симметричных мультипроцессорных систем (SMP) отношение к процессам претерпело существенные изменения. В SMP системах физически присутствуют несколько процессоров, которые имеют равные права и скорость обращения к совместно используемой памяти. К моменту появления SMP выяснилось, что технология программирования еще не может предложить эффективного и безопасного способа реального параллельного программирования. Поэтому при реализации параллельных алгоритмов с использованием

1

интерфейса работы с общей памяти выполняется явная синхронизация для обеспечения

безопасного доступа к данным.

Достоинством организации параллельных вычислений на ВС с общей памятью,

является использование без обменных средств распараллеливание, что значительно

увеличивает производительность параллельного приложения при правильном обращении к

общей памяти.

Недостатком организации параллельных вычислений на ВС с общей памятью,

является доступ с разных процессоров к общим данным и обеспечение, в этой связи,

однозначности значений данных (cache coherence problem).

Наиболее распространенным интерфейсом для создания параллельных приложений на общей памяти является OpenMP. Интерфейс OpenMP является стандартом для программирования на SMP-системах, в него входит описание набора директив компилятора,

переменных среды выполнения программ и ряд процедур. В OpenMP любой процесс состоит из нескольких нитей управления, которые имеют общее адресное пространство, но разные потоки команд и раздельные стеки. В простейшем случае, процесс состоит из одной нити

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

2

2.Общие свойства параллельных алгоритмов. Полная и неполная параллельность. Особенности выбора способов распараллеливания.

Цель распараллеливания: - ускорить выполнение алгоритма за счет совмещения выполнения множества операций над данными. Алгоритмы, которые разрабатываются для использования в параллельных программах, обладают рядом общих свойств.

Свойство 1 - использование в алгоритме параллельной программы множественного выполнения (N раз) одного и того же более простого элементарного алгоритма:

Этим свойством обладают алгоритмы задач, в которых надо найти состояния S1, S2, … Sn

физической системы в разные последовательные моменты времени: T1, T2, …, Tn и дано состояние физической системы S0 в момент времени T0.

Состояние физической системы в момент времени i+1 можно описать как Si+1=Э(Si). Т.е.

алгоритм представляет собой последовательное выполнение более элементарного алгоритма

Э с входными данными Si и выходными Si+1, где Э – не зависит от i. (от i зависят входные данные и результат). Нельзя вычислить состояние Si, не вычислив предыдущее состояние Si-1

Свойство 2 - пространственная область разбивается на ячейки, если данные для выполнения вычислений в каждой ячейки независимы, то решение задачи может быть выполнено параллельно, с учетом их зависимостей соседних ячеек по данным.

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

Свойство 3 – параллельные алгоритмы допускают совмещение множества операций.

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

Например 1. Распараллеливание простых алгоритмов (axpy, скалярное произведение векторов). Функция axpy(Z, a, X, Y) выполняет следующее действие:

Z = a*X+Y, где a – скаляр (т.е. число) с плавающей точкой, X, Y и Z – векторы размера n

(т.е. каждый вектор есть набор n чисел с плавающей точкой). Для получения результата

3

можно разработать параллельный алгоритм, в котором вычисления выполняются над распределенными по процессам частями векторов X, Y и Z.

Рассмотрим понятие полной параллельности на примере функции axpy(Z, a, X, Y).

Очевидно, эта функция может быть выполнена на p-процессорах абсолютно параллельно,

если каждый процесс будет иметь в своей памяти соответствующую компоненту векторов X, Y и результирующего вектора Z.

В случае p<n (число процессов меньше длины векторов), можно сгруппировать компоненты векторов так, чтобы на каждом процессе оказалось k Pn компонент векторов

(для простоты предполагаем, что n – кратно р). Тогда, выполняя вычисления k компонент на каждом процессе, мы получим ускорение в р раз. В общем случае ускорение на P-

процессорной ЭВМ составит min(P,n).

Идентичность результата этой функции.

Здесь обратим внимание, что при параллельном выполнении функции результат будет точно таким же, как и при её последовательном исполнении (т.е. при P=1).

Пример 2. Скалярное произведение векторов vecvec_dot (a, X, Y) выполняет следующее действие a = X*Y где a – скаляр и X и Y – n-мерные векторы.

n 1

По определению скалярного произведения – это ( X iYi ) X 0Y0 X1Y1 ... X n 1Yn 1 . Эта

i 0

операция является типичной операцией во многих приложениях и для разработчиков ЭВМ имеет специальное название – свертка. Для простоты предположим, что компоненты вектора распределены по n процессам, n=Р и результатом (значением а) должен обладать, только

0-й процесс, в отличие от примера 1 , где результат хранится как распределенный вектор Z на каждом процессе.

Распараллелить вычисление этой функции можно выполнив независимо k Pn операций

умножения с соответствующим сложением в промежуточные переменные tmp_a, на каждом процессе. Потом, соответственно, просуммировать эти k временных переменных для получения окончательного результата на процессе 0.

4

Неполная параллельность этой функции.

Этот алгоритм также распараллеливаем, но уже не является абсолютно параллельным.

Т.к. для получения результата необходимо выполнить еще одну операцию - сложение промежуточных результатов на нулевом процессе.

Отсюда следует следующее свойство параллельных алгоритмов.

Свойство 4 - издержки, связанные с распространением информации, обусловленные сбором некоторых данных на одном процессе, либо обмен данными между несколькими или всеми процессами.

Свойство 5 незначительное отличие численного результата у последовательного и параллельного алгоритма.

Это связано с чувствительностью к порядку выполнения арифметических операций и,

возможно, различным порядком вычислений над плавающими числами в последовательном и параллельном алгоритмах. Например, если мы имеем 4 вещественных числа: a, b, c и d, то выполняя операции: ((а + b) + (c + d)) – ((а + c) + (b + d)) в последовательном режиме на одном процессоре и в параллельном варианте на множестве процессоров получим разные результаты. Поскольку при записи в 64-х разрядную переменную (ячейку памяти),

происходит обрывание результата, расположенного на сумматоре (регистр процессора, в

который заносится результат арифметической операции), из-за того, что сумматор современных процессоров длиннее (80 разрядов). При распараллеливании нам приходится использовать несколько сумматоров (у каждого процессора – свой). Дополнительно нам придется обмениваться данными, а это возможно только через память (через сумматоры – невозможно), поэтому наиболее точные промежуточные значения, полученные каждым отдельным процессоров при записи в память, теряют свою точность. Поэтому ((а+ b) + (c + d)) – ((а + c) + (b + d)), выполненные на 1 процессоре и (а+b), (c+d), (а+c), (b+d), выполненные на нескольких процессорах, при записи в память процессора потеряют свою точность (с 80

разрядов регистра на 64 разряд переменной в памяти). При дальнейшем суммировании этих частичных сумм каким-либо из процессоров, также возможна потеря точности результата, в

отличие от чисто последовательного порядка вычислений одним процессором.

5

Общие особенности выбора способов распараллеливания.

Во-первых, для ускорения счета часто разрабатывается другой параллельный алгоритм,

эквивалентный исходному последовательному аналогу только по конечному результату вычислений.

Во-вторых, не всегда высоко параллельный алгоритм, столь же экономичен, чем менее параллельный (иногда последовательный алгоритм производительнее параллельного).

Например, если параллельный алгоритм в k раз дороже, чем последовательный алгоритм,

приводящий к такому же результату, то его исполнение на P<k процессорах займет не меньше времени, чем исполнение последовательного алгоритма на одном процессоре.

Параллельный алгоритм, сложность которого растет пропорционально увеличению числа задействованных процессоров бессмысленен.

6

3. Последовательные и параллельные участки программы, эффективность распараллеливания. Неравенство Амдаля.

Абсолютно параллельных алгоритмов, за исключением тривиальных случаев, не бывает.

Как правило, алгоритм параллельной программы представляет собой последовательность параллельных и последовательных участков, т.е. распределение данных и их обработку на всех или отдельных процессах. Поэтому естественно, чем меньше время выполнения последовательных участков. Например, если алгоритм таков, что на первом последовательном шаге – работа последовательна и всего составляет 10%, а на втором шаге

(90% всей работы) имеет место абсолютная параллельность на каком угодно большом числе процессоров, то это ещё не означает, что мы получим высокую отдачу от такого параллельного алгоритма. Действительно, время решения задачи ни на каком числе процессоров не сократится в 10 и более раз (если только не вступают в игру факторы возможного повышения производительности за счет сокращения удельного объема обрабатываемых данных на процессоре, например уход от свопа, уменьшение кэш-

промахов). В отдельных случаях на практике – последовательное выполнение участка завуалировано дублированием работы последовательного участка на всех процессорах.

Обобщением этого факта является неравенство (закон) Амдаля.

Неравенство Амдаля.

Пусть процессоры – однородны по производительности,

Т0 – время выполнения последовательной части параллельного алгоритма, например для генерирования начальных данных и обработки полученного при решении задачи результата.

Т1, Т2, ... Тp – время последовательной работы каждого процессора при выполнении задачи в параллельном режиме, без взаимодействия между собой. Тогда время выполнения задачи на p процессорах определяется неравенством:

Tpar

T0

max(Ti ) T0

 

 

i

p

(Ti )

i 1

 

.

Здесь i=1, 2, ... p. Равенство получается, когда Тi

 

 

 

p

 

p

равны между собой. Отсюда, подставляя (Ti ) = Tseq – T0, где Tseq есть время выполнения

i 1

задачи на одном процессоре, получаем:

7

Tpar ≥ T0 +

Tseq T0

. Делим на Tseq и, обозначая через f = T0 / Tseq - долю (fraction)

p

 

 

последовательного участка в общем объеме вычислений, получим:

Tpar

f

(1 f )

.

Tseq

p

 

 

Ускорение – это отношение времени выполнения задачи в последовательном режиме на 1

процессоре, ко времени выполнения задачи в параллельном режиме.

S ( Speedup Tseq ) на p процессорах (обратная величина левой части неравенства) получим:

Tpar

S

 

1

 

 

p

 

 

(1.1)

 

 

 

 

 

 

 

f

(1 f )

 

( p 1) f 1

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Отсюда видно, что при f=0 и равенстве Ti мы получим S=p . При f (константа) >0

и p → ∞ бесконечность

 

мы получим

S

1

. Данная функция является монотонно-

 

f

 

 

 

 

 

 

 

 

 

возрастающей по p и, значит, достигает максимума на бесконечности. Следовательно, ни на

каком числе процессоров ускорение счета не может превысить обратной величины доли последовательного участка.

Эффективность распараллеливания.

Эффективность распараллеливания – это способность алгоритма задачи использовать все задействованные процессоры на 100%. Формула вычисления эффективности :

S

E 100% (1.2)p

Т.е. если ускорение S = p (максимально возможное на p процессорной машине), то эффективность распараллеливания задачи равна 100%. Используя закон Амдаля получаем:

 

 

1

 

 

E ≤ 100%

 

 

 

(1.3)

 

 

 

(1 f ( p 1))

 

 

 

 

 

 

Например, E ≤ 52.25%

для p=100 и f=0.01 и E ≤ 9.1% для p=1000 и f=0.01.

Вывод. Отсюда ясно, что распараллеливание для большого числа процессоров представляет гораздо более трудную задачу, поскольку всё большую часть работу программы следует делать параллельной. Например, если f=0.01 (1%), то Е<100 и использовать для

8

решения параллельной задачи более 100 процессоров нецелесообразно. Для повышения

эффективности, например, не распараллеливают управляющие части программы или

небольшие участки вычислений, которые требуют интенсивной синхронизации

процессов.

9

4. Понятие масштабируемости и балансировки параллельных алгоритмов задач. Основные способы распараллеливания: крупноблочное, мелкозернистое, конвейерное.

Масштабируемость задачи.

Масштабируемость задачи – это пропорциональное увеличение объема задачи с увеличением числа процессоров.

Наличие масштабируемости задач является важным свойством тестовых систем оценки производительности параллельных ВС.

Пример. Поэлементное сложение массивов. Задача будет масштабируемой, если количество элементов массивов будет равно произведению количества элементов распределенного по процессам массива (это постоянная величина) на число процессов (р). Очевидно, что чем больше p, тем больше количество элементов массива. Возможны 2 способа генерации и распределения элементов:

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

2)генерация на каждом процессе локальной части массива по определенному алгоритму,

который определяет зависимость элементов глобального массива, если такая зависимость существует (данный способ не зависит от числа процессов).

Если предположить, что f не обязательно константа в законе Амдаля, а может уменьшаться при увеличении p, то теоретически можно получить неограниченное ускорение

S, несмотря на наличие последовательного участка. Например, если f kp , то

S ≤

 

 

1

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

k 1

k

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

k

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

p

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

и при стремлении p к бесконечности мы можем получить пропорциональное ускорение S(p) ≈ a . p, где a < 1.0.

10