Samara Portal Technology, Computers

Самарский портал "Технологии, компьютеры"

Галопом по вычислительным Европам. Часть 4. Как накормить процессор.

Итак, ее величество оперативная память

Когда-то давным-давно, когда компьютеры были большими — никакой другой памяти, кроме оперативной, у компьютеров не было. Всё, что им надо было знать, загружалось после включения с перфокарт в память, там обрабатывалось, результаты выводились на печать — и всё, компьютер можно было выключать. Спустя годы появились внутренние долговременные носители, которыми можно уже было управлять, получая доступ к нужным данным по мере работы программ. И вот тут уже есть тонкость. Какая? В принципе, ничто не мешает напрямую считывать каждый элемент данных с накопителя прямо в процессор, почему нет? Но скорость-то…? Скорость работы всех энергонезависимых накопителей до сих пор настолько ниже скоростей обработки в процессорах (так было и 60+ лет назад, задолго до появления у процессоров приставки «микро»), что такая схема убивает всю идею быстрых вычислений на корню. Поэтому очень быстро сложилась практика предварительной загрузки данных с медленных носителей в быструю оперативную память с тем, что чтобы потом уже в ней производить обработку.

И, конечно, быстродействие такой оперативной памяти и, разумеется, достаточный ее объем — являются критически важными[1] факторами производительности компьютеров. Исторически первой чисто электронной[2] памятью была память статическая, та самая, которая сегодня работает в кэшах процессоров. В плане архитектуры она красива и удобна. Никаких ограничений на повторные процедуры чтения и записи, фиксированные время выборки любого элемента массива, широкие возможности регулировки частоты работы (вплоть до прекращения тактирования и почти нулевого энергопотребления). Все хорошо? В принципе да — и статическая память начала свой победный марш по большим компьютерам. Почему по большим? Потому что в электрическом (схемотехническом) плане у статической памяти все не очень здорово. На каждый бит хранения нужно было шесть (в некоторых реализациях даже восемь) элементов, а каждый элемент потребляет энергию, особенно при перемене состояния ячейки. Т.е., статическая память при всех своих достоинствах получается сравнительно небольшой по объему, дорогой и горячей. Доходило до того, что уже тогда пришлось создавать иммерсионные (погружные) системы охлаждения, опуская платы с процессорными модулями и оперативной памятью в бак с циркулирующим теплоносителем (Cray-2). Больше, конечно, из-за процессоров, но и память тоже не отказывалась от купания.

Единственная известная мне попытка создать универсальный микропроцессор, созданный изначально в расчете на массовое пришествие статической памяти в качестве основной — Zilog Z380. Введя небольшой кэш в версии Z280, в версии Z380 компания Zilog[3] кэш убрала, предполагая его ненужность в чистой SRAM системе. Но с такими компьютерами не сложилось, Z380 не взлетел, оставшись нишевым вычислителем для спецприменений. Но хорошим.

Спасением стало появление памяти динамической, состоящей всего из двух элементов (транзистор + конденсатор), организация которой в виде регулярных блоков с небольшим количеством выводов позволяла изготавливать ее методами литографии с довольно высокой плотностью (дешево и много). Из перечисленных плюсов автоматически вытекают и минусы — конденсаторы утекают, так что блоки DRAM нужно периодически (а после операции чтения обязательно) взбадривать, прогоняя через массивы циклы подзарядки. С адресацией тоже не все гладко — читать такую память можно только целыми строками, выбирая уже потом из полученного массива нужные значения. Когда же нам потребуется соседнее значение — придется (а) подождать цикла регенерации этого блока и (б) снова отработать процедуру выборки. Это грустно… Но все смирились с этим недостатком DRAM, потому что ее за те же деньги (во всех смыслах) можно было иметь много.

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

Так что — да: лучше мегабайт DRAM чем несколько десятков килобайт SRAM (да-да-да, вот в этом месте мы вспомнили предыдущую главу про кэширование[4]). Но бывает и наоборот, конечно: очень интересный случай, связанный с использованием для создания кэша ячеек DRAM вместо SRAM описан в Приложении 4 «Обыкновенное чудо XBox 360».

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

Типы[5] оперативной памяти и достижимые ими параметры производительности

Галопом по вычислительным Европам. Часть 5. Память. Статья Ильи Вайцмана. 15.02.2023 г.

Все это касается, конечно, обычного исполнения памяти, в виде отдельно устанавливаемых модулей. Но есть и другой путь: интеграция DRAM внутрь процессоров. DRAM, как мы помним, хотя и медленнее, но упаковывается гораздо плотнее. В принципе, вместо 32 мегабайт SRAM кэша можно в то же количество транзисторов упаковать 128 MB DRAM. Как бы совместить плюшки обеих технологий? Про кэширование в статическую память я уже только что написал, а что бы такого можно еще придумать?

Настоящий рывок в технологиях оперативной памяти совершила компания AMD, придумавшая способ многослойной упаковки ячеек DRAM. Технология НВМ (high bandwidth memory) позволяет не только упаковать в кристаллы десятки гигабайт памяти, но и подключить ее (за счет минимальной длины проводников) по шине, с шириной до 4096 бит на сборку (8192 для HBMе2). Учитывая, что работает она прямо в процессоре (благо, и занимаемая площадь сократилась в 4-8 раз) и на его частоте — теоретический максимум для нее оценивается как 128 или 256 GB/s на каждый гигагерц частоты. Соответственно, 4 GHz процессор может получить от нее терабайт в секунду. А ведь модулей HBMе2 в корпусе процессора может быть несколько. Такой кэш четвертого уровня.

В чем засада? Из такой памяти нельзя выбрать «нужный байт», придется ради одного байта прочитать, как минимум килобайт (8192/8). Поэтому смысл в таких компонентах есть только в серверах, обрабатывающих данные терабайтами и в ускорителях для систем искусственного интеллекта, где скорость чтения массивов данных высокопараллельными системами важнее эффективности произвольной выборки.

Ну и цена у HBMe — как в долларах, так и в ваттах такая, что эта технология пока явно не для домашнего применения.

Как видите, с начала 90 годов прошлого века пропускная способность обычной системной памяти выросла более чем в 2000 (две тысячи, ага) раз. Но у памяти есть не только пропускная способность, не менее важным параметром является и латентность, величина задержки между возникновением запроса на стороне процессора и получением ответа. Складывается она из нескольких (не считая работы системы кэширования) факторов: времени работы контроллера памяти, времени передачи запроса к модулю памяти, времени ответа самой памяти и передачи данных обратно к процессору. Сами по себе модули памяти непрерывно совершенствуются, а что на другой стороне?

А на другой стороне у нас контроллер памяти. Когда-то (не так давно, кстати) контроллеры оперативной памяти размещались в специальной микросхеме, с которой процессор общался по своей специальной внешней шине. Процессор получался очень простым, и поначалу — на тех еще частотах — всех все устраивало. Проблемы начались, как и следовало ожидать, с появлением процессоров, внутренняя частота которых кратно превышала частоту внешней шины и, соответственно, частоту работы контроллера памяти. Ситуация ухудшалась с каждым очередным увеличением коэффициента умножения, а к концу XX века стало ясно, что уже надо что-то делать. И сделала этот шаг компания AMD в своем процессоре Athlon 64 (K8). Помимо того, что это был первый десктопный 64-разрядный процессор, он отличался от всех других интегрированным в ядро (и работавшим на частоте ядра) контроллером памяти. Эффект от этой интеграции был потрясающим. Само ядро в синтетических тестах уступало конкурентам от Intel, но на любой задаче, размер которой существенно превышал размер кэша (в смысле, активно использующей оперативную память) эти процессоры AMD обращались с конкурентами как пресловутый Тузик с грелкой. Снижение в несколько раз латентности памяти сократило простой ядра и увеличило реальную[6] производительность совершенно волшебным образом. На задачах же с большими массивами данных, да при использовании 64-разрядной обработки все выглядело еще круче.

Всё, счастье случилось? Да, но частично. Дело в том, что производительность ядер процессоров все равно росла гораздо быстрее, чем скорость памяти. Появление же многопоточных и многоядерных процессоров только обострило эту проблему, несмотря на увеличение кэшей и усложнение алгоритмов их работы. Решение было очевидным — и процессоры начали получать более одного канала памяти. Причем, помимо удвоения пропускной способности памяти можно получить интересный эффект: установив на два канала одинаковые модули памяти можно включить режим чередования, когда соседние адреса находятся попеременно в двух модулях памяти на разных каналах. Зачем? А вы помните, что из банка динамической памяти нельзя прочитать данные два раза подряд? Между процедурами чтения строки необходима пауза для регенерации заряда в ячейках. Используя же чередование, мы можем, прочитав строку — сразу же брать следующую, через другой канал памяти — а потом снова по первому каналу читать. Таким образом, в режиме чередования памяти мы получаем не только удвоение ПСП, но и снижение латентности памяти.

Кстати, помните: я обещал рассказать, как и почему падает IPC (и КПД) с ростом частот? Дело в том, что скорость ядра-то растет, а частота памяти (и ее пропускная способность) — нет. Соответственно, простой ядра в ожидании данных, выраженный в тактах, для процессора большей частоты получается больше. Что делать? Увеличивать размеры кэшей и количество каналов памяти, конечно.

И что теперь, дайте два четыре, восемь и более каналов? Хорошо, конечно, вот только и сам кристалл процессора не безразмерный, и разводка по материнской плате нескольких тысяч длинных высокочастотных проводников та еще задачка. Поэтому два — нормально, а вот четыре и более каналов памяти бывает только у серверных процессоров, которые и сами стоят пугающе, и материнские платы для них тоже недешевые. Но, конечно, для процессоров с многими десятками ядер сегодня и четыре канала памяти и восемь уже привычное[7] дело.

Продолжение следует…

[1]Памяти никогда не бывает много. Ее бывает «критически мало», «мало» и «ладно, пока достаточно».

[2]Полупостоянную память на ферритовых сердечниках упомяну только в сноске, хотя она до сих пор кое-где применяется, в первую очередь там, где от памяти нужна радиационная стойкость любой ценой.

[3]Вообще, история развития линейки процессоров компании Zilog удивительный пример сочетания интересных технических решений с опозданиями на рынок и маркетинговыми ошибками. После очень удачного, но вполне рядового Z80 компании не удалось добиться сопоставимого успеха ни с одним из последующих — и гораздо более совершенных микропроцессоров. Хотя в космос их радиационно-стойкие версии ZY180 все-таки полетели, потому что очень продвинутая система команд позволяла в разы уменьшить объем программы и, соответственно, необходимое количество долговременной и оперативной памяти.

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

[5]В табличке перечислены типы памяти, с которыми имели и имеют возможность столкнуться наиболее вероятные читатели. Рассказ о технологии ЕСС, о том что такое registred memory выходят за круг задач, которые я хотел решить в процессе написания работы. Опять же, отдельного рассказа и для другой аудитории заслуживают и специфические технологии, типа FB-DIMM, современные разработки в области дезагрегации вычислительных систем.

[6]Пока мощное ядро процессора Intel стоит и ожидает подгрузки данных из страдающей высокой латентностью RDRAM, ядро процессора Athlon 64 уже давно получило данные и обрабатывает их.

[7]Привычное не значит хорошее. Сейчас в мире больших мощностей активно продвигается идея дезагрегации памяти, перемещение оперативной памяти во внешние модули, подключенные по шине PCIe 5/6 в рамках концепции CXL. Оперативная память при этом может вообще, находиться в другом корпусе. Это позволяет обойти ограничения на количество модулей памяти на канале и на одной материнской плате. Конечно, за это приходится платить увеличением задержек, так что «родная» память на материнской плате превращается в своеобразный кэш относительно дезагрегированной памяти. Но и это не новость: давным-давно в мире PC уже существовала т. н. Expanded Memory, платы расширения (иногда со своими контроллерами и кэшированием), позволяющие установить в компьютер большие объемы памяти. Неплохо, конечно — но все упиралось в шину ISA с пропускной способностью 10 MB/s и несколькими лишними тактами задержки, что вместе с непростой адресацией делало эту память очень медленной относительно обычной. В общем, все то же самое.

Ссылки на все 10 статей цикла «Галопом по вычислительным Европам»:

Галопом по вычислительным Европам. Часть 1. Что такое процессор.

Галопом по вычислительным Европам. Часть 2. Пути повышения IPC.

Галопом по вычислительным Европам. Часть 3. Оптимизация.

Галопом по вычислительным Европам. Часть 4. Как накормить процессор.

Галопом по вычислительным Европам. Часть 5. Память.

Галопом по вычислительным Европам. Часть 6. Спецпроцессоры.

Галопом по вычислительным Европам. Часть 7. Ввод-вывод.

Галопом по вычислительным Европам. Часть 8. Хранение данных.

Галопом по вычислительным Европам. Часть 9. Параллельные миры и техпроцессы.

Галопом по вычислительным Европам. Часть 10. Китайский путь и персональная безопасность.

----

Куда движется розница?

Куда движется розница? Статья Владислава Боярова. 19.04.2024 г

Blood, Sweat & Tears, или Кровь, пот и слёзы – часть четвёртая

Blood, Sweat & Tears, или Кровь, пот и слёзы – часть четвёртая. Статья Владислава Боярова. 12.03.2024 г.

«КАТЮША» в «Пастернаке»: «КАТЮША»

«КАТЮША» в «Пастернаке»: «КАТЮША». Статья Владислава Боярова. 08.04.2024 г.

Pantum в Самаре: business as usual

Галопом по вычислительным Европам. Часть 10. Китайский путь и персональная безопасность.

Галопом по вычислительным Европам. Часть 10. Китайский путь и персональная безопасность. Статья Ильи Вайцмана. 11.12.2023 г.