windows-processor-cores-optimize.jpg
Самым первым процессором от Intel можно считать 4004 — он вышел в 1971 году и имел частоту всего 740 кГц. Частоты тогда росли достаточно быстро — уже в 1989 году появился процессор i486 с частотой больше 100 МГц, а Pentium 3 в 2000 году взял планку в 1 ГГц. Но с того времени рост частоты резко замедлился: сейчас, в 2017 году, самые топовые решения от Intel имеют частоту всего около 4-4.5 ГГц, разгон позволяет взять 5 ГГц. То есть за 17 лет частоты выросли всего в 5 раз, когда с 1971 по 1989 год, за почти то же время, рост частоты составил два порядка.  

Тепловыделение

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

Теперь же залезем немного в физику: Q ~ V2F, где Q это тепловыделение процессора, V — напряжение на нем, а F — его частота. Теперь нужно связать между собой частоту процессора и напряжение на нем. Процессор состоит из огромного числа транзисторов, которые по сути являются переключателями: для того, чтобы он переключился, нужно накопить определенный заряд, а его время накопления пропорционально току, который, в свою очередь, пропорционален напряжению. А вот частота процессора напрямую связана со временем скорости переключения транзистора, отсюда мы получаем, что F ~ V, и, подставляя это в пропорцию для Q, мы получаем, что Q ~ F3! То есть, иными словами, если мы имеем процессор с частотой в 4 ГГц и тепловыделением около 100 Вт, при его разгоне до 8 ГГц от него нужно будет отвести аж 800 Вт тепла — сделать это можно только с помощью интенсивного охлаждения жидким азотом, и, разумеется, ни о каком домашнем использовании речи тут не идет. 

Отсюда же кстати хорошо виден потолок в разгоне в виде 5 ГГц — при росте частоты на 25% мы получаем рост тепловыделения в 1.253 = 2 раза, то есть тепловыделение процессора будет порядка 200 Вт — почти предел в домашних условиях.

Оптимизация конвейера

Как видно, повышать частоты в лоб — плохая идея. Но может тогда имеет смысл заняться оптимизацией конвейера? Суть конвейера состоит в том, что исполнение каждой инструкции (операции) разбивается на несколько стадий, причем каждая стадия выполняется на отдельном вычислительном блоке процессора. Как только одна стадия была сделана — освободившийся блок может начать выполнять аналогичную стадию, но уже другой инструкции. В идеале это выглядит так:
1.png
То есть, как видно, к четвертому такту (отрезку времени) на конвейере будет выполняться одновременно уже 4 инструкции. Однако это — идеальный случай. Проблема в том, что каждая стадия выполняется за свое время, и так как размер такта всегда постоянен и привязывается к времени выполнения самой долгой стадии, то получается, что в какие-то моменты времени конвейер будет просто простаивать (красное — время простоя):
2.png

Тогда в голову приходит простая мысль — почему бы не привязать время такта к времени выполнения самой короткой стадии, и тогда более длинные будут просто дробиться на несколько тактов, и большая часть простоев уйдет. Увы — идея хорошая, но вот на деле это ничего не даст.

Разберем случай как на картинке выше: стадии 1, 3 и 4 одинаковые по длине и вдвое короче стадии 2. То есть время такта сократим вдвое — это же приведет к росту частоты процессора так же вдвое: к примеру, время выполнение 1 такта на процессоре с частотой 4 ГГц занимает 1/4 ГГц = 250 пс. Если мы уменьшим такт вдвое, до 125 пс, то мы получим частоту 1/125 пс = 8 ГГц. Однако на деле производительность процессора не возрастет — простои все так же будут, и в том же количестве:
2.png
Так что в итоге наш гипотетический процессор с длиной такта 125 пс не будет работать быстрее процессора с длиной такта 250 пс. 

Еще одна хорошая идея — это взять самую длинную стадию и разделить на несколько более мелких, тем самым сократив время такта, а значит подняв частоту. Звучит здраво, более того — это уже многократно делали, и уже почти зашли в тупик. Ну и вторая проблема — зачастую бывает так, что длинная стадия «цепляется» за несколько предыдущих. Выглядит это так: к примеру, у нас есть три операции:
  1. A + B = X
  2. C + D = Y
  3. X*Y = Z
Наша цель — получить Z, зная A, B, C и D. Первые две операции сложения делаются быстро, а вот третья стадия, умножение, достаточно долгая — ее неплохо было бы разбить. Но вот загвоздка — X и Y считаются на предыдущих стадиях, и пока они не посчитаются — разбить третью стадию увы никак нельзя. И такое при вычислении на процессоре встречается постоянно, и поэтому зачастую длинные стадии тормозят весь процесс, и ничего с этим не сделать.

Уменьшение техпроцесса

Раз мы не можем никак ни уменьшить стадии, ни толком увеличить частоту, остается только одно — уменьшать сам размер процессора. Тут все просто — электрические импульсы распространяются с одной фиксированной скоростью (равной скорости света в вакууме), и если мы уменьшим расстояние, которое импульс должен пройти — мы уменьшим затраченное на это время, и соответственно увеличим количество операций, которое сможет сделать процессор за то же время. И тут нас опять же останавливает физика — уменьшать техпроцесс вечно нельзя, предел для кремниевого транзистора — несколько нанометров. И чем ближе мы к пределу, чем труднее производство — к примеру, техпроцесс в 14 нм Intel «взяла» с опозданием почти в 2 года (и то сначала вышли низкочастотные кристаллы для мобильной техники). С 10 нм все еще хуже — пока что такую планку взяли только некоторые ARM-процессоры, Intel и AMD от этого еще достаточно далеки. 

Итог

Как видно, проблем увеличить частоту хотя бы еще вдвое — масса. Поэтому пока что производители остановились на нескольких гигагерцах, и стали расти «вширь» — уже давно никого не удивишь двухядерным процессором, совсем недавно AMD выпустила относительно дешевый пользовательский восьмиядерный CPU, а Intel через несколько дней должна представить аж двенадцатиядерные пользовательские процессоры! Однако и тут проблем хватает — далеко не все задачи можно распараллелить, но это, впрочем, уже материал для другой статьи.