Чи потрібно щось робити на багатоядерному процесорі?


45

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

Чи є щось, що потрібно зробити на багатоядерному процесорі?

Припустимо, є нескінченний час як для розвитку, так і для роботи.


8
Хоча відповіді нижче, здається, значною мірою є "ні", але історично існують системи, які буквально не могли б працювати, не працюючи спільним процесором, який би вирішував деякі завдання. Одним із важливих прикладів, про які я знаю, є Nintendo DS, який включає процесор ARM9 67 МГц і процесор ARM7 33 МГц (також використовується для зворотного співвідношення під час гри в ігри GBA). Для ігор DS, ARM7 працює з аудіо- та Wi-Fi-зв’язком, оскільки ARM9 не може обробляти та малювати нічого зауваження на екрані, не відстаючи від подачі аудіо на звуковий чіп безпосередньо. Так, як @jmite стверджує, "за яких обмежень", відсутність швидкості може вимагати отримання декількох процесорів.
Сліпп Д. Томпсон

10
На моїй роботі ми використовуємо багатоядерні Xeons та розширення Linux в реальному часі Xenomai, щоб зробити обробку аудіо з низькою затримкою. У нас є триступеневий конвеєр обробки аудіо, і кожен етап отримує власне виділене ядро, яке він використовує ~ 70% циклів. Завдання в режимі реального часу отримують використання четвертого ядра, і будь-які цикли залишаються на перших трьох. Це стане можливим лише для одноядерного процесора, якщо це одне ядро ​​в 3+ рази швидше, ніж ядро ​​в поточному 4-ядерному процесорі; враховуючи, що поточний процесор працює на частоті 2 ГГц, цього може бути важко досягти.
Джеремі Фріснер

19
Програмне забезпечення в одноядерному процесорі може імітувати багатоядерний процесор. Різниця майже повністю у швидкості.
користувач253751

24
Одне, що потрібно зробити в багатоядерній системі - це тестування багатопотокового програмного забезпечення. Тому що деякі дефекти (майже) ніколи не трапляться в одноядерній системі. Я не впевнений, що це відповідає як відповідь ...
nikie

13
@nikie Одноядерна система може також імітувати впорядкування пам'яті та застарілі кеші - але я думаю, це було б вкрай неефективно (як 10 × уповільнення)
Nayuki

Відповіді:


47

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

TnTn


3
Я не зовсім впевнений, що це абсолютно правильно. Я не думаю, що помилки консистенції пам’яті можливо генерувати на одному ядрі (Так, можна було б емулювати багатокачественну систему на єдиноборстві, але таке непряме є своєрідним обманом.) (Можливо, еквівалент реалізації reg. Swap переміщенням ops у VLIW, використовуючи гарантований || ism?) Я припускаю, що навіть на однопотоковому ядрі все-таки вдасться витягти ентропію з багатопотокової змінної синхронізації, але кількість ентропія була б меншою за одиницю часу (що насправді лише питання продуктивності, як і інші відмінності).
Пол А. Клейтон

6
@ PaulA.Clayton Помилки послідовності пам'яті, як правило, небажані, і добре написане програмне забезпечення не повинно їх демонструвати. Однак, якщо ви дійсно цього хотіли, можете імітувати їх на одному процесорі. (Хоча це може бути повільно)
користувач253751

4
nn

11
"Одноядерна машина може імітувати багатоядерну машину, використовуючи розрізання часу / розподіл часу." І справді це робили з самого світанку "сучасної" Операційної системи.
Гонки легкості з Монікою

1
@ PaulA.Clayton Я думаю, що у вас можуть виникнути проблеми з узгодженістю пам’яті (наприклад, без атомного приросту), якби у вас були два різні процеси, які змінили одну і ту ж загальну пам’ять. Вам просто потрібні переважні багатозадачні завдання. Звичайно, це правило, чому сучасні ОС не мають процесів, що мають спільну пам'ять для запису, якщо вони прямо не вимагають.
Патрік М

58

Питання: при яких обмеженнях?

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

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

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

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


3
@JanDvorak Я б фактично сказав, що це зовсім не робиться GPU;)
TomTom

15
Якщо час не обмежує, ви можете зробити всі розрахунки вручну, ручкою та папером.
mathreadler

2
@mathreadler Так, адже мозок Turing завершений. Щось, що переросло в тривалу дискусію про фізику Stackexchange.
JBentley

4
На насправді, @JanDvorak, генеруючи VGA досить простий і може бути зроблений в програмному забезпеченні на смиренні 16 МГц мікроконтролера, так як цей проект показує: pyroelectro.com/tutorials/arduino_basic_vga
axello

3
@mathreadler Це насправді складніше питання, ніж це з'являється спочатку. Коротка відповідь може бути "так", оскільки спеціалізована машина може сконструювати комп'ютер, не вимагаючи для цього будь-яких інструментів. Більш довга відповідь може бути "ні", оскільки здатність сконструювати тюрінг-машину може означати, що людина має більшу машину Тьюрінга, яка знаходиться в стані "ініціалізації", де вона конструює решту машини машини. Повна відповідь ще складніша, оскільки ми ніколи не конструювали пристрій Turing Complete. Ми розробили абстрактні ідеї для машин, які є ...
Cort Ammon

17

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

У реальному світі час виконання може бути важливим. Це може означати різницю між посередньою частотою кадрів і зоряним зоровим досвідом. Або різниця між прибутком і збитками в торгівлі.

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

Дозвольте проілюструвати деякими цифрами. Припустимо, у вас є конвеєр даних (3D-рендерінг тощо), який має 4 етапи обробки, на кожному етапі є 256 KiB програмного коду, і ви зручно мати 4 процесора з 256 KiB кешу L2. Якщо ви спробуєте запустити цю обробку на одному процесорі, то перемикання між чотирма завданнями буде дорогим і спричинить великі пропуски кешу. З іншого боку, якщо ви запускаєте його в чотирьохядерній системі, обчислення потенційно може бути дуже плавним, помилки кешу мінімальні, а контекстні комутатори відсутні. (Як бічне зауваження, це пов'язано з поняттям закріплення певних додатків до певних ядер - наприклад, лише виконання операцій з ядром ОС в одному ядрі або обробка TCP / IP тощо)


7

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

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

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

ШАХИ детектор гонки на насправді використовує це , щоб знайти випадки гонки. Він запускає все однопоточне і систематично досліджує всі можливі переплетення між потоками, намагаючись знайти випадки, коли тест провалюється через гоночний випадок. CHESS залежить від того, що ви можете запустити будь-яке багатопотокове додаток на одному ядрі.

Випадки, коли вам потрібна багатоядерність, з’являються, коли ви починаєте розтягувати межі обладнання. Очевидним є те, коли у тебе є обмеження в часі. Деякі проблеми з обмеженнями часу в режимі реального часу неможливо зробити одноядерними, оскільки вони просто не можуть керувати годинником одного ядра досить швидко. Є причина, що процесори піднялися до 4 ГГц, а потім трохи розташувалися, віддаючи перевагу більше ядер на менших швидкостях.

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

Інший ліміт виникає з шинами даних. Розглянемо блакитний ген / P як приклад. JUGENE, особливий суперкомп'ютер Blue Gene / P, має 144 терабайти пам'яті. Вони просто не роблять єдиних процесорів, які можуть отримати доступ до всієї цієї пам'яті.


1
Re: Вони просто не роблять єдиних процесорів, які можуть отримати доступ до [стільки] пам'яті. "Не" не те саме, що "не можу". Ви можете спроектувати та побудувати однопроцесор із 144 терабайтами або більше основної пам’яті. Єдина причина, чому люди цього не роблять, - це зменшення віддачі: додаткова, практична цінність додавання більше пам’яті до дизайну універсального процесора досягає свого піку в якийсь момент, а потім зменшується в міру збільшення обсягу пам’яті, при цьому додаткові витрати залишаються постійними .
Соломон повільно

@jameslarge Ось чому це пропозиція виникла в частині моєї відповіді, в якій обговорювались практичні засоби реальної життєдіяльності, і чому вона не з'явилася в першій 2/3 відповіді, в якій обговорювалися теоретичні можливості.
Корт Аммон

"Не" проти "Не можу" ілюструється двома системами в моєму підвалі. Якби я міг фізично додати стільки пам’яті до їх апаратних конфігурацій, їх процесори «могли б» отримати доступ до кожного байти. Але я не можу, тому вони "не можуть". Можливості процесорів виходять за рамки практичності.
користувач2338816

Я думав щось подібне до цієї відповіді. Здається, що умови гонки були б неможливими (або траплялися 100% часу) в одноядерному середовищі. Що стосується практичного застосування, то я вважаю, що розробник програмного забезпечення може створити унікальну форму захисту від копіювання за допомогою кодування якогось дивного тесту стану перегонів, який завжди передаватиме конкретне цільове обладнання, але не зможе виконати емуляцію апаратного забезпечення, кероване одним ядром . У цьому випадку емуляція багатоядерною системою, ймовірно, проходитиме іноді, але ненадійно.
Ден Хендерсон

6

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


Хороший, стислий приклад того, що вимагало б точної емуляції, якщо не декілька процесорів
Ben Leggiero

Гей, це ваш рахунок? Може, ви хотіли б це злити?
Зло

4

Інші відповіді дотримуються обмеженого погляду на паралелізм як "розподілену одночасність". Це дає деякі відповіді: у чистій моделі обчислення à la Turing кілька ядер не пропонують переваги; Єдина перевага, яку ви можете отримати, - це ефективність.

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

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

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

k

kkk


0

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

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

  • врахуйте, що кожен процесор має незалежний "[x]%" шанс вийти з ладу під час обчислення. може бути розроблена система, згідно з якою за допомогою зв'язку загальна відмовність системи перевершує окремі компоненти. це було застосовано багато десятиліть тому, наприклад, у системах космічного човника. останнім часом існують базові протоколи, розроблені для його використання, наприклад Paxos, які вирішують так звану проблему консенсусу . більш ґрунтовним прикладом є компанія Google, яка має безліч фірмових алгоритмів, щоб по суті побудувати свій суперкомп'ютер (и) з індивідуально ненадійних елементів у поєднанні з алгоритмами, стійкими до відмов.

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

  • Класичний аналіз паралелізму робить висновок, що існує близько 7 "основних" типів проблемних моделей, які розкладаються на особливі паралельні розбиття виконання. див . Пейзаж досліджень паралельних обчислень: Вид з Берклі

  • тут є деякий елемент відкритого теоретичного питання, що стосується ефективності роботи, що розглядається в більшості інших відповідей. питання про те, чи існують якісь проблеми, які "є за своєю суттю швидшими" паралельно, ніж послідовні, також відома як P =? NC проблема, де NC вважається класом "ефективно паралельних" алгоритмів, а P - "ефективним [послідовним] алгоритмами "


1
Я люблю цю відповідь! Я багато чого навчився з ваших прикладів: D
Бен Леджіеро

+1 для відмовостійкості в критичних для місії середовищах із випромінюванням, -1 за відсутності ковпачків та надмірності.
Cees Timmerman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.