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


12

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


13
Ні, не можливо.
Моаб

5
Якби це було так просто ..
Брендан Лонг

1
Що робити, якщо була програма, яка "емулявала" процесор (як, можливо, vm?), Але взяла ваш багатоядерний процесор і емулювала одноядерний процесор із значно більшою потужністю процесора на потік? Це можливо?
schizoid04

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

Відповіді:


16

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


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

1
В принципі, можна написати програму для аналізу іншої програми та спробувати паралелізувати її. Однак, навіть дуже обмежені "легкі" версії цієї проблеми породжують доктор наук. дисертацій за останні пару поколінь і прогрес був повільним. Повна проблема може бути цілком AI-повною.
dmckee --- кошеня колишнього модератора

Чудово, дякую всім, ви змусили мене поспілкуватися зі своїм прикладом «Жінки та народження», особливо коли ви говорите про виробництво: D
Кріс

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

13

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


2

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

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

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

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


0

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

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