Міністерство освіти та науки Російської Федерації

Федеральне агентство з освіти

Південно-Російський державний технічний університет

(Новочеркаський політехнічний інститут)

Шахтинський інститут (філія) ЮРДТУ (НПІ)

ЛЕКЦІЇ З ДИСЦИПЛІНИ

«ПАРАЛЕЛЬНІ ВИЧИСЛЕННЯ»

Шахти-2010

Вступ

Основні поняття

1. Загальні питання вирішення "великих завдань";

1.1 Сучасні завдання науки і техніки, що вимагають для вирішення суперкомп'ютерів

1.2.2 Абстрактні моделі паралельних обчислень

1.2.3 Способи паралельної обробки даних, похибка обчислень

1.3 Поняття паралельного процесу та гранули розпаралелювання

1.4 Взаємодія паралельних процесів, синхронізація процесів

1.5. Можливе прискорення при паралельних обчисленнях (закон Амдаля)

2. Принципи побудови багатопроцесорних обчислювальних систем

2.1 Архітектура багатопроцесорних обчислювальних систем

2.2 Розподіл обчислень та даних у багатопроцесорних обчислювальних системах з розподіленою пам'яттю

2.3 Класифікація паралельних обчислювальних систем

2.4 Багатопроцесорні обчислювальні системи з розподіленою пам'яттю

2.4.1 Масивно-паралельні суперкомп'ютери серії Cry T3

2.4.2 Кластерні системи класу BEOWULF

Висновок

Список літератури

Вступ

Ще на зорі комп'ютерної ери, приблизно в середині минулого століття, конструктори електронно-обчислювальних машин замислилися над можливістю застосування паралельних обчислень у комп'ютерах. Адже збільшення швидкодії лише за рахунок вдосконалення електронних компонентів комп'ютера – досить дорогий спосіб, який до того ж стикається з обмеженнями, що накладаються фізичними законами. Так паралельна обробка даних і паралелізм команд були введені в конструкцію комп'ютерів і зараз будь-який користувач "персоналки";, можливо, сам того не знаючи, працює на паралельному комп'ютері.

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

З деяких пір підвищення швидкодії комп'ютерів традиційної (названої "фон Неймановської") архітектури стало надмірно дорого внаслідок технологічних обмежень при виробництві процесорів, тому розробники звернули увагу на інший шлях підвищення продуктивності - об'єднання електронно-обчислювальних машин в багатопроцесорні обчислювальні системи. При цьому окремі фрагменти програми паралельно (і одночасно) виконуються на різних процесорах обмінюючись інформацією за допомогою внутрішньої комп'ютерної мережі.

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

Вимоги отримати максимум продуктивності за мінімальної вартості призвели до розробки багатопроцесорних обчислювальних комплексів; відомі системи такого роду, що поєднують обчислювальні потужності тисяч окремих процесорів. Наступним етапом є спроби об'єднати мільйони різнорідних комп'ютерів планети в єдиний обчислювальний комплекс із величезною продуктивністю через мережу Internet. Сьогодні застосування паралельних обчислювальних систем є стратегічним напрямом розвитку обчислювальної техніки. Розвиток "; заліза"; з необхідністю підкріплюються вдосконаленням алгоритмічної та програмної компонент – технологій паралельного програмування.

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

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

Розглянемо два основні питання:

1. Багатопроцесорні обчислювальні системи - (масивно-паралельні суперкомп'ютери) Cray T3D(E) ​​з кількістю процесорів від 40 до 2176. Це суперкомп'ютери з розподіленою пам'яттю на RISC-процесорах типу Alpha21164A, з топологією комунікаційної мережі - та трансляторами для мов FORTRAN, HPF, C/C++. Підтримувані моделі програмування: MPI, PVM, HPF.

2. Беовульф-кластери робочих станцій. Кластери робочих станцій – сукупність робочих станцій, з'єднаних у локальну мережу. Кластер - обчислювальна система з розподіленою пам'яттю та розподіленим управлінням. Кластерна система може мати продуктивність, порівнянну з продуктивністю суперкомп'ютерів. Кластери робочих станцій зазвичай називають Беовульф-кластерами (Beowulf cluster - за однойменним проектом), пов'язані локальною мережею Ethernet і використовують операційну систему Linux.

Основні поняття

Найбільш поширеною технологією програмування для кластерних систем та паралельних комп'ютерів із розподіленою пам'яттю в даний час є технологія MPI. p align="justify"> Основним способом взаємодії паралельних процесів у таких системах є передача повідомлень один одному. Це відбито у назві цієї технології – Message Passing Interface (інтерфейс передачі повідомлень). Стандарт MPI фіксує інтерфейс, який повинен дотримуватися системою програмування на кожній обчислювальній платформі, так і користувачем при створенні своїх програм. MPI підтримує роботу з мовами Фортран та Сі. Повна версія інтерфейсу містить опис понад 125 процедур та функцій.

Інтерфейс MPI підтримує створення паралельних програм у стилі MIMD (Multiple Instruction Multiple Data), що передбачає поєднання процесів з різними вихідними текстами. Однак писати і налагоджувати такі програми дуже складно, тому на практиці програмісти набагато частіше використовують SPMD-модель (Single Program Multiple Data) паралельного програмування, в рамках якої для всіх паралельних процесів використовується один і той же код. В даний час все більше і більше реалізацій MPI підтримують роботу з так званими "нитками";.

Оскільки MPI є бібліотекою, то при компіляції програми необхідно додати відповідні бібліотечні модулі.

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

MPI програма – це безліч паралельних процесів, що взаємодіють. Усі процеси породжуються один раз, утворюючи паралельну частину програми. У ході виконання MPI-програми породження додаткових процесів або знищення існуючих не допускається (надалі MPI така можливість з'явилася). Кожен процес працює у своєму адресному просторі, жодних загальних змінних або даних у MPI немає. Основним способом взаємодії між процесами є явна посилка повідомлень.

Для локалізації взаємодії паралельних процесів програми можна створювати групи процесів, надаючи їм окреме середовище спілкування – комунікатор. Склад утворених груп довільний. Групи можуть повністю збігатися, входити одна в одну, не перетинатися або частково перетинатися. Процеси можуть взаємодіяти лише всередині деякого комунікатора, повідомлення, надіслані у різних комунікаторах, не перетинаються і заважають одне одному. Комунікатори мають у мові Фортран тип integer (у мові Сі – зумовлений тип MPI Comm).

При старті програми завжди вважається, що всі породжені процеси працюють у рамках всеосяжного комунікатора. Цей комунікатор існує і служить взаємодії всіх запущених процесів MPI-программы. Усі взаємодії процесів протікають у межах певного комунікатора, повідомлення, передані у різних комунікаторах, не заважають одне одному.

Процесори зі скороченим набором команд (RISC). В основі RISC-архітектури (RISC – Reduced Instruction Set Computer) процесора лежить ідея збільшення швидкості його роботи за рахунок спрощення набору команд.

Дослідження показали, що 33% команд типової програми складають пересилання даних, 20% – умовні розгалуження та ще 16% – арифметичні та логічні операції. У переважній більшості команд обчислення адреси може бути виконано швидко за один цикл. Більш складні режими адресації використовуються приблизно 18% випадків. Близько 75% операнда є скалярними, тобто змінними цілого, речового, символьного типу і т. д., а інші є масивами і структурами. 80% скалярних змінних – локальні, а 90% структурних є світовими. Отже, більшість операндів – це локальні операнди скалярних типів. Вони можуть зберігатися у регістрах.

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

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

В основу RISC-архітектури покладено такі принципи та ідеї. Набір команд повинен бути обмеженим і включати лише прості команди, час виконання яких після вибірки та декодування один такт або трохи більше. Використовується конвеєрна обробка. Прості RISC-команди допускають ефективну апаратну реалізацію, тоді як складні команди можуть бути реалізовані лише засобами мікропрограмування. Конструкція пристрою управління у разі RISC-архітектури спрощується, і це дозволяє процесору працювати на великих тактових частотах. Використання простих команд дозволяє ефективно реалізувати конвеєрну обробку даних, і виконання команд.

Складні команди RISC-процесором виконуються довше, але їхня кількість відносно невелика. У RISC-процесорах невелика кількість команд адресується пам'яті. Вибір даних з оперативної пам'яті вимагає більше одного такту. Більшість команд працює з операндами, що у регістрах. Усі команди мають уніфікований формат та фіксовану довжину. Це спрощує та прискорює завантаження та декодування команд, оскільки, наприклад, код операції та поле адреси завжди знаходяться в одній і тій же позиції. Змінні та проміжні результати обчислень можуть зберігатися у регістрах. З урахуванням статистики використання змінних, більшість локальних змінних і параметрів процедур можна розмістити в регістрах. При виклику нової процедури вміст регістрів зазвичай переміщається в оперативну пам'ять, проте, якщо кількість регістрів досить велика, вдається уникнути значної частини тривалих операцій обміну з пам'яттю, замінивши їх операціями з регістрів. Завдяки спрощеній архітектурі RISC-процесора, на мікросхемі з'являється місце розміщення додаткового набору регістрів.

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

1. Загальні питання вирішення "великих завдань";

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

Верхня межа кількості обчислень для "великих завдань"; визначається лише продуктивністю існуючих на даний момент обчислювальних систем. При "; прогонці"; обчислювальних завдань в реальних умовах ставиться не питання "; вирішити завдання взагалі";, а "; вирішити за прийнятний час"; (Годинник/десятки годин).

1.1. Сучасні завдання науки та техніки, що вимагають

для вирішення суперкомп'ютери

Досить часто доводиться стикатися з такими завданнями, які, представляючи чималу цінність для суспільства, не можуть бути вирішені за допомогою повільних комп'ютерів офісного або домашнього класу. Єдина надія в цьому випадку покладається на комп'ютери з великою швидкодією, яку називають суперкомп'ютерами. Тільки машини такого класу можуть впоратися із обробкою великих обсягів інформації. Це можуть бути, наприклад, статистичні дані чи результати метеорологічних спостережень, фінансова інформація. Іноді швидкість обробки має вирішальне значення. Як приклад можна навести складання прогнозу погоди та моделювання кліматичних змін. Чим раніше передбачено стихійне лихо, тим більше можливостей підготуватися до нього. Важливим завданням є моделювання лікарських засобів, розшифрування геному людини, томографія, у тому числі медична, розвідка родовищ нафти та газу. Прикладів можна навести багато.

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

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

Нижче наведено деякі галузі людської діяльності, що вимагають для свого вирішення суперкомп'ютерних потужностей, що використовують паралельні обчислення:

Передбачення погоди, клімату та глобальних змін в атмосфері

Науки про матеріали

Побудова напівпровідникових приладів

Надпровідність

Розробка фармацевтичних препаратів

Генетика людини

Астрономія

Транспортні завдання великої розмірності

Гідро та газодинаміка

Керований термоядерний синтез

Розвідка нафти та газу

Обчислювальні завдання наук про світовий океан

Розпізнавання та синтез мови, розпізнавання зображень

Одне з найсерйозніших завдань – моделювання кліматичної системи та прогноз погоди. При цьому спільно чисельно вирішуються рівняння динаміки суцільного середовища та рівняння рівноважної термодинаміки. Для моделювання розвитку атмосферних процесів протягом 100 років та кількості елементів дискретизації 2,6×106 (сітка з кроком 10 по широті та довготі по всій поверхні Планети при 20 шарах по висоті, стан кожного елемента описується 10 компонентами) у будь-який момент часу стан земний атмосфери описується 2,6 107 числами. При кроці дискретизації за часом 10 хвилин за проміжок часу, що моделюється, необхідно визначити 5×104 ансамблів (тобто 1014 необхідних числових значень проміжних обчислень). Оцінюючи кількості необхідних отримання кожного проміжного результату обчислювальних операцій у 102÷103 загальна кількість необхідних проведення чисельного експерименту з глобальною моделлю атмосфери обчислень з плаваючою точкою сягає 1016÷1017.

Суперкомп'ютер з продуктивністю 1012 оп/сек при ідеальному випадку (повна завантаженість та ефективна алгоритмізація) виконуватиме такий експеримент протягом кількох годин; для проведення повного процесу моделювання необхідне багаторазове (десятки/сотні разів) прогін програми.

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

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

З метою об'єктивності при порівнянні продуктивність супер-електронно-обчислювальних машин розраховується на основі виконання заздалегідь відомого тестового завдання ("; бенчмарку";, від англ. benchmark). Пікова продуктивність визначається максимальною кількістю операцій, яка може бути виконана за одиничний час за відсутності зв'язків між функціональними пристроями, характеризує потенційні можливості апаратури і не залежить від програми, що виконується.

Недоліком методу оцінки пікової продуктивності як числа виконуваних комп'ютером команд в одиницю часу (MIPS, Million Instruction Per Second) дає тільки загальне уявлення про швидкодію, так як не враховує специфіку конкретних програм (важко передбачувано, в яке число і яких саме інструкцій процесора відобразиться користувача програма).

Слід зазначити, що є аргументи проти широкого практичного застосування паралельних обчислень:

Паралельні обчислювальні системи дуже дорогі. За підтвердженим практикою закону Гроша, продуктивність комп'ютера зростає пропорційно квадрату його вартості; в результаті набагато вигідніше отримати необхідну обчислювальну потужність придбанням одного продуктивного процесора, ніж використання кількох менш швидкодіючих процесорів.

Контраргумент. Зростання швидкодії послідовних електронно-обчислювальних машин не може продовжуватися нескінченно, комп'ютери схильні до швидкого морального старіння і необхідні часті фінансові витрати на купівлю нових моделей. Практика створення паралельних обчислювальних систем класу Beowulf ясно показала економічність саме цього шляху.

При організації паралелізму надмірно швидко зростають втрати продуктивності. По гіпотезі Мінського (Marvin Minsky) прискорення обчислень, що досягається при використанні паралельної системи, пропорційно двійковому логарифму від числа процесорів (при 1000 процесорах можливе прискорення виявляється рівним всього 10).

Контраргумент. Наведена оцінка прискорення правильна для розпаралелювання певних алгоритмів. Однак існує велика кількість завдань, при паралельному вирішенні яких досягається близьке до 100% використання всіх процесорів паралельної обчислювальної системи.

Послідовні комп'ютери постійно вдосконалюються. За широко відомим законом Мура складність послідовних мікропроцесорів зростає вдвічі кожні 18 місяців, тому необхідна продуктивність може бути досягнута і на "звичайних"; послідовні комп'ютери.

Контраргумент. Аналогічний розвиток властивий і паралельним системам.

Однак застосування паралелізму дозволяє отримувати необхідне прискорення обчислень без очікування розробки нових процесорів, що більш швидкодіють. Ефективність паралелізму залежить від характерних властивостей паралельних систем. Всі сучасні послідовні електронно-обчислювальні машини працюють у відповідність до класичної схеми фон-Неймана; Паралельні системи відрізняються суттєвим розмаїттям архітектури і максимальний ефект від використання паралелізму може бути отриманий при повному використанні всіх особливостей апаратури (наслідок – перенесення паралельних алгоритмів та програм між різними типами систем скрутне, а іноді й неможливе).

Контраргумент. При реально наявному розмаїтті архітектур паралельних систем існують і певні "усталені"; способи забезпечення паралелізму Інваріантність створюваного програмного забезпечення забезпечується за допомогою використання стандартних програмних засобів підтримки паралельних обчислень (програмні бібліотеки PVM, MPI, DVM та ін.). PVM та MPI використовуються в суперкомп'ютерах Cray-T3.

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

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

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

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

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

1.2 Паралельна обробка даних

1.2.1 Принципова можливість паралельної обробки

Практично всі розроблені на цей час алгоритми є послідовними. Наприклад, при обчисленні виразу a + b × c спочатку необхідно виконати множення і тільки потім виконати додавання. Якщо в електронно-обчислювальних машин присутні вузли складання та множення, які можуть працювати одночасно, то в даному випадку вузол додавання буде простоювати в очікуванні завершення роботи вузла множення. Можна довести твердження, яке полягає в тому, що можливо побудувати машину, яка заданий алгоритм оброблятиме паралельно.

Можна побудувати m процесорів, які за одночасної роботі видають необхідний результат за один-єдиний такт роботи обчислювача.

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

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

Вступ

Наближався захід ери 32-бітового каміння, і було очевидно, що треба підвищувати не тільки потужність, а й розрядність. Розробники процесорів зіткнулися з низкою проблем у збільшенні тактової частоти: неможливо розсіювати теплоту, що виділяється кристалом, не можна далі зменшувати розмір транзисторів, проте головною проблемою стало те, що при збільшенні тактової частоти швидкодія програм не підвищувалася. Причиною цьому стала паралельна робота сучасних комп'ютерних систем, а один процесор, хоч би яким потужним він був, у кожен час може виконувати лише одне завдання. Наприклад, у мене в системі Windows 7 у момент написання статті виконується 119 процесів. Хоча вони далеко не всі знаходяться у бекграунді, їм не всім потрібна висока потужність. На одному камені виконання кількох процесів/потоків може бути конкурентним. Тобто їх робота чергується: після того, як певний потік відпрацює свій квант часу, протягом якого він виконав корисне навантаження, його поточний стан збережеться в пам'яті, а він буде вивантажений з процесора і замінений наступним потоком, що знаходиться в черзі, - відбудеться перемикання контексту на що витрачається дорогоцінний час. А поки йде обмін даними між процесором та оперативною пам'яттю, через обмежену пропускну здатність системної шини мікропроцесор нервово курить бамбук, осторонь чекаючи дані. На допомогу можуть прийти апаратний та програмний (наприклад, з операційної системи) планувальники, щоб підвантажувати дані в кеш. Однак кеш дуже обмежений за обсягом, тому таке рішення не може бути панацеєю. Виходом стала паралельна обробка, коли він у реальному часі одночасно виконуються кілька процесів. А щоб її реалізувати, потрібно фундаментально перепроектувати і перебудувати камінь - поєднати в одному корпусі два виконуючі кристали і більше.

Планування

При розробці паралельної програми стадія проектування стає більш важливою, ніж під час розробки однопоточних додатків. І оскільки насправді паралельне програмування у вузькому колі завдань використовується вже десятиліттями, були виявлені деякі концепції, що зарекомендували себе. Найважливіше - подивитись розробку інакше, не послідовно, виділити одиницю виконуваної роботи, провести декомпозицію завдання. Є три способи: декомпозиція за завданнями, декомпозиція за даними, декомпозиція з інформаційних потоків. Перший спосіб декомпозиції найпростіший: ми просто прив'язуємо окрему функцію до певного потоку та запускаємо його на виконання. Паралельна обробка готова. Однак можуть бути проблеми - конкуренція, якщо в одиниці, що виконується, використовуються загальні глобальні дані. Але про це ми поговоримо згодом. Другий спосіб теж досить зрозумілий метод розпаралелювання: наприклад, великий масив даних обробляється кількома потоками, кожен із яких працює над частиною, обмеженою певними межами. Декомпозиція з інформаційних потоків служить завданням, коли робота одного потоку залежить від результату виконання іншого. Наприклад, під час читання з файлу потік - обробник лічених даних не може розпочати роботу, поки потік-читач не рахує певний обсяг даних.

Апаратні рішення


Перш ніж перейти до багатоядерності, розробники процесорів з'ясували, що при виконанні одного потоку процесорне ядро ​​завантажується не повністю (думаю, для цього не треба бути провидцем). І оскільки для виконання другого програмного потоку використовуються не всі ресурси мікропроцесора (оскільки апаратний стан - виконавчі пристрої, кеш - може зберігатися в одному екземплярі), то дублювання потребує лише область стану програмної архітектури (логіка переривань). Ця технологія отримала назву гіперпоточності (Hyper-Threading). Гіперпотоковість - апаратний механізм, у якому кілька незалежних апаратних потоків виконуються в одному такті на єдиному суперскалярному процесорному ядрі. З її допомогою один фізичний процесор представляється як два логічні, тобто його бачить операційна система, тому що планування і виконання, по суті, здійснюється з розрахунком на два ядра. Це відбувається завдяки безперервному потоку команд, що виконуються на спільному устаткуванні. Ця технологія була додана до архітектури NetBurst, реалізованої в процесорах Pentium 4. Тому гіперпоточність була реалізована ще в останніх версіях Pentium 4, але мені тоді якось не вдалося її застати. Проте зараз я можу спостерігати її в процесорі Atom, встановленому в нетбуку. У цьому камені, крім гіперпоточності, реалізована багатоядерність (у кількості двох штук), тому в операційній системі я спостерігаю чотири камені. Але, наприклад, у Core 2 Duo гіперпоточність відсутня, так само як і в Core i5. За допомогою гіперпоточності швидкість виконання оптимізованих для багатопоточності програм вдалося підвищити на 30%. Підкреслю, що приріст продуктивності матиме місце лише у спеціально підготовлених додатках.

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

Потім винайшли багатоядерні процесори, які нині використовуються повсюдно. Багатоядерні процесори підтримують мультипроцесорну обробку кристалі. У цій архітектурі два або більше ядра реалізуються в одному процесорі, що встановлюється в один сокет. Залежно від конструкції ці ядра можуть спільно використовувати великий кеш тому ж кристалі. Багатоядерні процесори також потребують сумісного чіпсету. Так як кожне ядро ​​є самостійним виконуючим модулем, то багатоядерні процесори забезпечують справжній паралелізм - виконання кожного потоку в відокремленому середовищі. У разі присутності кількох виконуючих ядер може бути спосіб обміну інформацією з-поміж них, без чого просто неможливо створити паралельну систему, причому потрібен спеціальний ресурс. Для цього був винайдений удосконалений програмований контролер переривань (APIC). Він виконує обмін інформацією між процесорами/ядрами, використовуючи механізм міжпроцесорного переривання (Interprocessor Interrupt). Останній у свою чергу використовується операційною системою для планування/виконання потоків.

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

Програмні рішення

У паралельному виконанні коду велику роль грають програмні рішення. На сцену виходять як системні програмні продукти (операційні системи, компілятори), так і програми користувача рівня. З погляду прикладного програміста ми можемо скористатися лише другою підмножиною. Насправді цього цілком достатньо, якщо операційна система є надійною. Подальша розповідь здебільшого відноситься до Windows NT 6.1, якщо не зазначено інше. Як тобі відомо, Windows NT використовує модель багатопоточності, що витісняє. Коли запускається програма, стартує процес, у ньому можуть виконувати свою роботу один або кілька потоків, всі вони поділяють загальну пам'ять та загальний адресний простір. Потік же, своєю чергою, - це відокремлена послідовність команд, виконувана незалежно. Існує три види потоків:

  • користувача рівня - створюється в програмі користувача (на рівні користувача). Ці потоки в Windows NT проектуються на потоки рівня ядра, тому їх бачить процесор;
  • потік ядра - керується ядром операційної системи;
  • апаратний потік – одиниця, що виконується на процесорі.

Створення потоку протікає три етапи. Спочатку відбувається його опис за допомогою потокового API, потім на стадії виконання цей виклик обробляється як виклик ядра, в результаті створюється потік, потім виконується всередині свого процесу. Але через те, що у програмі одночасно виконується кілька дій, може виникнути купа проблем. Їх зручно класифікувати під чотири типи. Проблема синхронізації виникає, коли один потік чекає на виконання іншого, який з якихось причин не може завершити виконання. При проблемі взаємодії один потік не може вчасно передати інформацію іншому, наприклад, через затримки. Коли один потік напружується, а інший прохолоджується, виникає проблема балансування. Якщо в момент перенесення програми на потужніший комп'ютер її швидкодія не підвищується, то говорять про проблему масштабованості. Для вирішення всіх цих проблем призначені примітиви для роботи у багатопотоковому середовищі. Давай кинемо на них поверховий погляд.

Примітиви паралельного кодингу

Ділянки коду, які можуть бути одночасно використані кількома потоками та містять загальні змінні, називаються критичними секціями. Вони читання-запис значень під впливом двох і більше потоків можуть відбутися асинхронно. Цей стан називається станом перегонів. Тому в кожний часовий проміжок усередині критичної секції має виконуватися лише один потік. Для цього використовуються примітиви синхронізації - блокування. Семафор – історично найперший механізм для синхронізації, розроблений Дейкбудом у 1968 році. Дозволяє увійти в критичну секцію певній кількості потоків, при вході до неї потоку зменшує своє значення та збільшує у момент його виходу. Обов'язковою умовою є атомарне виконання операцій перевірки значення семафору + збільшення значення, а також перевірки значення + зменшення значення. Розвитком семафору служить м'ютекс, який є двійковим семафором і тому в критичній секції допускає виконання тільки одного потоку. Блокування читання-запису дозволяють кільком потокам читати значення загальної змінної, що у критичної секції, але записувати лише одному. Під час очікування спин блокування не блокується, а продовжує активне опитування заблокованого ресурсу. Спін-блокування – погане вирішення проблеми синхронізації для одноядерного процесора, оскільки займає всі обчислювальні ресурси.

Схожий на семафори механізм умовних змінних, проте вони, на відміну семафорів (і м'ютексів), не містять реальних значень. Вони стежать виконання зовнішніх умов.

У сучасних мовах програмування є високорівневі механізми, що дозволяють спростити використання блокувань та умовних змінних («монітори»). Замість того, щоб явно писати операції блокування та розблокування ділянки коду, розробнику достатньо оголосити критичну секцію як синхронізовану.

Для обміну інформацією між процесами/потоками застосовуються повідомлення, що поділяються на три групи: внутрішньопроцесні (для передачі між потоками одного процесу), міжпроцесні (для передачі інформації між процесами - із залежністю від потоків) і процес - процес (поточно незалежна передача інформації між процесами) ).
У той же час при використанні блокувань для уникнення перегонів можуть настати мертві (dead lock) та живі (live lock) блокування. Мертве блокування має місце, коли один потік заблокований на очікуванні певного ресурсу від іншого потоку, але той не може дати його (наприклад, очікує на результат від першого). Мертве блокування може статися при виконанні чотирьох добре визначених умов (ми не розбиратимемо ці умови в цій статті). Тому при написанні багатопотокового коду програміст має можливість уникнути дідлока, але на практиці це виглядає набагато складніше. Жива блокування гірша за мертву тим, що в першому випадку потоки заблоковані, а в другому вони постійно конфліктують.

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


Win32 threads

Після появи першої версії Windows NT багатопотокове програмування в ній покращувалося від версії до версії, одночасно покращувався пов'язаний з потоками API. Отже, коли стартує процес за допомогою функції CreateProcess, він має один потік виконання команд. Потік складається з двох об'єктів: об'єкт ядра (через нього система керує потоком) та стек, в якому зберігаються параметри, функції та змінні потоки. Щоб створити додатковий потік, необхідно викликати функцію CreateThread. У результаті створюється об'єкт ядра - компактна структура даних, використовувана системою управління потоком. Цей об'єкт, насправді, не є потоком. Також з адресного простору батьківського процесу потоку виділяється пам'ять. І оскільки всі потоки одного процесу виконуватимуться в його адресному просторі, вони розділятимуть його глобальні дані. Повернемося до функції CreateThread та розглянемо її параметри. Перший параметр – покажчик на структуру PSECURITY ATTRIBUTES, яка визначає атрибути захисту та властивості успадкування, для встановлення значень за умовчанням достатньо передати NULL. Другий параметр типу DW0RD визначає, яку частину адресного простору може використовувати потік під свій стек. Третій параметр PTHREAD START_ROUTIME pfnStartAddr - покажчик на функцію, яку необхідно прив'язати до потоку і яку він виконуватиме. Ця функція повинна мати вигляд DWORD WINAPI ThreadFunc(PVOID pvParam), вона може виконувати будь-які операції; коли вона завершиться, то поверне управління, а лічильник користувачів об'єкта ядра потоку буде зменшено на 1, у випадку, коли цей лічильник дорівнюватиме 0, даний об'єкт буде знищений. Четвертий параметр функції CreateThread - покажчик на структуру PVOID, що містить параметр для ініціалізації виконуваної функції в потоці (див. опис третього параметра). П'ятий параметр (DWORD) визначає прапор, що вказує на активність потоку після створення. Останній, шостий параметр (PDWORD) – адреса змінної, куди буде поміщений ідентифікатор потоку, якщо передати NULL, тим самим ми повідомимо, що вона нам не потрібна. У разі успіху функція повертає дескриптор потоку, за допомогою якого можна маніпулювати потоком; при фейлі функція повертає 0.


Існують чотири шляхи завершення потоку, три з яких небажані: це завершення потоку через виклик функції ExitThread, через виклик TerminateThread при завершенні батьківського процесу без попереднього завершення потоку. Лише 1 шлях – самозавершення потоку, що відбувається у виконанні призначених йому дій, є сприятливим. Тому що тільки в цьому випадку гарантується звільнення всіх ресурсів операційної системи, знищення всіх об'єктів C/C++ за допомогою деструкторів.

Ще кілька слів про створення потоку. Функція CreateThread знаходиться у Win32 API, при цьому в бібліотеці Visual C++ є її еквівалент _beginthreadex, у якої майже той же список параметрів. Рекомендується створювати потоки саме з її допомогою, оскільки вона використовує не тільки CreateThread, але і виконує додаткові операції. Крім того, якщо потік був створений за допомогою останньої, то при знищенні викликається _endthreadex, яка очищає блок даних, який займає структура, що описує потік.

Потоки плануються виконання з урахуванням пріоритету. Якби всі потоки мали рівні пріоритети, то для виконання кожного (WinNT) виділялося б по 20 мс. Але це не так. У WinNT є 31 (від нуля) потоковий пріоритет. При цьому 31 - найвищий, на ньому можуть виконуватися тільки критичні програми - драйвери пристроїв; 0, найнижчий, зарезервований виконання потоку обнулення сторінок. Тим не менш, розробник не може явно вказати номер пріоритету для виконання свого потоку. Натомість у Windows є таблиця пріоритетів, де вказано символьні позначення згрупованих номерів пріоритетів. У цьому кінцевий номер формується як основі цієї таблиці, а й у значеннях пріоритету батьківського процесу. Значення приховані за символьними константами через те, що Microsoft залишає за собою право їх змінити та користується ним від версії до версії своєї операційної системи. При створенні потік отримує нормальний рівень пріоритету. Його можна змінити функцією SetThreadPriority, що приймає два параметри: HANDLE hThread - дескриптор потоку, що змінюється, int nPriority - рівень пріоритету (з таблиці). За допомогою функції GetThreadPriority можна отримати поточний пріоритет, передавши до неї дескриптор потрібного потоку. Перед зміною пріоритету потоку його треба призупинити, це робиться функцією SuspendThread. Після зміни пріоритету потік треба віддати планувальнику для планування виконання функцією ResumeThread. Обидві функції одержують дескриптор потоку, з яким працюють. Всі описані операції крім припинення та відновлення застосовні і до процесів. Вони не можуть бути припинені/відновлені, оскільки не витрачають процесорний час, тому не плануються.

Уникнення гонок у Win32

У багатопотокових додатках треба скрізь наскільки можна використовувати атомарні - неподільні операції, виконання яких неспроможна встрявати інший потік. Такі функції Win32 API мають префікс Interlocked, наприклад, для інкременту змінної замість i++ використовувати InterlockedExchangeAdd(&i, 1). Крім операцій збільшення/зменшення, є операції для атомарного порівняння, але ми їх залишимо як твоє домашнє завдання.

Атомарні функції, однак, дозволяють вирішити дуже вузьке коло завдань. На допомогу приходять критичні секції. Win32 має функції для явної позначки такого шматка коду, який буде виконуватися атомарно. Спочатку треба створити екземпляр структури критичної секції, потім виконуваної в потоці функції написати оператори для входу і виходу в критичну секцію:

CRITICAL_SECTION g_cs; DWORD WINAPI ThreadRun(PVOID pvParam) ( EnterCriticalSection(&g_cs); // Щось обчислюємо LeaveCriticalSection(&g_cs); return 0; )

Критичні секції Win32 не просто код, який може виконуватися кількома потоками, це цілий механізм синхронізації даних. Критичні секції повинні бути якнайменше, тобто включати якнайменше обчислень.
Щоб дозволити читати значення змінної кільком потокам, а змінювати одному, можна застосувати структуру тонкого блокування SRWLock. Насамперед треба ініціалізувати структуру викликом InitializeSRWLock з передачею покажчика на неї. Потім під час запису обмежуємо ресурс ексклюзивним доступом:

AcquireSRWLockExclusive(PSRWLOCK SRWLock); // Записуємо значення ReleaseSRWLockExclusive(PSRWLOCK SRWLock);

З іншого боку, під час читання здійснюємо розшарований доступ:

AcquireSRWLockShared(PSRWLOCK SRWLock); // Читаємо значення ReleaseSRWLockShared(PSRWLOCK SRWLock);

Зверніть увагу: всі функції приймають проініціалізовану структуру SRWLock як параметр.
З допомогою умовних змінних зручно організувати залежність «постачальник - споживач» (див. декомпозицію з інформаційних потоків), тобто така подія має відбутися залежно від попереднього. У цьому механізмі використовуються функції SleepConditionVariableCS і SleepConditionVariableSRW, що служать для блокування критичної секції або структури тонкого блокування. Вони приймають три і чотири параметри відповідно: покажчик на умовну змінну, очікувану потоком, покажчик на критичну секцію чи SRWLock, застосовну синхронізації доступу. Наступний параметр – час (у мілісекундах) для очікування потоком виконання умови, якщо умова не буде виконана, функція поверне False; останній параметр другої функції – вид блокування. Щоб пробудити заблоковані потоки, потрібно з іншого потоку викликати функцію WakeConditionVariable або WakeAllConditionVariable. Якщо виконана в результаті виклику цих функцій перевірка підтвердить виконання умови, що передається як параметр даним функціям, потік буде пробуджено.

У наведеному описі ми познайомилися із загальними визначеннями механізмів семафор та м'ютекс. Зараз подивимося, як вони реалізовані у Win32. Створити семафор можна за допомогою функції CreateSemaphore. Їй передаються такі параметри: покажчик структуру PSECURITY_ATTRIBUTES, що містить параметри безпеки; максимальна кількість ресурсів, що обробляються додатком; кількість цих ресурсів, доступних спочатку; покажчик на рядок, що визначає ім'я семафору. Коли потік, що очікує семафору, хоче отримати доступ до ресурсу, що охороняється семафором, то wait-функція потоку опитує стан семафору. Якщо його значення більше 0, значить семафор вільний і його значення зменшується на 1, а потік планується на виконання. Якщо при опитуванні семафор зайнятий, його значення дорівнює 0, тоді викликаючий потік перетворюється на стан очікування. У момент, коли потік залишає семафор, викликається функція ReleaseSemaphore, у якій значення семафору збільшується на 1. М'ютекси, як і семафори, - об'єкти ядра. Функціонування мьютексів схоже на критичні секції Win32, з різницею в тому, що останні виконуються в режимі користувача. У кожний момент часу м'ютекс дозволяє виконуватись лише одному потоку і надає доступ лише до одного ресурсу. При цьому він дозволяє синхронізувати декілька потоків, зберігаючи ідентифікатор потоку, який захопив ресурс та лічильник кількості захватів. Щоб створити м'ютекс, можна скористатися функцією CreateMutex, її параметри аналогічні розглянутим вище. Коли очікування м'ютексу потоком успішно завершується, останній отримує монопольний доступ до захищеного ресурсу. Решта потоків, які намагаються звернутися до цього ресурсу, переходять у стан очікування. Коли потік, який займає ресурс, закінчує з ним працювати, він повинен звільнити виклик викликом функції ReleaseMutex. Ця функція зменшує лічильник рекурсії в м'ютексі на 1. Вибір механізму синхронізації, що використовується, багато в чому залежить від часу його виконання і коду, в якому він використовується.

До того ж, у Windows NT, починаючи з четвертої версії, є ще одне потоковий рівень деталізації - волокна (чи нитки). На рівні користувача об'єкт ядра потік можна розділити на кілька ниток. І в такому випадку операційна система нічого про них не знає, вся робота з планування та управління нитками лягає на плечі розробника прикладного додатку.

Висновок

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

У цій статті спочатку ми розібралися з примітивами паралельного кодингу – загальними поняттями, потім розібралися, як вони виконані у конкретному API – Win 32 threads. Рамки статті не дозволили нам розглянути інші API для багатопотокового кодингу. Сподіватимемося, що ми ще матимемо можливість колись продовжити обговорення цієї потрібної теми.

Бажаю удачі, до зустрічі!

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

Закон Амдала- ілюструє обмеження зростання продуктивності обчислювальної системи із збільшенням кількості обчислювачів.

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

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

Нехай процесори однорідні за продуктивністю. Т 0 – час виконання послідовної частини паралельного алгоритму, наприклад, генерування початкових даних та обробка отриманого під час вирішення завдання результату. Т 1 , Т 2 , ... Т p- Час послідовної роботи, що виконується кожним процесором без взаємодії між собою. Тоді час виконання завдання на pпроцесорах визначається нерівністю:

де i = 1, 2, ... p. Рівність виходить, колиТи рівні між собою. Звідси, підставляючи
T seq - T 0, де T seq є час виконання завдання на одному процесорі, отримуємо T par ≥ T 0
.

Ділимо на T seq і, позначаючи через f = T 0 / T seq - частку (fraction) послідовної ділянки у загальному обсязі обчислень, отримаємо:
.(1.1)

Прискорення (Speedup) – це відношення часу виконання завдання у послідовному режимі (на 1 процесорі), на час виконання завдання у паралельному режимі (на p процесорах).

, використовуючи нерівність (1.1), отримаємо
(1.2)

Звідси видно, що з f=0 і рівність T i отримаємо S=p, при f >0 і p → ∞, отримаємо
. Ця функція є монотонно-зростаючою p і, отже, досягає максимуму на нескінченності. Отже, ні на якому числі процесорів прискорення рахунку не може перевищити оберненої величини частки послідовної ділянки.

Розглядаючи закон Амдаля, ми припускали, що частка послідовних розрахунків fє постійною величиною і не залежить від параметра n, визначального обчислювальну складність розв'язуваної задачі. Однак для великого ряду завдань частка f=f(n) є спадною функцією від n, і в цьому випадку прискорення фіксованого числа процесорів може бути збільшено за рахунок зменшення частки послідовної роботи, що виконується кожним процесором. Інакше висловлюючись, прискорення Sp= Sp(n) є зростаючою функцією від параметра n (це твердження часто називають ефектом Амдаля).

Ефективність розпаралелюванняце здатність алгоритму використовувати всі процесори, що задіяні у виконанні завдання, на 100%. Формула обчислення ефективності:


(1.2)

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

E≤ 100%
(1.3)

Наприклад, E ≤ 52.25% для p=100 та f=0.01 і E ≤ 9.1% для p=1000 та f=0.01.

Висновок . При малій частки послідовної роботи збільшення кількості процесів призводить до погіршення паралельної ефективності (причина – зі зростанням процесів зростає кількість обмінів). Наприклад, якщо f = 0.01 (1%), то Е<100 и использовать для решения параллельной задачи более 100 процессоров нецелесообразно. Для підвищення ефективності, як правило, не розпаралелюють керуючі частини програми або невеликі ділянки обчислень, які потребують інтенсивної синхронізації процесів.

Для оцінки прискорення розглядають ще одну характеристику, яку називають прискоренням масштабування(Scaled speedup). Ця оцінка може показати, наскільки ефективно можуть бути організовані паралельні обчислення зі збільшенням складності розв'язуваних завдань.

Масштабування(scalable) – це здатність паралельного алгоритму ефективно використовувати процесори у разі підвищення складності обчислень. Завдання масштабується, якщо при зростанні числа процесорів алгоритм забезпечує пропорційне збільшення прискорення при збереженні постійного рівня ефективності використання процесорів.

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

Погана масштабованість паралельного додатка на MPP-системі може бути викликана: а) зростанням витрат на комунікації при збільшенні кількості використовуваних процесорів; б) нерівномірністю розподілу обчислювального навантаження між процесорами.

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

Оцінимо накладні витрати (total overhead), які мають місце під час виконання паралельного алгоритму T 0 = P*Tp − T 1 , де T 1 - час виконання послідовного алгоритму задачі, T p- Час виконання алгоритму завдання на процесорах P.

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

Використовуючи введене позначення, можна отримати нові вирази для часу паралельного розв'язання задачі та відповідного прискорення:

Tp = (T 1 + T 0 )/P, Sp = T 1 / Tp = (P * T 1 )/(T 1 + T 0 )

Тоді ефективність використання процесорів можна виразити як

E P = Sp/P = T 1 / (T 1 + T 0 ) = 1/(1+ T 1 /T 0 )

Тоді, якщо складність розв'язуваної задачі є фіксованою ( T 1 =const), то при зростанні числа процесорів ефективність, як правило, буде спадати за рахунок зростання накладних витрат T 0 . При фіксованому числі процесорів, ефективність можна покращити шляхом підвищення складності розв'язуваної задачі T 1 оскільки передбачається, що при збільшенні складності накладні витрати T 0 зростають повільніше, ніж обсяг обчислень T 1 .

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

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

2. Топологія мережі передачі. Приклад елементарних топологій, основні характеристики. Алгоритми маршрутизації та методи передачі даних.

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

    1. Приклади топологій мережі передачі даних

Топологія мережі передачі – це структура ліній комутації між процесорами обчислювальної системи. Топологія є повним графом, у якому передача даних може бути організована між будь-якими двома вершинами (процесорами мережі). Топологія визначається з урахуванням можливостей ефективної технічної реалізації з урахуванням аналізу інтенсивності передачі інформаційних потоків. До типових топологій зазвичай відносять такі схеми комунікації процесорів (див. малюнок).

Повний граф(Completely-connected graph or clique) - система, в якій між будь-якою парою процесорів існує пряма лінія зв'язку, тому дана топологія забезпечує мінімальні витрати при передачі даних, проте є складно реалізується при великій кількості процесорів.

Лінійка(linear array or farm) – система, в якій всі процесори перенумеровані по порядку і кожен процесор, крім першого та останнього, має лінії зв'язку лише з двома сусідніми (з попереднім та наступним) процесорами; така схема є, з одного боку, просто реалізованої, з другого боку, відповідає структурі передачі при вирішенні багатьох обчислювальних завдань (наприклад, з організацією конвеєрних обчислень).

Кільце(ring) - дана топологія виходить з лінійки процесорів з'єднанням першого та останнього процесорів лінійки.

Зірка(star) - система, в якій всі процесори мають лінії зв'язку з деяким процесором, що управляє; Ця топологія є ефективною, наприклад, при організації централізованих схем паралельних обчислень.

Грати(mesh) - система, в якій граф ліній зв'язку утворює прямокутну сітку (зазвичай двох-або тривимірну); подібна топологія може бути досить просто реалізована і, крім того, може бути ефективно використана при паралельному виконанні багатьох чисельних алгоритмів (наприклад, при реалізації методів аналізу математичних моделей, що описуються диференціальними рівняннями приватних похідних).

Гіперкуб(hypercube) – дана топологія представляє окремий випадок структури решітки, коли з кожної розмірності сітки є лише два процесора; даний варіант організації мережі передачі досить широко поширений у практиці і характеризується наступним рядом відмітних ознак:

а) два процесори мають з'єднання, якщо двійкові уявлення їх номерів мають

тільки одну позицію, що відрізняється;

б) N-мірний гіперкуб може бути розділений на два (N-1)-мірні гіперкуби (всього можливо N різних розбиття);

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

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

Існують різні способи реалізації паралельних обчислень. Наприклад, кожен обчислювальний процес може бути реалізований у вигляді процесу операційної системи або ж обчислювальні процеси можуть являти собою набір потоків виконання всередині одного процесу ОС. Паралельні програми можуть фізично виконуватися або послідовно на єдиному процесорі - переміжуючи по черзі кроки виконання кожного обчислювального процесу, або паралельно - виділяючи кожному обчислювальному процесу один або кілька процесорів (які знаходяться поруч або розподілені в комп'ютерну мережу).

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

Способи синхронізації паралельної взаємодії

У деяких паралельних системах програмування передача даних між компонентами прихована від програміста (наприклад, за допомогою механізму обіцянок), тоді як в інших вона повинна явно вказуватися. Явні взаємодії можуть бути поділені на два типи:

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

У паралелізму з розподіленою пам'яттю та з передачею повідомлень різні характеристики продуктивності. Зазвичай (але не завжди), накладні витрати пам'яті на процес і час на перемикання завдань у систем з передачею повідомлень нижче, проте передача самих повідомлень більш накладна, ніж виклики процедур. Ці відмінності часто перекриваються іншими чинниками, які впливають продуктивність.

Зрозуміло, у такій системі можна також використовувати і виключно метод передачі повідомлень, тобто запустити на кожному процесорі кожного вузла окремий процес. У цьому випадку кількість процесів (і потоків) дорівнюватиме кількості процесорів на всіх вузлах. Цей спосіб простіше (у паралельній програмі треба тільки збільшити кількість процесів), але є менш ефективним, оскільки процесори одного і того ж вузла обмінюватимуться один з одним повідомленнями, немов вони знаходяться на різних машинах.

Типові завдання, що допускають паралельні обчислення

  • map - виконання однієї й тієї функції над кожним елементом масиву вхідних даних, з отриманням рівного за потужністю масиву результатів обчислення
  • reduce - виконання однієї й тієї функції для додавання вкладу кожного елемента вхідних даних в одне підсумкове значення

Програмні інструменти паралелізму

  • OpenMP – стандарт інтерфейсу додатків для паралельних систем із загальною пам'яттю.
  • POSIX Threads – стандарт реалізації потоків (ниток) виконання.
  • Windows API – багатопотокові програми для C++.
  • PVM (Parallel Virtual Machine) дозволяє об'єднати різнорідний (але пов'язаний мережею) набір комп'ютерів у загальний обчислювальний ресурс.
  • MPI (Message Passing Interface) – стандарт систем передачі повідомлень між паралельно виконуваними процесами.

Див. також

Напишіть відгук про статтю "Паралельні обчислення"

Література

  • Словник з кібернетики / За редакцією академіка В. С. Михалевича. - 2-ге. – Київ: Головна редакція Української Радянської Енциклопедії імені М. П. Бажана, 1989. – 751 с. - (С48). - 50 000 екз. - ISBN 5-88500-008-5.
  • . – IBM RedBook, 1999. – 238 с.(англ.)
  • Воєводін Ст Ст, Воєводін Вл. Ст.Паралельні обчислення. – СПб: БХВ-Петербург, 2002. – 608 с. - ISBN 5-94157-160-7.
  • Оленєв Н. Н.. – М.: ВЦ РАН, 2005. – 80 с. - ISBN 5201098320.

Примітки

Посилання

  • (англ.)
  • (англ.)

Уривок, що характеризує Паралельні обчислення

Дух війська - є множник на масу, що дає витвір сили. Визначити та висловити значення духу війська, цього невідомого множника, є завдання науки.
Завдання це можливе лише тоді, коли ми перестанемо довільно підставляти замість значення всього невідомого Х ті умови, за яких проявляється сила, як то: розпорядження полководця, озброєння і т. д., приймаючи їх за значення множника, а визнаємо це невідоме у всій його цілісності, тобто як більше або менше бажання битися і наражати себе на небезпеку. Тоді тільки, виражаючи рівняннями відомі історичні факти, порівняння відносного значення цього невідомого можна сподіватися визначення самого невідомого.
Десять чоловік, батальйонів чи дивізій, борючись із п'ятнадцятьма людьми, батальйонами чи дивізіями, перемогли п'ятнадцять, тобто вбили і забрали в полон усіх без залишку і самі втратили чотири; отже, знищилися з одного боку чотири, з іншого боку п'ятнадцять. Отже, чотири дорівнювали п'ятнадцяти, і, отже, 4а:=15у. Отже, ж: г/==15:4. Рівняння це дає значення невідомого, але це дає відношення між двома невідомими. І з підведення під такі рівняння історичних по-різному взятих одиниць (битв, кампаній, періодів воєн) вийдуть ряди чисел, в яких повинні існувати і можуть бути відкриті закони.
Тактичне правило про те, що треба діяти масами при наступі та розрізнено при відступі, несвідомо підтверджує тільки ту істину, що сила війська залежить від його духу. Для того, щоб вести людей під ядра, потрібно більше дисципліни, яка досягається лише рухом у масах, ніж для того, щоб відбиватися від нападників. Але правило це, у якому втрачається з виду дух війська, безупинно виявляється невірним і особливо разюче суперечить дійсності там, де є сильний підйом чи занепад духу війська, – у всіх народних війнах.
Французи, відступаючи в 1812 році, хоча і повинні б захищатися окремо, за тактикою, тиснуться в купу, тому що дух війська впав так, що тільки маса стримує військо разом. Росіяни, навпаки, за тактикою мали б нападати масою, насправді ж подрібнюються, тому що дух піднятий так, що окремі особи б'ють без наказу французів і не потребують примусу для того, щоб наражати себе на праці та небезпеки.

Так звана партизанська війна почалася зі вступу ворога до Смоленська.
Перш ніж партизанська війна була офіційно прийнята нашим урядом, вже тисячі людей ворожої армії - відсталі мародери, фуражири - були винищені козаками і мужиками, що побивали цих людей так само несвідомо, як несвідомо собаки загризають шаленого собаку. Денис Давидов своїм російським чуттям перший зрозумів значення тієї страшної палиці, яка, не питаючи правил військового мистецтва, знищувала французів, і йому належить слава першого кроку узаконення цього прийому війни.
24 серпня було засновано перший партизанський загін Давидова, і за його загоном стали засновуватися інші. Чим далі рухалася кампанія, тим більше збільшувалася кількість цих загонів.
Партизани знищували Велику армію частинами. Вони підбирали те відпадає листя, яке самі собою сипалося з висохлого дерева - французького війська, і іноді трясли це дерево. У жовтні, коли французи бігли до Смоленська, цих партій різних величин і характерів були сотні. Були партії, що переймали всі прийоми армії, з піхотою, артилерією, штабами, з вигодами життя; були одні козачі, кавалерійські; були дрібні, збірні, піші та кінні, були мужицькі та поміщицькі, нікому не відомі. Був дячок начальником партії, який узяв на місяць кілька сотень полонених. Була старостиха Василина, яка побила сотні французів.
Останні числа жовтня був час розпалу партизанської війни. Той перший період цієї війни, під час якого партизани, самі дивуючись своєї зухвалості, боялися щохвилини бути спійманими та оточеними французами і, не розсідаючи і майже не злазячи з коней, ховалися лісами, чекаючи щохвилини погоні, – уже пройшов. Тепер уже ця війна визначилася, всім стало ясно, що можна було зробити з французами і чого не можна було робити. Тепер уже тільки ті начальники загонів, які зі штабами, за правилами ходили далеко від французів, вважали ще багато неможливим. Дрібні ж партизани, які давно вже почали свою справу і близько виглядали французів, вважали за можливе те, про що не сміли й думати начальники великих загонів. Козаки ж і мужики, що лазили між французами, вважали, що тепер уже було все можливо.
22 жовтня Денисов, який був одним із партизанів, перебував зі своєю партією в самому розпалі партизанської пристрасті. З ранку він зі своєю партією був на ходу. Він цілий день по лісах, що примикали до великої дороги, стежив за великим французьким транспортом кавалерійських речей і російських полонених, що відокремилися від інших військ і під сильним прикриттям, як це було відомо від шпигунів і полонених, що прямували до Смоленська. Про цей транспорт було відомо не тільки Денисову та Долохову (теж партизану з невеликою партією), що ходив близько від Денисова, а й начальникам великих загонів зі штабами: всі знали про цей транспорт і, як говорив Денисов, точили на нього зуби. Двоє з цих великих загонових начальників – один поляк, інший німець – майже одночасно прислали Денисову запрошення приєднатися кожен до свого загону, щоб напасти на транспорт.
- Ні, бг"ат, я сам з вусами, - сказав Денисов, прочитавши ці папери, і написав німцеві, що, незважаючи на душевне бажання, яке він мав служити під начальством такого доблесного і знаменитого генерала, він повинен позбавити себе цього щастя, бо вже вчинив під начальство генерала поляка, а генералові поляку він написав те саме, повідомляючи його, що він уже вчинив під начальство німця.
Розпорядившись таким чином, Денисов мав намір, без повідомлення про це вищим начальникам, разом з Долоховим атакувати і взяти цей транспорт своїми невеликими силами. Транспорт йшов 22 жовтня від села Микуліного до села Шамшеве. З лівого боку дороги від Микуліна до Шамшева йшли великі ліси, що місцями підходили до самої дороги, місцями віддалялися від дороги на версту і більше. По цих лісах цілий день, то заглиблюючись у середину їх, то виїжджаючи на узлісся, їхав з партією Денисов, не випускаючи з уваги французів, що рухалися. З ранку, недалеко від Микуліна, там, де ліс близько підходив до дороги, козаки з партії Денисова захопили дві французькі фури, що стали в бруді, з кавалерійськими сідлами і відвезли їх у ліс. З того часу й до самого вечора партія, не нападаючи, стежила за рухом французів. Треба було, не злякавши їх, дати спокійно дійти до Шамшева і тоді, з'єднавшись з Долоховим, який мав надвечір приїхати на нараду до варти в лісі (у версті від Шамшева), на світанку пасти з двох боків як сніг на голову і побити і забрати всіх разом.
Позаду, за два версти від Микуліна, там, де ліс підходив до самої дороги, було залишено шість козаків, які повинні були донести зараз, як тільки з'являться нові колони французів.
Попереду Шамшева так само Долохов мав досліджувати дорогу, щоб знати, на якій відстані є ще інші французькі війська. При транспорті передбачалося 1500 чоловік. Денисов мав двісті чоловік, Долохов міг бути стільки ж. Але перевага числа не зупиняла Денисова. Одне тільки, що ще треба було йому знати, це те, які саме були ці війська; і для цієї мети Денисову треба було взяти мови (тобто людину з ворожої колони). У ранковий напад на фури справа зробилася з такою поспішністю, що французів, які були при фурах, усіх перебили і захопили живим тільки хлопчика барабанщика, який був відсталий і нічого не міг сказати позитивно про те, які були війська в колоні.
Інший раз нападати Денисов вважав небезпечним, щоб не стривожити всю колону, і тому він послав вперед у Шамшево колишнього при його партії мужика Тихона Щербатого - захопити, якщо можна, хоч одного з колишніх там французьких передових квартиргерів.

Надіслати свою гарну роботу до бази знань просто. Використовуйте форму нижче

Студенти, аспіранти, молоді вчені, які використовують базу знань у своєму навчанні та роботі, будуть вам дуже вдячні.

Розміщено на http://www.allbest.ru/

Розміщено на http://www.allbest.ru/

  • Вступ
  • 1. Актуальність теми
  • 2. Збільшення кількості ядер
  • 3. Технологія NVIDIA CUDA
  • 4. Різниця між CPU та GPU
  • Висновок
  • Вступ
  • Розпаралелювання обчислень - це поділ великих завдань на більш маленькі, які можуть виконуватися одночасно. Зазвичай для паралельних обчислень потрібні координовані дії. Паралельні обчислення бувають декількох форм (на рівні інструкцій, бітів, даних, завдань). Паралельні обчислення знаходили своє застосування протягом багатьох років переважно у високопродуктивних обчисленнях. Але ситуація останнім часом змінилася. З'явився попит такі обчислення через фізичних обмежень зростання тактової частоти процесора. Паралельні обчислення стали домінантною ідеєю в архітектурі комп'ютера. Вона набула форми багатоядерних процесорів.
  • Використання паралельних обчислювальних систем зумовлено стратегічним напрямам розвитку на комп'ютерної промисловості. Головним обставиною послужило як обмеження можливостей швидкодії машин, заснованих на послідовної логіці, як і наявністю завдань, котрим наявність обчислювальної техніки є ще достатнім. До завдань цієї категорії можна віднести моделювання динамічних процесів.
  • Поява процесорів з кількома ядрами стало стрибком розвитку ефективних суперобчислень, які можуть похвалитися вищими показниками продуктивність/вартість, порівняно з системами на базі супер ЕОМ. Використання багатоядерних процесорів дає гнучку можливість, зокрема варіювання конфігурацій, і навіть масштабування потужності в обчислювальних системах - починаючи з PC, серверів, робочих станцій і закінчуючи кластерними системами.
  • 1. Актуальність теми
  • В останні роки з'явилася велика кількість дешевих кластерних паралельних обчислювальних систем, які призвели до швидкого розвитку паралельних обчислювальних технологій, у тому числі й у галузі високопродуктивних обчислень. Більшість основних виробників мікропроцесорів стали переходити на багатоядерні архітектури, що вплинуло зміну ситуації у сфері паралельних обчислювальних технологій. Зміна апаратної бази спричиняє зміну побудов паралельних алгоритмів. Для реалізації в багатоядерних архітектурах обчислювальних потрібні нові паралельні алгоритми, що враховують нові технології. Ефективність використання обчислювальних ресурсів залежатиме від якості власне паралельних програм та спеціалізованих бібліотек, орієнтованих на багатоядерні архітектури.
  • Застосування високопродуктивної техніки у моделюванні реальних технічних, економічних, та інших процесів, що описуються системами звичайних диференціальних рівнянь великої розмірності, як виправдано, а й необхідно. Розпаралелювання обчислень у багатопроцесорних і паралельних структурах є ефективним способом підвищення продуктивності. Отже, застосування паралельних обчислювальних систем є досить важливим напрямом розвитку обчислювальної техніки.

2. Збільшення кількості ядер

Першим процесором для масового використання був POWER4 із двома ядрами PowerPC на одному кристалі. Випущений компанією IBM у 2001 році.

Виробники процесорів Intel, AMD, IBM, ARM визнали збільшення кількості ядер як один із пріоритетних напрямів збільшення продуктивності.

У 2011 році випустили у виробництво 8-ядерні процесори для домашніх PC та 16-ядерні для серверних систем.

Є розробки процесорів із великою кількістю ядер (понад 20), які знайшли застосування у специфічних пристроях.

2-х ядерні процесори існували раніше, наприклад, IBM PowerPC-970MP (G5Н). Але такі процесори застосовувалися у вузькому колі спеціалізованих завдань.

У квітні 2005 року AMD представила двоядерний процесор Opteron. архітектура AMD64 призначений для серверів. У травні 2005 року Intel представила процесор Pentium D. Архітектури x86-64. Став першим 2-х ядерним процесором для домашніх ПК.

У березні 2010 року AMD представила 12-ядерні серійні серверні процесори Opteron 6100 (архітектура x86/x86-64).

У серпні 2011 року AMD представила 16-ядерні серійні серверні процесори Opteron серії 6200. Процесор Interlagos в одному корпусі містить два 8-ядерні (4-модульні) чіпи і сумісний з платформою AMD Opteron серії 6100 (Socket G34).

3. Технологія NVIDIA CUDA

Велика кількість паралельних обчислень пов'язані з тривимірними іграми. Паралельні векторні обчислення на універсальних пристроях із багатоядерними процесорами використовуються в 3D-графіці, досягаючи високої пікової продуктивності. Універсальним процесорам це не під силу. Максимальна швидкість досягається лише у низці зручних завдань, маючи деякі обмеження. Але все одно такі пристрої широко застосовують у сферах, де спочатку не призначалися. Наприклад, процесор Cell, розробки альянсу Sony-Toshiba-IBM в ігровій приставці Sony PlayStation 3, або сучасні відеокарти від компаній NVIDIA та AMD.

Ще кілька років тому почали з'являтись технології неграфічних розрахунків загального призначення GPGPU для 3D відеоприскорювачів. Сучасні відеочіпи мають сотні математичних виконавчих блоків, така міць може допомогти для значного прискорення безлічі обчислювально-інтенсивних додатків. Нинішні покоління GPU мають гнучку архітектуру, яка разом із програмно-апаратними архітектурами та високорівневими мовами дає можливість робити їх набагато доступнішими.

Поява досить швидких та гнучких шейдерних програм зацікавила розробників створити GPGPU, які здатні виконувати сучасні відеочіпи. Розробники захотіли на GPU розраховувати не лише зображення в ігрових та 3D додатках, а й застосовувати в інших галузях паралельних обчислень. Для цього використовували API графічних бібліотек OpenGL та Direct3D. Дані відеочіп передавалися в якості текстур, розрахункові програми містилися у вигляді шейдерів. Головним недоліком такого способу є значна складність програмування, низький обмін даними між GPU та CPU, та деякі інші обмеження.

Провідні виробники відеочіпів NVIDIA та AMD представили платформи для паралельних обчислень - CUDA та CTM відповідно. У відеокартах з'явилася апаратна підтримка прямого доступу до обчислювальних ресурсів. CUDA є розширенням мови програмування CTM. CTM більше схожий на віртуальну машину, яка виконує тільки асемблерний код. Обидві платформи прибрали обмеження попередніх версій GPGPU, які використовували традиційний графічний конвеєр, і графічні бібліотеки Direct3D і Open GL.

OpenGL є більш портованою, а також універсальною через свою відкритість коду. Але вона не дозволить використовувати той самий код на чіпах різних виробників. У таких методів багато недоліків, вони не зручні, і мають малу гнучкість. А також вони не дозволяють використовувати специфічні можливості деяких відеокарт, наприклад швидка загальна пам'ять.

Саме це спіткало компанію NVIDIA випустити платформу CUDA - C-подібну мову програмування, наділену своїм компілятором, а також у наборі бібліотеками для обчислень на GPU. Написання хорошого коду для відеочіпів дуже не просте заняття, але CUDA дає більше контролю за апаратними засобами відеокарти. CUDA з'явилася з відеокарт серії 8. З'явилася CUDA версії 2.0, яка підтримує розрахунки з подвійною точністю в 32- та 64-бітних ОС Windows, Linux, MacOS X.

4. Різниця між CPU та GPU

Зростання тактової частоти закінчилося через високе енергоспоживання. Збільшення продуктивності відбувається рахунок збільшення кіл-ва ядер одному чипі. На даний момент для домашніх користувачів продаються процесори до восьми ядер і кількістю потоків до 16. У таких процесорах кожне ядро ​​працює окремо.

Спеціальні векторні можливості (інструкції SSE) для 4-х компонентних (одинарна точність з плаваючою точкою) та 2-х компонентних (подвійна точність) векторів з'явилися в універсальних процесорах через виникнення високих вимог додатків, що працюють з графікою. Тому застосування GPU є вигіднішим, т.к. вони заточені спочатку під такі завдання.

У чіпах NVIDIA основний блок - це мультипроцесор з 8-10 ядрами та близько сотні ALU з кількома тисячами регістрів і великою загальною пам'яттю. Відеокарта має глобальну пам'ять з доступом з усіх мультипроцесорів, локальна пам'ять у кожному мультипроцесорі, а також є пам'ять констант.

У GPU ядра є SIMD (одинаковий потік команд, безліч потоків даних) ядрами. Ці ядра виконують одні й самі інструкції одночасно. Це і є стиль програмування графічних алгоритмів. Він специфічний, але дозволяє збільшити кількість обчислювальних блоків рахунок своєї простоти.

Основні відмінності між архітектурами (GPU і CPU): ядра CPU виконують один потік послідовних інструкцій з максимальною продуктивністю, GPU виконує велику кількість потоків інструкцій, що паралельно виконуються. Універсальні процесори націлені на досягнення високої продуктивності одного потоку команд, що обробляють числа з плаваючою точкою та без. Доступ до пам'яті є випадковим.

Політика розробників CPU: домогтися виконання більшої кількості інструкцій паралельно, збільшення продуктивності. Тому, починаючи з процесорів Intel Pentium, з'явилася технологія суперскалярного виконання, яка є виконанням 2-х інструкцій за такт, а процесор Pentium Pro відзначився позачерговим виконанням інструкцій.

У відеочіпів робота більш проста і розпаралелена спочатку. Чіп приймає групу полігонів, всі необхідні операції, і видає пікселі. Обробка полігонів та пікселів незалежна незалежно один від одного. Тому в GPU така велика кількість процесорів. Також сучасні GPU здатні виконати більше однієї інструкції за такт.

Інша відмінність CPU від GPU: принцип доступу до пам'яті. У GPU він зв'язковий і передбачуваний, т.к. якщо вважалися текстури, то через деякий час прийде черга сусідніх текстур. Тому організація пам'яті у відеокарти та центрального процесора різні. І відеочіпу тому не треба кеш-пам'ять великого розміру, а для текстур потрібні лише близько 128-256 кБ.

Робота з пам'яттю також є різною. CPU мають вбудовані контролери пам'яті, у GPU зазвичай їх по кілька, аж до восьми 64-біт каналів. Крім того, застосовується дуже швидка пам'ять, отже, пропускна здатність пам'яті вище, що є плюсом для паралельних розрахунків, що оперують з величезними потоками даних.

У CPU велика кількість транзисторів йде на буфери команд, апаратне передбачення розгалуження, величезні обсяги кеш-пам'яті. Всі ці блоки необхідні для прискорення нечисленних потоків команд. У GPU транзистори йдуть на масиви виконавчих блоків, пам'ять малого об'єму, що розділяється, керуючі потоками блоки, контролери пам'яті. Усе це прискорює виконання окремих потоків, але дозволяє обробляти в величезній кількості одночасно.

Кешування. CPU використовує кеш зменшення затримок доступу до пам'яті, наслідок чого, відбувається збільшення продуктивності. GPU використовує кеш для збільшення пропускної здатності. CPU знижує затримки доступу до пам'яті за рахунок великого кешу та передбачення розгалужень коду. Ці апаратні частини є великими чипом, отже, вони споживають багато енергії. GPU вирішує проблему затримки доступу до пам'яті іншим способом: виконання тисяч потоків одночасно. Коли один потік чекає на дані, інший потік виконує обчислення без очікування і затримок.

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

5. Перше застосування розрахунків на графічних прискорювачах

Історія застосування чіпів для математичних розрахунків розпочалося давно. Найперші спроби були примітивними і використовували деякі функції Z-буферизації і растеризації. Але з появою шейдерів розпочалося прискорення. У 2003р. на SIGGRAPH з'явилася нова секція під обчислення і отримала GPGPU.

BrookGPU. Відомий компілятор мови програмування Brook. Є потоковим. Був спеціально розроблений для обчислень на GPU. Розробники використовували API: Direct3D чи OpenGL. Це значно обмежувало застосування GPU, т.к. шейдери та текстури застосовувалися у 3D графіці, а фахівці з паралельного програмування нічого знати не зобов'язані. Вони використовують струму потоки та ядра. Brook зміг трохи допомогти у цьому завдання. Розширення до мови С допомогли приховати від програмістів тривимірний API, і надати відеочіп як паралельний співпроцесор. Компілятор компілював код і прив'язував до бібліотек DirectX, OpenGL або x86.

6. Області застосування паралельних розрахунків на графічних прискорювачах

Наведемо усереднені цифри приросту продуктивності обчислень, отримані дослідниками у світі. При переході на GPU приріст продуктивності складає в середньому в 5-30 разів, а в деяких прикладах доходить і до 100 разів (зазвичай це код, який непридатний для розрахунків за допомогою SEE).

Ось деякі приклади прискорень:

· Флуоресцентна мікроскопія – у 12 разів;

· Молекулярна динаміка – у 8-16 разів;

· Електростатика (пряме та багаторівневе підсумовування Кулону) – у 40-120 разів та 7 разів.

ядро процесор графічний

Висновок

У рефераті вдалося розглянути паралельні обчислення багатоядерних процесорах, і навіть технологіях CUDA і CTM. Були розглянуті різниця між CPU та GPU, які були складності застосування відеокарт у паралельних обчисленнях без технології CUDA, розглянуті сфери застосування.

У рефераті був розглянуто застосування паралельних обчислень в центральних процесорах з інтегрованим видеоядром. Це процесори фірми AMD серії А (AMD A10, AMD A8, AMD A6, AMD A4) та процесори фірми Intel серії i3/i5/i7 із вбудованим відеоядром HD Graphics.

Список використаної літератури

1. Сайт ixbt.com, власник Byrds Research and Publishing, Ltd

2. Сайт wikipedia.org, власник Фонду Вікімедіа

3. Сайт nvidia.ru, власник NVIDIA corporation

Розміщено на Allbest.ru

...

Подібні документи

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

    презентація , додано 10.02.2014

    Знайомство з історією розвитку багатопроцесорних комплексів та паралельних обчислень. Персональні комп'ютери як поширені однопроцесорні системи на платформі Intel або AMD, що працюють під керуванням операційних систем.

    презентація , доданий 22.02.2016

    Класифікація паралельних обчислювальних систем. Суттєві поняття та компоненти паралельних комп'ютерів, їх компоненти. Особливості класифікацій Хендера, Хокні, Флінна, Шора. Системи з роздільною та локальною пам'яттю. Способи поділу пам'яті.

    курсова робота , доданий 18.07.2012

    Математична основа паралельних обчислень. Властивості Parallel Computing Toolbox. Розробка паралельних додатків у Matlab. Приклади програмування паралельних завдань. Обчислення певного інтегралу. Послідовне та паралельне перемноження.

    курсова робота , доданий 15.12.2010

    Розвиток концепцій та можливостей ОС. Паралельні комп'ютерні системи та особливості їхньої ОС. Симетричні та асиметричні мультипроцесорні системи. Види серверів у клієнт-серверних системах. ОС для хмарних обчислень. Кластерні обчислювальні системи.

    лекція, доданий 24.01.2014

    Технологія розробки паралельних програм багатопроцесорних обчислювальних систем із загальною пам'яттю. Синтаксис, семантика та структура моделі OpenMP: директиви, процедури та змінні оточення. Розпаралелювання за даними та операціями, синхронізація.

    презентація , додано 10.02.2014

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

    контрольна робота , доданий 02.06.2014

    Переваги багатопроцесорних систем. Створення програми, що реалізує роботу мультипроцесорної системи із загальною пам'яттю щодо обробки різної кількості заявок, а також різної кількості процесорів. Моделі обчислень на векторних та матричних ЕОМ.

    курсова робота , доданий 21.06.2013

    Абстрактні моделі та способи паралельної обробки даних, допустима похибка обчислень. Поняття паралельного процесу, їх синхронізація та гранули розпаралелювання, визначення закону Амдаля. Архітектура багатопроцесорних обчислювальних систем.

    дипломна робота , доданий 09.09.2010

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