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

[ООП] / Лекции / Lecture_1

.pdf
Скачиваний:
35
Добавлен:
07.02.2016
Размер:
211.13 Кб
Скачать

Лекция 1

Введение

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

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

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

Когда говорят о повышении быстродействия компьютеров, не всегда задумываются, за счет чего достигается это быстродействие. Действительно, при сравнении компьютеров мы часто говорим о типе процессора, о его производителе, о тактовой частоте, об объеме и наличии кэша, о частоте системной шины, ну, может быть, еще о некоторых двух-трех характеристиках. В литературе по высокопроизводительным вычислительным системам приводятся примеры сравнения увеличения тактовой частоты и увеличения быстродействия процессоров. Например [1], с 1949 года производительность компьютеров возросла почти в два миллиарда раз, а тактовая частота всего лишь в 1500 раз.

Приведем собственный пример. Еще можно найти, находящиеся в эксплуатации компьютеры с процессором i386, с тактовой частотой 40 МГц. На одной из вычислительных задач этот процессор показал производительность около 250 тыс. операций умножения с плавающей точкой в секунду. Процессор Pentium IV с тактовой частотой 1.76 ГГц. на такой же задаче обеспечил производительность 250 млн. операций. Т.е. тактовая частота процессора Pentium IV в 44 раза выше тактовой частоты процессора i386, а производительность в 1000 раз. Подобный эксперимент был проведен с процессором Pentium III Copermine 933 МГц. Производительность на той же задаче оказалась 925 млн. операций. Да, именно, тактовая частота ниже, чем у Pentium IV, а быстродействие на вычислительной задаче выше почти в четыре раза. Тактовая частота больше по сравнению с i386 в 23 раза, а быстродействие – в 3700.

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

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

Уже на первых компьютерах, тогда их принято было называть Электронные Вычислительные Машины (ЭВМ), применялись методы разделения в обработке данных. Прежде все-

2

го, были операции, непосредственно выполняющие вычисления и операции ввода-вывода данных. Так, в 1958 году в IBM 704 были введены шесть специальных процессоров вводавывода, которые позволили центральному процессору вычислять параллельно с работой по вводу-выводу данных. В современном компьютере присутствуют множество процессоров, которые мы называем контроллерами, которые обеспечивают параллельную работу по передаче данных между ОЗУ и дисками, быстрый перенос данных, минуя центральный процессор через канал прямого доступа в память, управление видеосистемой, звуком и т.п.

Так же идеи распараллеливания были применены в первых компьютерах и в самом арифметическом устройстве ЭВМ. Одна из главных идей параллельной обработки уже была заложена в том, что данные обрабатываются словами, а не поразрядно. Для этого были решены вопросы параллельной выборки слов из памяти, перенос между разрядами слова при арифметических операциях. Идеи конвейеризации, которые состоят в совмещении во времени различных этапов обработки слов, были воплощены в 1961-1962 гг. в машинах IBM STRETCH и ATLAS. А в 1964 г. под руководством С. Крэя был создан суперкомпьютер CDC-6600, который содержал десять процессоров. Затем в 1969 г. был создан суперкомпьютер CDC-7600, который в центральном процессоре содержал восемь конвейерных устройств. К слову сказать, современный Pentium VI содержит четыре 20-ступенчатых конвейера.

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

Рассмотрим эти виды

на примере умножения двух

квадратных матриц A =

aij

N ×K

и

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B =

 

 

 

bij

 

 

 

K ×M . Для элементов результирующей матрицы C =

 

 

 

cij

 

 

 

N ×M

можно записать фор-

 

 

 

 

 

 

 

 

 

 

 

 

мулу

= aik bkj , i =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cij

 

, j =

 

,

k =

 

.

(1.1)

 

 

 

 

 

 

 

 

 

 

 

1, N

1, M

1, K

 

 

 

k

Алгоритм умножения матриц выразим с помощью тройного цикла на языке С:

for(i=1;i<=N;i++)

for(j=1;j<=M;j++)

for(k=1;k<=K;k++)

c[i][j]+=a[i][k]*b[k][j];

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

сохранения результатов арифметических операций. Тогда процесс умножения двух квадратных матриц, состоящих из двух строк и двух столбцов ( n = 2 ) обычным последовательным способом можно представить в виде схемы (рис.1.1):

Рис.1.1 – Умножение матриц на последовательном арифметическом устройстве Таким образом, время вычисления произведения матриц будет равно

T = 2n3t

op

.

(1.2)

s

 

 

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

3

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

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

Рис.1.2 – Умножение матриц на двухступенчатом конвейерном вычислителе

О процессе, показанном на рис.1.2. можно сказать, что он организован на двухступенчатом конвейерном арифметическом устройстве. Нетрудно подсчитать затраты времени на умножение наших матриц:

T = l + n3

1,

(1.3)

c

 

 

где l - число ступеней или длина конвейера.

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

 

T

2n3top

 

2n3

 

 

Sc =

s

=

 

 

=

 

 

(1.4)

 

(l + n3

1)top

l + n3

 

 

Tc

 

1

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

В общем случае, если конвейер имеет l ступеней, а время обработки одной единицы данных требует l операций, максимальное ускорение при обработке n единиц данных равно:

Sc =

Ts

=

l n

 

(1.5)

Tc

l + n 1

 

 

 

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

4

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

Рис.1.3 – Умножение матриц на параллельной системе из четырех процессоров В этом случае время и ускорение умножения матриц можно записать как

Tp =

2n

3

, S p =

 

2n

3

= 4 .

(1.6)

4

 

 

2n3

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

Легко представить процесс умножения на восьми процессорах, тогда ускорение будет равно восьми.

Если каждый из параллельных процессоров содержит конвейерные арифметические устройства, можно получить еще большее ускорение. Процесс вычисления на двух- и четырехпроцессорных системах показан на рис.1.4.

Рис.1.4 – Совмещение параллельной и конвейерной обработок

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

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

5

Рис.1.5 – Умножение матриц на векторном вычислителе

Векторные процессоры имеют несколько однотипных арифметических устройств, работающих по одной команде. Так, по команде умножить поэлементно умножаются все компоненты двух векторов, а по команде сложить – складываются. Таким образом, операция выполняется сразу над вектором данных. В нашем случае, как показано на рис 1.5., умножение матриц можно выполнить за два этапа. Ускорение по сравнению с последовательным умножением будет равно восьми.

Несмотря на то, что и параллельный и векторный принципы вычислений во многом схожи, имеется одно существенное различие: при параллельном вычислении каждый из вычислительных узлов может выполнять свою операцию над различными данными; векторный вычислитель выполняет одну и ту же операцию над множеством однотипных данных. Например, параллельный вычислитель может в данный момент на одном процессоре выполнять вычисление функции f1(x1 ), на другом - f1(x2 ) и т.д. Векторный процессор может вычис-

лить за единицу времени одну функцию, например f1(x1) , f1(x2 ) , …, f1(xn ) , от разных

аргументов, число которых равно длине векторного арифметического устройства n . Известны также архитектуры суперкомпьютеров, сочетающих в себе векторный прин-

цип вычислений с конвейерным, например, Cray C90. Приведенные на рис.1.1.-1.5 схемы отражают лишь общие принципы вычислений, но не учитывают множество факторов, которые в реальности снижают ускорение вычислений. К этим факторам можно отнести затраты времени на обращение к памяти, на разрешение конфликтов доступа к общим ресурсам компьютера, на первоначальный разгон конвейера, т.е. на заполнение всех его секций, на инициализацию векторов векторного арифметического устройства. Некоторые вопросами, связанные с накладными расходами параллельных, конвейерных и векторных вычислений мы подробнее ознакомимся в последующих разделах.

Помимо организации арифметических устройств для выполнения эффективных вычислений, большую роль играет организация памяти компьютеров. Понятно, что время доступа к памяти должно быть меньше или, по крайней мере, соизмеримо со временем выполнения арифметических операций. Известно, что в компьютере присутствуют ОЗУ, ПЗУ, кэшпамять, дисковая память. Все виды памяти отличаются как по объему, так и по времени доступа. Поэтому для высокоэффективных вычислений необходимо правильно распределить данные между этими памятями. В простых задачах мы, как правило, не задумываемся над распределением памяти. Но тот, кто создавал программы для сложных и громоздких вычислительных задач, с проблемой распределения данных в памяти сталкивался. Неудачная организация работы с оперативной памятью может увеличить время реализации алгоритма в несколько раз [1].

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

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

6

языка. Так, например, двумерные массивы (матрицы) в программе, написанной на языке FORTRAN, после компиляции хранятся в памяти в виде столбцов, а в языке C – в виде строк. Значит, время выборки последовательных элементов этих массивов из памяти будет различной. Действительно, если элементы размещены по столбцам, то доступ к последовательным элементам строки будет выполняться с шагом, равным числу строк в этой матрице. Если матрица хранится по строкам, то доступ к элементам столбца будет выполняться с шагом, равным числу столбцов матрицы. Время доступа к элементам массива, которые не следует один за другим, может, в зависимости от размера матрицы, в несколько раз превышать время доступа к элементам, размещенным в памяти в последовательных ячейках.

На рис.1.6.-1.7 показаны затраты времени на умножение больших матриц, программа-

ми, полученными с помощью компиляторов Visual C++6, Boland C++ Builder Pro и gcc (Linux 7.2). Графики, помеченные цифрой 1, относятся к обычному методу, по приведенному выше алгоритму умножения матриц. Как видно из алгоритма, доступ к элементам первой матрицы осуществляется последовательно, а к элементам второй – с шагом, равным числу столбцов матрицы. Графики, обозначенные цифрой 2, получены при использовании модифицированного алгоритма умножения, при котором вторая матрица предварительно транспонирована и выборка ее элементов выполняется так же, как и элементов первой матрицы. На рис 1.8. показаны вычисленные при этом ускорения, т.е. отношения времени первого метода умножения ко времени, затраченному при модифицированном методе умножения.

Рис.1.6 – Затраты времени на вычисление произведения матриц программами, реализованными с помощью компиляторов Visual C++6 (слева) и Boland C++ Builder Pro (справа)

Рис.1.6 – Затраты времени на вычисление произведения матриц для программы, реализованными с помощью компилятора gcc (слева) и ускорения (справа)

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

7

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

Список рекомендуемой литературы

1.Корнеев В.В. Параллельные вычислительные системы.- М.: "Нолидж",1999.-320 с.

2.Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ-Петербург, 2002.

– 608 с.

3.Немнюгин С.А., Стесик О.Л. Параллельное программирование для многопроцессорных вычислительных систем. - СПб.: БХВ-Петербург, 2002. – 400 с.

4.Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. – М.: Издательский дом "Вильямс", 2003. – 512 с.

5.Лацис А. Как построить и использовать суперкомпьютер. – М.: Бестселлер, 2003. – 240 с.

6.Ортега Дж. Введение в параллельные и векторные методы решения линейных систем. -

М.: Мир, 1991.-367 с.

7.Хокни Р., Джессхоуп К. Параллельные ЭВМ. Архитектура, программирование и алгоритмы.– М.: Радио и связь, 1986. – 392 с.

8.Шпаковский Г.И. Параллельные микропроцессоры для цифро вой обработки сигналов и медиа данных. – Мн.: БГУ, 2000. – 196 с.

9.Шпаковский Г.И. Организация параллельных ЭВМ и суперскалярных процессоров: Учеб.

пособие. — Мн.: БГУ, 1996. – 296 с.

10.Шпаковский Г.И., Серикова Н.В. Программирование для многопроцессорных систем в стандарте MPI. – Мн.: БГУ, 2002. – 323 с.

11.Букатов А.А., Дацюк В.Н., Жегуло А.И. Программирование многопроцессорных вычислительных систем. Ростов-на-Дону. Издательство ООО "ЦВВР", 2003. – 208 с.

12.Lastovetsky А.L. Parallel Computing on Heterogeneous Networks. John Wiley & Sons, 2003.

13.Grama A., Gurta A., Karypis G., Kumar V. Introduction to Parallel Computing, Second Edition. Addison Wesley, 2003. – 856 p.

14. Beowulf Cluster Computing with Linux, Second Edition by William Gropp, Ewing Lusk and Thomas Sterling (eds). The MIT Press, 2003. – 618 p.

15.Антонов А.С. Параллельное программирование с использованием технологии MPI: Учебное пособие. – М.: Изд-во МГУ, 2004. – 71 с.

Высокопроизводительные вычислительные системы и параллельное программирование. Кудерметов Р.К.

Соседние файлы в папке Лекции