Почему бы не сделать одно большое ядро ​​процессора? [закрыто]


25

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

Игры, например, почти никогда не используют более четырех ядер. Научные и инженерные моделирования, такие как Ansys или Fluent, оцениваются в зависимости от того, сколько ядер у ПК, на котором он работает, поэтому вы платите больше, потому что у вас больше ядер, но выгода от большего количества ядер становится действительно плохой после 16 ядер, но у вас есть эти 64 ядра рабочие станции ... это пустая трата денег и энергии. Лучше купить обогреватель мощностью 1500 Вт на зиму, намного дешевле.

Почему они не делают процессор с одним большим ядром?

Я думаю, что если бы они сделали одноядерный эквивалент восьмиъядерного процессора, то это одно ядро ​​увеличило бы IPC на 800%, так что вы получили бы полную производительность во всех программах, а не только в тех, которые оптимизированы для нескольких ядер. Больше IPC повсеместно повышает производительность, это надежный и простой способ повысить производительность. Несколько ядер увеличивают производительность только в ограниченном количестве программ, а масштабирование ужасно и ненадежно.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат . Любые сделанные выводы следует отредактировать обратно в вопрос и / или любой ответ (ы).
Дэйв Твид

Вы можете быть заинтересованы в этой статье: gotw.ca/publications/concurrency-ddj.htm
lvella

«но польза от большего количества ядер становится действительно плохой после 16 ядер» Вы, очевидно, не знаете, о чем говорите. Поверьте мне, я работал над процессами, которые работают на нескольких десятках тысяч процессоров. Существует целый класс проблем, называемый «смущающе распараллеливаемым», в котором использование большего количества ядер работает очень хорошо.
Арон

Ответы:


93

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

Чтобы заставить процессор делать больше, вы должны планировать, что делать дальше. Есть действительно три варианта:

  1. Заставьте ядро ​​работать на более высокой тактовой частоте . Проблема в том, что мы уже сталкиваемся с ограничениями того, что мы можем сделать.

    Потребление энергии и, следовательно, тепловыделение увеличивается с частотой - если вы удваиваете частоту, вы номинально удваиваете рассеиваемую мощность. Если вы увеличиваете напряжение, рассеиваемая мощность увеличивается с квадратом напряжения.

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

    Мы также ограничены внешним оборудованием - в основном, оперативной памятью. Чтобы ускорить ЦП, необходимо увеличить пропускную способность памяти, либо ускорив его работу, либо увеличив ширину шины данных.


  1. Добавление более сложных инструкций - вместо того, чтобы работать быстрее, мы можем добавить более богатый набор инструкций - обычные задачи, такие как шифрование и т. Д., Могут быть усилены в кремнии. Вместо того чтобы использовать много тактов для расчета в программном обеспечении, мы используем аппаратное ускорение.

    Это уже делается на процессорах Complex Instruction Set (CISC). Смотрите такие вещи, как SSE2, SSE3. Сегодня одноядерное ядро ​​гораздо мощнее, чем ядро ​​10 лет назад, даже если оно работает на той же тактовой частоте.

    Проблема в том, что, добавляя более сложные инструкции, вы добавляете больше сложности и увеличиваете размер чипа. Как прямой результат, процессор становится медленнее - достижимые тактовые частоты падают по мере увеличения задержек распространения.

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

    Вы также можете увеличить ширину шины данных, чтобы обрабатывать больше данных одновременно, однако, опять же, это увеличивает объем ЦП, и вы получаете компромисс между пропускной способностью, получаемой от больших шин данных, и снижением тактовой частоты. Если у вас есть только небольшие данные (например, 32-разрядные целые числа), то наличие 256-разрядного процессора на самом деле вам не поможет.


  1. Сделайте процессор более параллельным - вместо того, чтобы пытаться сделать что-то быстрее, вместо этого делайте несколько вещей одновременно. Если задача, которую вы выполняете, пригодна для одновременного выполнения нескольких задач, то вам нужен либо один ЦП, который может выполнять несколько вычислений для каждой инструкции (одна команда с несколькими данными (SIMD)), либо иметь несколько ЦП, каждый из которых может выполнять один расчет.

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

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

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


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат . Любые сделанные выводы следует отредактировать обратно в вопрос и / или любой ответ (ы).
Дэйв Твид

Один из моментов, поднятых в комментариях, которые еще не были рассмотрены, заключается в том, что процессоры могут быть параллельными, выполняя несколько инструкций за такт (Superscalar). Это ортогонально SIMD и частоте; количество команд за такт (IPC) является третьим фактором фактической пропускной способности за время. Все современные процессоры для интерактивных рабочих нагрузок имеют ширину не менее двух.
Питер Кордес

1
Для более точного ответа прочитайте sciencedirect.com/topics/computer-science/…
Тони Стюарт Sunnyskyguy EE75

37

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

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

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

И дефекты не редкость. Идеально создать эти миллиарды транзисторов - непростая задача. Если у вас нет возможности выборочно использовать части данного чипа, цена результата будет расти очень быстро.

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


4
Если / когда выходы улучшаются и производят более полнофункциональные микросхемы, чем требует рынок, поставщики обычно начинают использовать некоторые ядра / кэш-память и / или разбивать их на более низкие частоты, вместо того, чтобы корректировать структуру цен, чтобы сделать Конечные фишки относительно дешевле. С помощью графических процессоров / видеокарт вы имели возможность разблокировать отключенные шейдерные блоки на некоторых картах с помощью хакерской прошивки, чтобы увидеть, повезло ли вам, и получили карту, где они были отключены только для сегментации рынка, а не для реальных дефектов.
Питер Кордес

4
Intel выпустила двухъядерные матрицы для некоторых своих чипов. Из-за того, что все мобильные SKU ULV (сверхнизкого напряжения) были двухъядерными, было недостаточно дефектных четырехъядерных процессоров, а меньшая площадь кристалла (особенно с урезанным iGPU) дает больше рабочих двухъядерных чипов на каждую пластину чем сливаться с четырехъядерным ядром умирает. en.wikichip.org/wiki/intel/microarchitectures/… имеет готовые снимки двухъядерной графической системы Sandybridge размером 131 мм² + графика GT1 против двухъядерной 149 мм² + графика GT2 + 216 мм² quad + GT2. Есть еще место для дефектов в кэше и т. Д.
Питер Кордес

И (некоторые) дефекты в части устройства FMA, по-видимому, могут быть устранены путем объединения их и продажи в виде чипа Celeron или Pentium (без AVX, поэтому только 128-битные векторы). Даже современные чипы Skylake или Coffee Lake Pentium не имеют AVX , Блоки SIMD FMA составляют приличную долю ядра (и выполняют множество операций SIMD, кроме математики FP, включая целочисленное муль и целочисленное смещение), поэтому я не удивлюсь, если 2x 256-битные блоки FMA можно отобразить на 2x 128-бит, используя те 2 блока, которые еще работают. В Skylake Xeon есть даже SKU с пониженной пропускной способностью AVX512 FMA (только 1 рабочий 512-битный FMA)
Питер Кордес

@PeterCordes Если доходность так хороша, то поставщики будут выпускать проекты с более высокой плотностью и / или более высокой тактовой частотой (и, следовательно, более высокой частотой дефектов), пока коэффициенты дефектов не вернутся туда, где они смогут отключить ядра и / или тактовые частоты чипов. продать со скидкой ..
Монти Хардер

@MontyHarder: Это правда, но проверка стоит денег и времени, и существующие производственные линии будут некоторое время создавать существующие проекты. Но да, некоторые примеры Intel, о которых вы говорите, - это Haswell Refresh и различные усовершенствования Skylake, в основном без архитектурных изменений и незначительных улучшений их 14-нм процесса. (Иногда с новым iGPU). например, Kaby Lake, Coffee Lake и т. д. в качестве шагов «оптимизации» в обычной тактовой последовательности Intel.
Питер Кордес

26

Зависимость данных

Довольно просто добавить больше инструкций за такт, сделав чип «шире» - это был «SIMD» подход. Проблема в том, что это не помогает большинству случаев использования.

Существует примерно два типа рабочей нагрузки, независимая и зависимая. Примером независимой рабочей нагрузки может быть «приведение двух последовательностей чисел A1, A2, A3 ... и B1, B2, ... и т. Д., Вычисление (A1 + B1) и (A2 + B2) и т. Д.» Этот вид рабочей нагрузки наблюдается в компьютерной графике, обработке звука, машинном обучении и так далее. Довольно много этого было уделено графическим процессорам, которые специально разработаны для этого.

Зависимая рабочая нагрузка может быть такой: «Учитывая A, добавьте к ней 5 и найдите это в таблице. Возьмите результат и добавьте 16 к нему. Найдите это в другой таблице».

Преимущество независимой рабочей нагрузки состоит в том, что она может быть разбита на множество различных частей, поэтому в этом помогает большее количество транзисторов. Для зависимых рабочих нагрузок это совсем не помогает - большее количество транзисторов может только замедлить работу . Если вам нужно получить значение из памяти, это катастрофа для скорости. Сигнал должен быть отправлен через материнскую плату со скоростью, превышающей скорость света, DRAM должен зарядить ряд и дождаться результата, а затем отправить его обратно. Это занимает десятки наносекунд. Затем, выполнив несложный расчет, вы должны отослать к следующему.

Управление энергопотреблением

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

Переписывание программного обеспечения - единственный путь вперед

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


2
Цитата, необходимая для «не может запустить все ядра одновременно». Если только вы не рассматриваете максимальную тактовую частоту одноядерного процессора как «реальную» тактовую частоту процессора. В классическом смысле (до того, как мы достигли стены питания, а тактовая частота была ограничена критическими задержками распространения пути), да, это так, но в современном мире имеет больше смысла смотреть на базовую тактовую частоту как на то, что может поддерживаться всеми Основные активные рабочие тяжелые нагрузки. Все, что выше, - это соус, который вы можете использовать по мере возможности, если это позволяют ограничения мощности / температуры. (например, Intel's Turbo).
Питер Кордес

1
Но с точки зрения мощности, даже максимальная тактовая частота одного ядра ограничена тепловыми характеристиками больше, чем задержки распространения (хотя, вероятно, границы ступеней трубопровода выбраны, так что вы близки к этому пределу при целевом максимальном турбо). И напряжение тоже переменное: хуже мощность, но меньше задержка затвора. Так или иначе, не имеет смысла рассматривать одноядерный Max Turbo как нечто, на что вы «должны» иметь возможность работать со всеми ядрами, потому что этот предел уже зависит от мощности.
Питер Кордес

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

Да, мы бы все взяли 8-кратную однопоточную производительность вместо 8-ядерного процессора, если бы могли. (С помощью SMT, чтобы он мог запускать естественно-отдельные рабочие нагрузки без издержек на переключение контекста. См. Мой ответ. :) Гипотетическое сверхширокое ядро, вероятно, могло бы работать быстрее, когда рабочая нагрузка вызвала много остановок, вместо того, чтобы сохранять все транзисторы SIMD FMA включаются и переключаются каждые часы. (Электростанция в одном ядре также является ключом к тому, чтобы не таять на высоких часах; en.wikipedia.org/wiki/Dark_silicon ). Так что наличие единого широкого ядра не изменило бы это.
Питер Кордес

Хотя у вас есть точка зрения, что однопоточная производительность, которую мы видим на современных процессорах, лучше, чем если бы они были ограничены тактовой частотой, которую они могли бы поддерживать на всех ядрах одновременно, даже при наихудшей рабочей нагрузке. т.е. Turbo является ключевым, особенно для деталей с низким TDP, таких как чипы для ноутбуков ( Почему мой процессор не поддерживает пиковую производительность в HPC ): обычно большое соотношение между базовой и максимальной скоростью Turbo, в отличие от настольных чипов с высоким энергопотреблением, но с небольшим количеством ядер Например, i7-6700k Skylake имеет базовую частоту 4 ГГц, одноядерный Turbo с частотой 4,2 ГГц (без разгона; возможно повышение с TDP до 95 Вт).
Питер Кордес

20

Возвращаясь во времени, процессоры не могли работать так быстро. В результате, если вы хотите больше обрабатывать, вам нужно больше процессоров. Это может быть с математическим сопроцессором, или это может быть просто с более того же процессора. Лучшим примером этого является Inmos Transputer из 80-х, который был специально разработан для массовой параллельной обработки с несколькими процессорами, соединенными вместе. Вся концепция основывалась на предположении, что нет лучшего способа увеличить вычислительную мощность, чем добавить процессоры.

Беда в том, что это предположение было (временно) неверным. Вы также можете получить больше вычислительной мощности, заставив один процессор выполнять больше вычислений. Intel и AMD нашли способы поднять тактовые частоты еще выше, и, как вы говорите, проще хранить все на одном процессоре. Результатом стало то, что до середины 2000-х годов на рынке находился быстрый одноядерный процессор. Inmos умер в начале 90-х, и весь их опыт умер вместе с ними.

Хорошие времена должны были закончиться все же. Как только тактовые частоты достигли ГГц, действительно не было возможности идти дальше. И обратно мы снова перешли на несколько ядер. Если вы действительно не можете получить быстрее, больше ядер - это ответ. Однако, как вы говорите, не всегда легко эффективно использовать эти ядра. В наши дни мы намного лучше, но нам еще далеко, чтобы сделать это так же легко, как это сделал Transputer.

Конечно, есть и другие варианты улучшения - вместо этого вы можете быть более эффективными. SIMD и аналогичные наборы инструкций позволяют выполнять больше операций за одинаковое количество тактов. DDR быстрее доставляет ваши данные в процессор и из него. Это все помогает. Но когда дело доходит до обработки, мы снова возвращаемся к 80-м и к множеству ядер.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат . Любые сделанные выводы следует отредактировать обратно в вопрос и / или любой ответ (ы).
Дэйв Твид

20

Хороший вопрос или хотя бы один с интересным ответом. Часть этого ответа отображает мир, в котором процессоры могут эффективно масштабироваться по ширине, а не с несколькими отдельными ядрами. Лицензирование / цена модели будут другими!

Остальное объясняет, почему они не могут. Резюме:

  • Стоимость нескольких ядер масштабируется близко к линейному
  • Затраты на расширение суперскалярного конвейера 1 ядра масштабируются ~ квадратично. Это выполнимо при достаточно грубой силе, в любом случае, до некоторой точки. Однопоточная производительность очень важна для интерактивного использования (важна сквозная задержка, а не только пропускная способность), поэтому современные высокопроизводительные высокопроизводительные центральные процессоры платят эту цену. например, Skylake (4 в ширину), Ryzen (5 или 6 в ширину) и Apple A12 (7 в ширину для больших ядер, 3 в ширину для небольших энергоэффективных ядер)
  • Серьезное снижение IPC возвращается от простого расширения конвейера за пределы 3 или 4 в ширину, даже с неупорядоченным выполнением, чтобы найти ILP . Пропуски веток и кешей трудны, и все равно останавливают весь конвейер.
  • Вы не упомянули частоту, просто IPC, но масштабирование тоже сложно. Более высокая частота требует более высокого напряжения, поэтому мощность зависит^1 от частоты в кубе : непосредственно от частоты и ^2от напряжения. (Конденсатор хранит энергию в масштабе V ^ 2, и большая часть динамической мощности за пределами тока утечки поступает от накачки заряда в емкостную нагрузку затворов + проводов FET.)

    Производительность = частота умножения IPC. (В рамках той же архитектуры. Более широкая SIMD позволяет выполнять ту же работу с меньшим количеством инструкций, а некоторые ISA более плотные, чем другие, например, MIPS часто требует больше инструкций для выполнения той же работы, чем x86 или AArch64.)

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

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

Если бы одно ядро ​​могло масштабироваться так эффективно, как вы хотели, у нас были бы системы с 1 физическим ядром на сокет и SMT (например, HyperThreading), чтобы они могли работать как несколько логических ядер. Типичные настольные компьютеры / ноутбуки имеют только одно физическое ядро, и мы не будем пытаться распараллелить вещи, которые не масштабируются линейно, с большим количеством ядер. например, make -j4чтобы использовать преимущества серверов с несколькими сокетами и / или скрыть задержку ввода-вывода на рабочем столе. (Или, может быть, мы все же попытались бы распараллелить много, если бы ширина конвейера легко масштабировалась, а IPC - нет, поэтому нам пришлось использовать больше потоков SMT.) Ядро вашей ОС все равно должно было бы работать на всех логических ядрах, если только не процессор Представления SMT для ОС сильно отличались, поэтому параллельные алгоритмы планирования и блокировки все равно были бы там необходимы.


Дональд Кнут сказал в интервью 2008 года

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

Да, если бы у нас были чудесные одноядерные процессоры с 8-кратной пропускной способностью в реальных программах , мы, вероятно, все равно использовали бы их. С системами с двумя сокетами, только когда стоило платить гораздо больше за большую пропускную способность (не однопоточную производительность).

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

Физически это будет одно ядро ​​(для простой иерархии кеша без межсоединений между ядрами), но поддерживающее SMT (например, Intel HyperThreading), чтобы программное обеспечение могло использовать его как 8 логических ядер, которые динамически конкурируют за пропускную способность. Или когда только 1 поток запущен / не остановлен, он получит полную выгоду.

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

Но, к сожалению, со стороны Кнута хочется думать, что многоядерные процессоры на этом этапе перестают быть чем-то особенным.


Однопоточное масштабирование производительности

Я думаю, что если бы они сделали 1-ядерный эквивалент 8-ядерного процессора, то это одно ядро ​​увеличило бы IPC на 800%, чтобы вы могли получить полную производительность во всех программах, а не только в тех, которые оптимизированы для нескольких ядер.

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

Даже если вы допустите увеличение частоты (поскольку реальный критерий - это работа в секунду, а не работа в такт), увеличение производительности даже в 2 раза быстрее будет огромной проблемой.

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

Смотрите современные микропроцессоры 90-минутный гид!

В частности, больше ядер или более широких ядер? раздел, для необходимого фона, чтобы понять этот ответ; все начинается с того, как работают конвейерные процессоры по порядку, а затем суперскалярно (несколько инструкций за такт). Затем объясняется, как мы достигли мощной стены прямо в эпоху P4, что привело к концу легкого масштабирования частоты, оставив в основном только IPC и выполнив больше работы по каждой инструкции (например, SIMD) в качестве пути продвижения вперед, даже с небольшими транзисторами.

Увеличение ширины конвейера (макс. Инструкций за такт) обычно масштабируется по ширине . Эта стоимость измеряется в области и / или мощности кристалла для более широкой параллельной проверки зависимостей (обнаружения опасности) и более широкого планировщика с нарушением порядка, чтобы найти готовые инструкции для выполнения. И больше портов для чтения / записи в вашем регистровом файле и кеше, если вы хотите запускать инструкции, отличные от nop. Особенно, если у вас есть 3-х входные инструкции, такие как FMA или add-with-carry (2 регистра + флаги).

Также уменьшается отдача IPC для расширения процессоров ; большинство рабочих нагрузок имеют ограниченный ILP (параллелизм на уровне команд) для использования процессорами, поэтому расширение ядра не увеличивает IPC (количество команд за такт), если IPC уже ограничен шириной меньше ядро по цепочкам зависимостей, пропаданиям веток, пропаданиям кэша или другим остановкам. Конечно, вы получите ускорение в некоторых развернутых циклах с независимыми итерациями, но это не то, на что большинство кода тратит большую часть своего времени. Команды сравнения / ветвления составляют 20% от совокупности команд в «типичном» коде IIRC. (Я думаю, что я прочитал числа от 15 до 25% для различных наборов данных.)

Кроме того, потеря кэша, которая останавливает все зависимые инструкции (а затем и все, когда емкость ROB достигнут) стоит дороже для более широкого ЦП. (Возможные издержки, связанные с отсутствием большего количества исполнительных блоков; больше потенциальной работы не выполняется.) Или пропуск ветки аналогичным образом вызывает пузырь.

Чтобы получить 8-кратный IPC, нам нужно как минимум 8-кратное улучшение точности предсказания ветвлений и частоты обращений к кешу . Но частота попаданий в кэш плохо масштабируется, когда объем кеша превышает определенный уровень для большинства рабочих нагрузок. И предварительная загрузка HW умна, но не может быть такой умной. И при 8-кратном IPC предикторам ветвлений необходимо производить в 8 раз больше прогнозов за цикл, а также делать их более точными.


Текущие методы построения процессоров исполнения не по порядку могут находить ILP только на коротких дистанциях . Например, размер ROB в Skylake равен 224 мопам в слитых доменах, а планировщик для неисполненных мопов - в 97 неиспользуемых доменах. См. Понимание влияния lfence на цикл с двумя длинными цепочками зависимостей, для увеличения длины для случая, когда размер планировщика является ограничивающим фактором при извлечении ILP из 2 длинных цепочек инструкций, если они становятся слишком длинными. И / или увидеть этот более общий и вводный ответ ).

Таким образом, поиск ILP между двумя отдельными длинными циклами - это не то, что мы можем сделать с помощью оборудования. В некоторых случаях возможна динамическая бинарная перекомпиляция для объединения циклов, но сложная и не очень полезная для процессоров, если они не пойдут по пути Transmeta Crusoe. (слой эмуляции x86 поверх другого внутреннего ISA; в этом случае VLIW). Но стандартные современные конструкции x86 с кэшем UOP и мощными декодерами нелегко превзойти для большинства кода.

А вне x86 все ISA, которые все еще используются, относительно легко декодируются, поэтому нет никакой мотивации для динамической перекомпиляции, кроме как для оптимизации на большие расстояния. TL: DR: надежда на магические компиляторы, которые могут предоставить больше ILP аппаратному обеспечению, не сработала для Itanium IA-64 , и вряд ли будет работать для сверхширокого ЦП для любой существующей ISA с последовательной моделью исполнения.


Если бы у вас был сверхширокий ЦП, вы бы определенно хотели, чтобы он поддерживал SMT, чтобы вы могли постоянно загружать его работой, запустив несколько потоков с низким ILP.

Поскольку Skylake в настоящее время имеет ширину 4 мопа (и обеспечивает реальный IPC от 2 до 3 мопов за такт, или даже ближе к 4 в высокопроизводительном коде), гипотетический 8-кратный ЦП будет иметь ширину 32!

Быть способным разделить это обратно на 8 или 16 логических ЦП, которые динамически распределяют эти ресурсы выполнения, было бы фантастическим: не остановленные потоки получают всю полосу пропускания внешнего интерфейса и пропускную способность бэкэнда.

Но с 8 отдельными ядрами, когда поток останавливается, нет ничего другого, чтобы поддерживать загруженные исполнительные блоки; другие темы не приносят пользы.

Выполнение часто прерывистое: оно останавливается в ожидании загрузки кэша, а затем, когда это происходит, многие параллельные инструкции могут использовать этот результат. С супершироким процессором этот всплеск может идти быстрее, и он действительно может помочь с SMT.


Но у нас не может быть волшебных сверхшироких процессоров

Таким образом, чтобы получить пропускную способность, мы вместо этого должны выставлять параллелизм аппаратным средствам в форме параллелизма на уровне потоков . Обычно компиляторы не очень хорошо знают, когда и как использовать потоки, за исключением простых случаев, таких как очень большие циклы. (OpenMP или gcc -ftree-parallelize-loops). Человеческий ум все еще требует переделки кода, чтобы эффективно выполнять полезную работу параллельно, потому что межпотоковое взаимодействие обходится дорого, как и запуск потоков.

TLP - это грубый параллелизм, в отличие от мелкозернистого ILP в пределах одного потока выполнения, который HW может использовать.


Процессоры, предназначенные для интерактивных рабочих нагрузок (такие как Intel / AMD x86 и высокопроизводительные ядра Apple / ARM AArch64), безусловно, способствуют снижению отдачи от масштабирования IPC, поскольку однопоточная производительность по-прежнему так важна, когда задержка имеет значение, а не только пропускная способность для массово параллельные проблемы.

Возможность одновременного запуска 8 копий игры со скоростью 15 кадров в секунду гораздо менее ценна, чем возможность запускать одну копию со скоростью 45 кадров в секунду. Производители процессоров знают об этом, и поэтому современные процессоры используют неупорядоченное выполнение, даже если это требует значительной мощности и площади. (Но графические процессоры этого не делают, потому что их рабочая нагрузка уже в основном параллельна).

Многоядерное аппаратное обеспечение Intel Xeon Phi (Knight's Landing / Knight's Mill) представляет собой интересный промежуточный пункт: очень ограниченное выполнение по порядку и SMT, чтобы ядра 2-ширины обеспечивались SIMD-инструкциями AVX512 для сокращения чисел. Ядра основаны на архитектуре Intel Silvermont с низким энергопотреблением. (Exec-out exec, но с небольшим окном переупорядочения, намного меньшим, чем у крупного семейства Sandybridge. И более узкий конвейер.)


Кстати, все это ортогонально SIMD. Выполнение большей работы по каждой инструкции всегда помогает, если это возможно для вашей проблемы.


Модели ценообразования

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

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

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


2
«запуск потока стоит дорого» - это не сложный факт; это артефакт обычных современных операционных систем.
MSalters

1
@MSalters И действительно, некоторые исследовательские проекты изучали, как здорово было бы отказаться от такого подхода. То же самое с «человеческим умом переделывать код» - есть способы написания кода, которые, естественно, легче распараллелить, они просто не были очень популярны в последние несколько десятилетий. Там , где они будут использоваться, как правило , вы можете увидеть массивное горизонтальное масштабирование при очень низкой стоимости; фактически до такой степени, что горизонтальное масштабирование начинает становиться намного дешевле, чем вертикальное во многих приложениях. Это просто означает, что вы не должны предоставлять разработчикам выбор - если обстоятельства заставляют его работать, он работает отлично: D
Луаан

11

Позвольте мне провести аналогию:

Если у вас есть обезьяна, которая печатает на пишущей машинке, и вы хотите, чтобы больше печатания было сделано, вы можете дать обезьяне кофе, печатать уроки и, возможно, создавать угрозы, чтобы заставить ее работать быстрее, но наступает момент, когда обезьяна будет печатать на максимальной мощности.

Поэтому, если вы хотите больше печатать, вам нужно больше обезьян.


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


7

Вы указываете, что во многих программах используется не более (x) ядер. Но это полностью ограничение, налагаемое разработчиками этого программного обеспечения. Домашние ПК с несколькими ядрами все еще являются новыми (иш), и разработка многопоточных программ также сложнее с традиционными API и языками.

Ваш ПК также не только запускает эту 1 программу. Он делает целый ряд других вещей, которые можно поместить на менее активные ядра, чтобы ваше основное программное обеспечение не прерывалось ими так сильно.

В настоящее время невозможно просто увеличить скорость одного ядра в соответствии с пропускной способностью 8 ядер. Больше скорости, вероятно, придет от новой архитектуры.

Поскольку все больше ядер доступно и API разработаны с таким предположением, программисты начнут использовать больше ядер. Предпринимаются усилия по упрощению создания многопоточных конструкций. Если бы вы задали этот вопрос через несколько лет, вы, вероятно, сказали бы: «Мои игры обычно используют только 32 ядра, так почему у моего процессора 256?».


3
Разница между 1 и несколькими ядрами огромна с точки зрения использования программного обеспечения. Большинство алгоритмов и программ являются последовательными. Например, Дональд Кнут сказал, что многоядерные процессоры выглядят так, как будто разработчики HW « пытаются переложить вину за будущую кончину закона Мура на разработчиков программного обеспечения, предоставив нам машины, которые работают быстрее только по нескольким ключевым показателям! »
Питер Кордес

К сожалению, еще никто не придумал, как заставить одно широкое / быстрое ядро ​​запускать однопоточную программу где-нибудь так быстро, как мы могли бы получить эффективно-параллельный код для работы с несколькими ядрами. Но, к счастью, разработчики ЦП понимают, что однопоточная производительность по-прежнему важна и делает каждое отдельное ядро ​​намного больше и мощнее, чем если бы они стремились к чистой пропускной способности при параллельных задачах. (Сравните Skylake (4 в ширину) или Ryzen (5 в ширину) с ядром Xeon Phi (Knight's Landing / Knight's Mill на основе Silvermont + AVX512) (2-шириной и ограниченным OoO exec)
Питер Кордес

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

1
Все правда, но исторически многоядерный был дороже. Не было много причин для разработки параллельных алгоритмов за пределами научных приложений. Существует много возможностей для распараллеливания, даже в алгоритмах, которые требуют в основном последовательного выполнения. Но IPC текущего поколения не велики, и их легко испортить. Что обычно приводит к ошибкам, которые действительно трудно найти и исправить. Конечно, процессор в 4 раза быстрее (но вы все равно хотели бы иметь несколько ядер).
Гекете

2
@PeterCordes Ну, большинство алгоритмов и программ не являются последовательными, потому что они должны быть, но в основном потому, что так было всегда (с добавлением «это был хороший компромисс»). Наиболее вопиющие случаи, когда вы можете просто запустить одну и ту же программу четыре раза на четырех отдельных рабочих нагрузках и запустить их параллельно без проблем. Но это сталкивается с другой проблемой - ЦП не является узким местом все это часто, и обычно обходной путь - использовать лучшие алгоритмы, а не больше ЦП. Иногда они помогают и с другими узкими местами (память, диск, сеть ...).
Луаан

3

Наиболее убедительной причиной с исторической точки зрения является рассеяние энергии .

После Pentium IV Intel попыталась создать процессор нового поколения с кодовым названием Tejas, который должен был работать в диапазоне от 4 ГГц до 12 ГГц. Проблема заключалась в том, что бег с такой скоростью генерировал слишком много тепла, чтобы быть жизнеспособным.

После того, как Tejas был отменен, Intel потребовалось еще 10–15 лет, прежде чем они, наконец, получили ядра с тактовой частотой 4 ГГц с приемлемым уровнем нагрева.

Смотри Теджас и Джейхок .

У Intel был еще один проект параллельно с Tejas, который включал использование нескольких ядер. В этом проекте были приемлемые уровни тепла, так что они пошли тем же путем. Это позволило им повысить производительность сейчас, а не ждать еще 10 лет для процессов изготовления 10 нм.

Если предположить, что ядра не испытывают недостатка ресурсов, то для получения одинакового количества инструкций в секунду от одного ядра вместо N ядер вам потребуется скорость выполнения инструкций для этого одного ядра в N раз быстрее. Динамическое рассеивание мощности ядра ЦП линейно пропорционально рабочей частоте. Он также пропорционален квадрату рабочего напряжения. Работа на более низких частотах позволяет использовать более низкие рабочие напряжения. Использование более низких напряжений на более низких частотах означает, что фактически выделяемое тепло снижается вместе с кубом рабочей частоты.

Крайним примером этого является человеческий мозг, который может выполнять эквивалент 2 ^ 18 операций в секунду, используя только 20 Вт мощности. Это достигается благодаря использованию миллиардов нейронов, работающих параллельно с частотой всего несколько сотен Гц.

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

Во всяком случае, рынок высокопроизводительных систем переходит к более параллельной обработке в виде ПЛИС. Недавно Intel купила Altera (второй по величине производитель FPGA) и теперь продает платы с аппаратным ускорителем FPGA. Программное обеспечение может загружать FPGA с изображением во время выполнения, используя вызов API. Затем процессор подает данные в FPGA и позволяет ему выполнять большую часть работы. Типы приложений - это обычно кодирование видео, AI, рендеринг, поиск в базе данных и т. Д.


Также имейте в виду, что на ПК обычно работают одновременно сотни или тысячи потоков. Нет, не работает . На современных настольных компьютерах существует множество потоков, но почти все они спят, ожидая ввода-вывода или таймера в любой момент времени. например, средняя загрузка (за последнюю минуту) на моем рабочем столе Linux в настоящее время составляет 0,19 задач, активно готовых использовать процессорное время в любой момент. Если бы я запускал кодирование видео, x264 запустил бы несколько потоков, которые ОС планировала бы на нескольких ядрах, но только на столько, сколько у меня есть логических ядер.
Питер Кордес

И между прочим, OP (по какой-то причине) полностью опустил частоту и спросил о масштабировании IPC (инструкций за такт), а не за секунду. То, что вы говорите, правда, но они предлагали сделать процессоры более широкими , а не тактовыми. Я уже говорил об этом в своем ответе, поэтому ваш ответ, объясняющий масштабирование мощности по частоте, является хорошим дополнением +1.
Питер Кордес

@PeterCordes Это правильно, я не имел в виду, что все потоки выполняются одновременно, конечно же, по очереди. Спасибо за разъяснение.
user4574

Ну, не столько «по очереди», сколько в том, что они вообще не готовы бегать вообще. Они в основном все спят, обычно просыпаются только для короткого всплеска вычислений, например, после того, как ОС выдает даже нажатие клавиш или чтение по сети, или пробуждает их, потому что таймер истек. Более двух человек редко бодрствуют одновременно, если вы на самом деле не занимаетесь чем-то вычислительным. И если да, то вы не запускаете сотни потоков, а запускаете несколько потоков ~ = количество доступных ядер.
Питер Кордес

2

Просто чтобы завершить картину того, где все это происходит ...

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

И, кроме того, в чем-то вроде игрового ПК производительность графической карты намного выше, чем у многоядерного процессора Intel или AMD.


2
Re: "... по сути, параллельный по массе" : Даже смущающе параллельный ?
Питер Мортенсен

1

По сути, потери CMOS экспоненциально (^ 1.5) пропорциональны частоте, а производительность параллельного ЦП несколько меньше, чем линейная, пропорциональна количеству ЦП.

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

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

Это не размер большего CPU, который делает его более быстрым для типичных приложений Intel / AMD для ПК, скорее это уменьшенный размер из-за литографического разрешения и более низкой емкости затвора, который уменьшает мощность наряду с уменьшенным подпороговым уровнем и напряжением ядра.

Улучшение не является линейным и не означает, что 8 ядер в 4 раза лучше, чем 2, но цель, если она достигнута, состоит в том, чтобы иметь больший динамический диапазон обработки с регулированием рассеивания мощности, скорости и напряжения для повышения как производительности, так и эффективности, а также пиковой мощности по требованию без чрезмерное повышение температуры.

Для более научного ответа прочитайте https://www.sciencedirect.com/topics/computer-science/dynamic-power-consump


-2

Многоядерные обычно не являются мультискалярными. И мультискалярные ядра не являются многоядерными.

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

Множество ядер инструкций дешевле и проще в управлении, поэтому плохая идея иметь мультискалярную архитектуру в несколько гигагерц.


1
Вы имеете в виду "суперскаляр", несколько инструкций за такт? Большинство многоядерных процессоров являются суперскалярными. например, Райзен 5-шириной. Высокопроизводительные чипы Apple от AArch64 имеют ширину 6 или 8. Существует много незатейливых плодов для процессора шириной 2, который можно использовать в большинстве кодов, поэтому стоит сделать каждое ядро ​​шириной не менее двух, прежде чем масштабировать до нескольких ядер, каждое из которых нуждается в собственном частном кеше, и в соединении между ядрами ( например, многоядерные вычислительные карты Intel Xeon Phi имеют много ядер с двумя выпусками). То же самое для ядер смартфонов: маленькие ядра имеют ширину не менее 2. Однопоточная производительность имеет значение!
Питер Кордес

1
Или вы имели в виду dl.acm.org/citation.cfm?id=224451 - исследовательский документ о том, что они называют «мультискалярными» ядрами, которые ищут ILP в более широких диапазонах в графе потока управления программы высокого уровня, используя комбинация HW и SW. Основные процессоры, которые мы используем в настольных ПК и смартфонах, не похожи на это, они просто обычные суперскалярные с неупорядоченным выполнением, реализуя последовательный ISA, который притворяется, что запускает инструкции по одному.
Питер Кордес

Спасибо. На самом деле, идея скалярной арки заключается в измерении тепла за известными или предопределенными наборами инструкций (случай AVX). <br/> Текущие вычисления в архитектуре и тепловыделение обдуманы не предсказуемо. это повышает вероятность того, что многоядерные системы могут работать на больших частотах, поскольку их способность работать в идеале времени / тепла не поддается вычислению. это все, что я знаю до сих пор. Я копаю векторные машины, чтобы понять физику "мультискаларов". Дело в том, что xeon / phy следуют идеальной тепловой кривой, как это делал древний процессор. повышение качества обслуживания клиентов
Мачтур

Наборы инструкций SIMD, такие как AVX, - это способ получить больше работы через конвейер без необходимости делать весь конвейер шире, только исполнительные блоки. Например, Skylake может выполнять 3 vpaddd ymm0, ymm1, ymm2инструкции за такт, каждая из которых выполняет 8 упакованных 32-разрядных целочисленных сложений. Таким образом, 24 целых числа добавляются за такт, но механизм выполнения не по порядку «только» должен отслеживать 3 инструкции в полете. Это гораздо дешевле построить, чем процессор, который может выполнять 24 add eax, edxинструкции за такт. SIMD в основном ортогонален ширине трубопровода.
Питер Кордес

Skylake - это хороший пример оптимизации за такт. Вариантов много, я не вхожу в них, и это интересные случаи внутренней оптимизации шины, так как Skylakes интегрируют исходную разгрузку Xeon в конвейер SIMD. Я предполагаю, что одно большое ядро ​​объединит разгрузку и вычисления за несколько циклов, как это делается (например, для феномена AVX). это способ, которым вычисление интегрируется вперед по сравнению с мощностью, необходимой для операций внутреннего блока. как противоположность нескольким коротким инструкциям, как в Gpu-like с несколькими «виртуальными» ядрами, похожими на дополнения к Nehalem
machtur
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.