1

В прошлом существовала так называемая гиперпоточность, когда одно ядро процессора работало как два ядра.

Но возможно ли объединить два ядра процессора в одно, чтобы повысить производительность программ, которые не используют многоядерные процессоры? (от старых игр до X Plane 11)

2 ответа2

3

Краткий ответ: Нет.

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

Так почему ты не можешь сделать обратное? Ну, просто представь. У вас есть два физических ядра, но только один процесс. Есть два возможных сценария:

  1. Выполнение кода может выполняться параллельно. В этом случае у вас будет только два потока, по одному на каждое ядро. Таким образом, оба потока могут работать одновременно.

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

Это неудачный недостаток многоядерных систем; вы видите увеличение производительности только тогда, когда приложение может выполнять несколько задач параллельно и написано для этого. Даже в этом случае усиление не прямо пропорционально количеству ядер (см . Закон Амдала).

2

Нет, не совсем

Вам придется распараллеливать инструкции любым способом, и многие из них зависят от результатов других инструкций [1]. В дополнение к этому, арифметическая единица (мозг, который действительно вычисляет) обычно не является узким местом.

Для доступа и вычисления данных они должны быть сохранены. Чтобы сделать это быстро, есть несколько уровней памяти (регистры, кэш (уровень 1,2,3), оперативная память). Два ядра (в процессоре x86) обычно разделяют только ОЗУ (и, возможно, кэш-память L3). Таким образом, вы не можете просто разделить программу, потому что другая половина будет иметь необходимые данные.

Как работает Hyperthreading

Гиперпоточность использует время, вычислительный блок ждет чего-то другого.

Загрузка значения из, например, ОЗУ занимает много времени (AFAIK где-то около 500 циклов ЦП). В это время, когда арифметическое устройство обычно ничего не делает, Hyperthreading запускает второй процесс на том же ядре.

[1] Это также точка, где спекулятивное исполнение пытается помочь. И, возможно, создать некоторые дыры в безопасности

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .