Сучасні інформаційні технології/Обчислювальна техніка і програмування

Гопанюк О. В.

Мясіщев О. А.

Хмельницький національний університет, Україна

Дослідження ефективного використання багатоядерних процесорів для вирішення деяких задач лінійної алгебри

В наш час одно процесорні системи послідовних програм не мають перспективи для виконання високо програмованих обчислень, що пов’язано з неможливістю відводу тепла для високих частот, обмеженням передачі даних швидкості світла. В зв’язку з цим перспективи напрямку мають паралельні системи. Розглянемо паралельні системи на базі багатоядерних процесорів. На сьогоднішній день існує багато задач, де доцільно застосовувати розпаралелювання по ядрах: завдання перенесення тепла, розрахунку на міцність, задач теорії пластичності, пружності, де широко використовується метод кінцевих елементів. Також в різних галузях застосовуються матричні обчислення, при математичному моделюванні різних процесів і явищ. З врахуванням ефективного виконання матричних розрахунків багато стандартних бібліотек програм містять процедури для матричних операцій та оптимізації їх роботи [1].

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

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

Оцінку продуктивності комп'ютера будемо робити в Мегафлопсах (1 MFLOPS - мільйон операцій з плаваючою точкою за одну секунду). Розділимо число операцій на час, помножений на 1000000, формула 1.

     (1)

За обчислювальну систему приймемо комп’ютер на базі 6-ти ядерного процесора AMD Phenom™ II; Soket AM3; Частота процессора 3.2 ГГц; L3 кеш: 6 Мб; L2 кеш: 512 Кб. Операційну систему оберемо 10.04.2-desktop-amd64, компілятор – Fortran 77. Компіляція програми здійснюється за допомогою скрипта mpif77, виконання – скрипта mpirun:

mpif77 –O3 radw6.f –o radw6

mpirun –np 6 –machininefile machines radw6

Тут radw6.f – початковий текст програми, radw6 – виконуваний модуль, опція –O3 повідомляє компілятор про необхідність оптимізації коду, параметр –np – задає кількість ядер, на яких обчислюватиметься програма.

В досліджуваннях використовуватиметься компіляція програм без оптимізації коду та з ключем  O3 для оптимізації [2].

1.                 Розглянемо результати перемноження матриць за допомогою технології MPI. Результати розрахунків наведені в таблицях 1.1, 1.2.

Таблиця 1.1 - Результати розрахунків з ключем –О3, одинарна точність

Розмір матриці

Одне ядро

Чотири ядра

Прискорення

Шість ядер

Прискорення

500

0,2/1247

0.1/2345

2

0.089/2793

2.25

1000

1,19/1675

0.5/4003

2.38

0.4/4905

2.98

2000

10,61/1506

3.54/4513

2.997

2.97/5380

3.57

3000

35,78/1508

11.98/45.06

3.986

9.61/5612

3.72

Таблиця 1.2 - Результати розрахунків  без ключа –О3 одинарна точність

Розмір матриці

Одне ядро

Чотири ядра

Прискорення

Шість ядер

Прискорення

500

0.8/311

0.23/1075

3.48

0.16/1494

5

1000

5.14/388

1.48/1341

3.47

1.01/1959

5.09

2000

42.32/377

11.66/1371

3.63

7.88/2029

5.37

3000

139.71/386

39.06/1381

3.58

26.25/2056

5.32

З результатів даних таблиць обчислення матриць бачимо, що при застосування ключа оптимізації –О3 прискорення при обчислені на шести ядрах досягається , якщо ж не використовувати даний спосіб оптимізації, прискорення наближається до теоретичного.

Розглянемо результати перемноження тих же матриць, але чисел подвійної точності. Результати розрахунків наведені в таблицях 1.3, 1.4.

Таблиця 1.3 - Результати розрахунків  з ключом –О3 подвійна точність

Розмір матриці

Одне ядро

Два ядра

Приск.

Чотири ядра

Приск.

Шість ядер

Приск.

500

0,18/1387

0.09/2703

2

0,08/3078

2,25

0,11/2260

1,64

1000

1,79/1113

1.1/1806

1.63

0,79/2512

2,27

0,71/2807

2,52

2000

13,42/1191

8.62/1853

1.56

6,14/2603

2,19

5,36/2982

2,50

3000

46,37/1164

29.03/1860

1.6

20,44/2640

2,27

17,81/3029

2,60

Таблиця 1.4 - Результати розрахунків  без ключа –О3 подвійна точність

Розмір матриці

Одне ядро

Два ядра

Приск.

Чотири ядра

Прис.

Шість ядер

Приск.

500

0.73/337

0.38/654

1.92

0.24/1016

3.042

0,18/1364

4.06

1000

6.02/331

3.05/653

1.97

1.6/1249

3.76

1,11/1788

5.42

2000

48.15/332

24.12/663

1.99

12.49/1280

3.855

8,5/1880

5.66

3000

161.16/335

81.04/666

1.98

41.76/1292

3.859

28,5/1890

5.65

З даних таблиць ми бачимо, що продуктивність зросла також в обох випадках, без ключа оптимізації прискорення  для шести ядер, що є максимально близьким до очікуваного. Також відзначимо, що при збільшені розмірності матриці  в обох випадках продуктивність поступово зменшується.

При написані коду для програми перемноження матриць за технологія MPI необхідно вручну розпаралелювати частини матриці по ядрах. Існують і більш «кваліфіковані» технології, такі як бібліотеки Scalapack, Blas, Atlas. Дані бібліотеки містять базові програми лінійної алгебри (Blas) та програмне забезпечення, яке автоматично настроюється для вирішення задач лінійної алгебри (Atlas) [3]. Дані бібліотеки автоматично розкидують частини програми по ядрах, при цьому матриця розбивається на блоки (підматриці), розмірність яких вказує користувач. Саме ці під матриці і розходяться на ядра.

2.                 Отже, розглянемо результати роботи даних бібліотек. Для проведення дослідів оберемо бібліотеку Scalapack-1.8.0 та BLAS. Розмірність підматриць обираємо 25×25, як показали досліди це найбільш оптимальний варіант при якому досягається найбільша продуктивність. Будемо розглядати числа лише подвійної точності.

Результати розрахунків наведені в таблицях 2.1, 2.2.

Таблиця 2.1 - Результати розрахунків  з ключом –О3

Розмір матриці

Одне ядро

Чотири ядра

Приск.

Шість ядер

Прискорення

1000×25

1,6/1248

0,28/7058

5,71

0,25/7939

6,4

2000×25

12,45/1284

1,95/8174

6,38

1,68/9497

7,41

3000×25

42,32/1275

6,26/8614

6,76

5,25/10283

8,06

4000×25

101,24/1264

14,59/8771

6,94

18,69/6845

5,41

Таблиця 2.2 - Результати розрахунків  без ключа –О3

Розмір матриці

Одне ядро

Чотири ядра

Прискорення

Шість ядер

Прискорення

1000×25

1,87/1064

0,29/6826

6,44

0,25/7898

7,48

2000×25

13,98/1144

2,48/6448

5,64

1,7/9383

8,22

3000×25

45,36/1190

6,52/8277

6,95

5,07/10648

8,95

4000×25

111,23/1150

16,34/7830

6,8

19,59/6532

5,68

При даних умовах дослідження з таблиць видно, що без оптимізації процесу максимальне прискорення обчислень дорівнює 8.95, що значно вище очікуваного, але при застосування ключа –О3 загальний час обчислень менший, хоча і прискорення дає менші результати. Таке прискорення свідчить про досить ефективне використання кеш-пам’яті, хоча продуктивність значно падає при досягненні матриці розмірності 4000×4000.

3.                 Наступною розглянемо бібліотеку ATLAS. Для дослідження скористаємося версією ATLAS, яка підтримує інструкції для 64-розрядної ОС – atlas 3.8.3. результати приведені в таблиці 3.1:

Таблиця 3.1 - Результати з ключем –О3

Розмір матриці

Одне ядро

Чотири ядра

Приск.

Шість ядер

Приск.

1000×25

0,23/8632

0,15/12943

1,53

0,17/8638

1,35

2000×25

1,57/10169

0,88/18101

1,78

0,86/18935

1,78

3000×25

5,12/10554

2,76/19519

1,86

2,78/19354

1,84

4000×25

11,69/10947

5,77/22159

2,02

18,95/2435

0,62

5000×25

22,46/11130

39,44/6337

0,57

102,62/2435

0,21

Таблиця 3.2 - Результати без ключа –О3

Розмір матриці

Одне ядро

Чотири ядра

Приск.

Шість ядер

Приск.

1000×25

0,24/8025

0,16/12415

1,5

0,16/12025

1,5

2000×25

1,62/9816

0,9/17652

1,8

0,92/17237

1,76

3000×25

5,22/10342

2,79/19355

1,87

2,8/19198

1,86

4000×25

11,8/10845

5,81/22035

2,03

15,02/8516

0,78

5000×25

22,87/10929

32,96/7583

0,69

53,02/4691

0,43

 В даному випадку, по результат таблиць ми бачимо, що істотного прискорення ми не досягли ні на 4-х ні на 6-ти ядрах, тобто при застосуванні даної бібліотеки кеш-пам'ять не використовується достатньо ефективно. А при  розмірності матриць вище 4000×4000, прискорення і взагалі відсутнє. Ці явища також пояснюються тим, що ядра процесори не отримують дані в потрібному обсязі через занадто вузької смуги пропускання шини пам’яті.

4.                 Проведемо порівняльний аналіз множення матриць за допомогою технології MPI та бібліотек SCALAPACK BLAS та ATLAS. Результати порівняння наведені в таблиці 4.1.

 

Таблиця 4.1 - Результати порівняння

Розмірність  матриць

Технологія MPI

Бібліотека BLAS

Бібліотека ATLAS

1 ядро

6 ядер

Приск.

1 ядро

6 ядер

Приск.

1 ядро

6 ядер

Приск.

1000

1,79/

1113

0,71/

2807

2,52

1,6/

1248

0,25/

7939

6,4

0,23/

8632

0,17/

8638

1,35

2000

13,42/1191

5,36/

2982

2,50

12,45/

1284

1,68/

9497

7,41

1,57/

10169

0,86/

18935

1,78

3000

46,37/1164

17,81/3029

2,60

42,32/

1275

5,25/

10283

8,06

5,12/

10554

2,78/

19354

1,84

4000

-

-

-

101,24/

1264

18,69/

6845

5,41

11,69/

10947

18,95/

2435

0,62

 

Отже в даному випадку по результатам з таблиць видно, що використання спеціальних бібліотек, технологій та оптимізації значно покращує роботу обчислень системи зі збільшенням числа ядер. Навіть при використанні бібліотеки ATLAS, яка не дає істотного прискорення, в порівнянні з використанням технології MPI видно, що прискорення досягає в 16,68 разів.

Висновки

1.                 Використання технології MPI дає можливість досягти теоретичного прискорення  для шести ядер для розміру матриці не більше 3000 елементів.

2.                 Істотне збільшення продуктивності при матричних обчисленнях для багатоядерних систем можливе завдяки блоковому поданням вихідних глобальних матриць. У цьому випадку вдається досягти теоретичного прискорення при розпаралелювання по ядрам процесора.

3.                 Результати обчислювального експерименту показали, що перехід до блокового поданням матриць, до 64-х розрядному програмного забезпечення, до компілятора fortran77 дозволило підвищити швидкість розрахунків для чисел одинарної і подвійної точності приблизно в 10,5-16,7 разів.

4.                 Недоліком багатоядерних систем є недостатній розмір кеш-пам’яті та вузька смуга пропускання шини пам’яті. Це призводить до того, що при оптимізації розміру даних, які надходять до кешу, в даному випадку це блоки матриці, їх кількість збільшується, що призводить до затримок і відповідно неефективного використання всіх ядер.

 Література

1.                 Заболотная Н. И. Организация параллельного перемножения знакопеременных матриц в цифровом оптоэлектронном процессоре многоуровневых изображений / Наталья Заболотна, Владислав Шолота // Электронное моделирование . – 1997. - №3. –С. 41 – 49.

2.                 Мясищев А.А. Оптимизация матричного умножения за счет использования библиотек ScaLAPACK для систем с многоядерными процессорами. http://www.rusnauka.com/26_NII_2009/Informatica/52121.doc.htm - 2009.

3.                 Гергель В.П. Теория и практика параллельных вычислений. -http://www.intuit.ru/department/calculate/paralltp/ - 2007

4.                 The ScaLAPACK Project. - http://www.netlib.org