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


12

Название говорит само за себя: есть ли способ получить более старую программу, предназначенную для использования одного ядра ЦП для использования нескольких ядер ЦП?


13
Нет не возможно
Моав

5
Если бы это было так просто ...
Брендан Лонг,

1
Что если бы существовала программа, которая «эмулировала» процессор (например, vm?), Но взяла ваш многоядерный процессор и эмулировала одноядерный процессор с гораздо большей вычислительной мощностью на поток? Это возможно?
schizoid04

Кто будет управлять синхронизацией между несколькими потоками, потому что порядок имеет значение.
user36582

Ответы:


16

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


19
Стоит также отметить, что некоторые приложения просто не могут быть переписаны с учетом нескольких ядер. Это в основном зависит от того, насколько распараллелен процесс. Простым примером непараллелизуемого процесса может быть репродукция человека: одна женщина может родить одного ребенка за 9 месяцев. Девять женщин могут сделать 9 детей за 9 месяцев, но вы не можете использовать 9 женщин, чтобы родить одного ребенка за один месяц.
AndrejaKo

1
В принципе, можно написать программу для анализа другой программы и попытки ее распараллеливания. Тем не менее, даже очень ограниченные «легкие» версии этой проблемы генерируют докторскую степень. диссертации за последние пару поколений и прогресс был медленным. Полная проблема вполне может быть ИИ-полной.
dmckee --- котенок экс-модератора

Отлично, спасибо вам всем, вы привели меня в ярость из-за вашего примера «Женщины и рождение», особенно когда вы говорите о производстве: D
Крис

Что делать, если в программе есть куча независимых математических операций, которые позже используются для друг друга? Может быть, второй поток может разобрать программу, хм, я не знаю, что я говорю. Если поток может анализировать сборку .. «Выполните дорогостоящую операцию здесь, затем выполните вторую дорогостоящую операцию с этим, которая не затрагивает первую дорогостоящую операцию». Хорошо, я положу одну дорогую операцию на один поток, одну на другой, затем синхронизирую их назад в основной поток. Я предполагаю, что целая программа должна была бы быть предварительно проанализирована, чтобы идентифицировать независимые дорогостоящие операции.
CausingUnderflowsEverywhere

13

Какова ваша цель с этим? Увеличение производительности? К сожалению, приложения, предназначенные для использования только 1 ядра, не будут использовать больше. Вот о чем этот разговор о «многопоточных» приложениях.


2

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

Второй метод - бинарный перевод. Хотя это можно считать «переписыванием приложения», это делается программным обеспечением и без доступа к исходному коду. Создание параллелизма на уровне потоков, по-видимому, не было главной целью большинства исследований и разработок с использованием бинарной трансляции (что часто касается запуска унаследованного кода на другом ISA, использования расширений ISA или оптимизации для конкретной микроархитектуры и использования динамической информации для обеспечения более высокой производительности). качественная профильная оптимизация), но потенциал очевиден.

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

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.