Возможно ли объединить ядра процессора?

2077
Jonathan Irons

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

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

1
Короткий ответ, нет, это не возможно, насколько мне известно. Хотелось бы, чтобы тоже было, я страдаю от подобных проблем. LPChip 5 лет назад 2
Нет, если у вас нет действительно ** действительно ** *** действительно *** крошечного паяльника и твердой руки ... Tetsujin 5 лет назад 1
@ Tetsujin кто-то быстро отправит эту идею в Intel, а затем приготовит горючую лимону Jonathan Irons 5 лет назад 0
«Ядро» - это физически отличная часть системы; на очень грубом уровне наличие двух ядер на одном процессорном чипе примерно равнозначно наличию двух отдельных одноядерных чипов. С этой аналогией должно быть ясно, что вы не можете объединить их, dave 5 лет назад 4
@ Давай одну секунду, я кое-что понял. Программы на самом деле работают на потоках, так возможно ли разделить поток между двумя ядрами? Jonathan Irons 5 лет назад 0
«Поток» - это «поток выполнения», то есть ровно один процессор инструкций («ядро») выполняет поток инструкций в любой момент времени. Если вы хотите использовать два ядра, которые вам нужны (как минимум) две нити; это одна из причин изобретения потоков. dave 5 лет назад 2

2 ответа на вопрос

3
Quanten

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

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

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

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

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

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

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

3
Layne Bernardo

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

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

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

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

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

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

Похожие вопросы