Лекция 2 (2012-10-22)

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

Схема простейшего процессора

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

Соединим сумматоры посредством нескольких шин A[n:0], B[n:0], CarryOut, CarryIn, Result[n:0].

С этим чудесным функциональным устройством что-нибудь делать. Можно брать память и сумматор.

Из нескольких триггеров по фронту можно собрать аккумулятор (поставить их рядом и сказать «запоминайте значения»).

Тригер со сбросом — это обыкновенный триггер с срабатыванием по фронту, перед которым стоит ещё один триггер со срабатыванием по уровню с инвертированным клоком. Сохранили в момент перехода с нуля в единицу значение передаваемое на вход DI. Добавили Rst symbol. Когда ресет единица, или когда отрицание данных единица — мы сбрасываем. Сделали это через конъюнкцию с клоком.

v

http://faculty.kfupm.edu.sa/COE/ashraf/RichFilesTeaching/COE022_200/Chapter4_1_files/edge-triggered-ff.gif

Таким образом в счётчик, собранный из нескольких делителей частоты, можно добавить сигнал ресета.

Каким образом этим чудесным устройством можно пользоваться? Мы можем задать начальное значение в памяти. Делается различным образом. Так или иначе добавить какой-нибудь селектор и входы Write и DataInput. На каждом клоке получаем в аккумуляторе сумму аккумулятора и очередной ячейки памяти.

Очень круто, мы научились складывать ячейки памяти. Как остановиться? Останавливаем клок.

Не густо.

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

Из блоков counter data_memory Cmd_memory Sum Dec Accum Mux_n_to_2n можно собрать чудесный компьютер, который умеет суммировать и сохранять.

[схема]

Историческая справка

Есть процессор (CPU).

Есть чипсет, который на самом деле занимается вводом-выводом.

Есть контроллер памяти (MC — memory controller) и собственно память. Контроллер памяти может присутствовать как часть чипсета, может входить в него — это не принципиально, главное что они все друг с другом связаны.

Чипсет имеет некоторые интерфейсы ввода-вывода. На данный момент это PCI Express и всякое legacy. Начиная с Sandy Bridge PCI Express переехал в процессор. Туда же, начиная с Nehalem, переехал контроллер памяти, и в некоторых вариантах процессоров стало появляться встроенное видео.

В процессоре расположены функциональные устройства, выполняющие непосредственно некие операции и фронтенд. Фронтенд занимается, в частности, предсказанием и всяким таким. Результат работы функциональных устройств может попадать на архитектурные регистры, может сохраняться в памяти. В CISC архитектурах, в частности в х86, внутри процессора команда, которая ему попадает, обычно довольно сложная. То есть, например, «сложить ячейку по косвенной адресации с промежуточным числом или с регистром и потом куда нибудь сохранить».

Внутри процессора эта команда разбивается на несколько операций. У Intel они называются μ-оп. Такая организация появилась с Pentium Pro (P6).

А вот Pentium MMX базировался на предыдущей архитектуре P5. Это вариант развития архитектуры Pentium, там было два конвейера: u и v. Один из них мог почти всё (u), а в v конвейер был вспомогательный, и были сложные правила, какие операции на каком можно выполнять, какие можно выполнять одновременно. В Pentium MMX добавились регистры mm0..mm7. Кто не знает, регистры MMX замещают регистры FPU. В FPU имелось 8 регистров fp0..7 и набор команд, который позволяет с ними работать. Всё бы хорошо, но доступ к ним в виде стека и ширина у них 80 бит. MMX-регистры использовали младшие 64 бита fp регистров.

Pentium Pro была новая архитектура, в которой добавили много плюшек. В частности, разбитие на μ-опы и несколько декодеров. В Pentium II было 3 декодера, один из них кажется мог выполнять 3 μ-оп за такт, другие по 1. В Pentium III вроде было 4-1-1, в Core 4-2-2, в Nehalem вроде стало больше декодеров и вообще он претерпел большие изменения.

Вариант архитектуры P6:

http://upload.wikimedia.org/wikipedia/commons/thumb/b/be/P6_func_diag.png/400px-P6_func_diag.png

Вариант архитектуры Nehalem:

http://upload.wikimedia.org/wikipedia/commons/6/64/Intel_Nehalem_arch.svg

NetBurst (Pentium 4) сейчас не затрагивали, потому что он имеет достаточно сильно отличающуюся архитектуру от ранее упомянутых, и , как показала практика, архитектура была не очень удачная, хотя были бешеные гигагерцы — быстро появились 2, 3 ГГц, но гнать дальше было невозможно из-за слишком длинных конвейеров, слишком большой ошибки предсказания, и так далее.

Тогда же AMD выпустило версию в K10 с интеграцией контроллера памяти в процессор, а не в чипсет, тогда же они сменили впервые за долгое время сокет.

Функциональные устройства на самом деле называются бэкенд. Это все обмазано некоторым количеством кэшей. На фронтенде имеется кэш команд. L1 появился в x86, L2 в Pentium II—Pentium Pro. У AMD начиная с P6.

У x86 есть проблемы с декодингом (разбором) команд, поэтому достаточно существенную часть по площади от логики фронтенда занимает разбор команд.

Volatile memory (энергозависимая память) из той, что обычно используется, есть примерно 3 типа:

Общая идея заключается в том, что если двигаться от триггеров к DRAM, то тратится меньше логики для хранения одного бита, меньше энергопотребление, но менее удобно. Например, DRAM надо обновлять(«рефрешить»), доступ к ней медленный — сотни тактов, и вытаскивать оттуда надо сразу по 32-64-128 битов. В DRAM выходит около 1 транзистора на 1 бит.

IO

Ввод-вывод, на самом деле, практически повсеместно представлен шиной PCI/PCI Express. Практически все интерфейсы, которые интересны обычному пользователю, обычно вставляются как PCI устройства. USB hub, USB контроллер, SATA Host Bus адаптер. Но, помимо этого, есть ещё некоторые другие интерфейсы.

Как мы видели, процессор — это не магия. Это тот же самый чип, и, если мы рассматриваем какой-нибудь embedded, то там встречается такая штука как local bus, который позволяет нам писать в память, и как-то иначе работать с ней. Есть ещё такая штука как JTAG — консьюмерская штука, протокол стандартизирован в IEEE249. Предназначение — всякие отладочные вещи, в основном, чтение и запись триггеров внутри чипа. Если в случае десктопной платформы с JTAG общаться не придётся, потому что все его пины выжраны, то в случае ARM часто встречается ситуация, что интроспекция производится с помощью JTAG, потому что он, среди прочих, интегрирован в datasheet.

Ещё про выводы — VGA с соответствующим рандапом, либо DVI, HDMI. Thunderbolt точно идет как PCI Express.

Это то, что касается примерной архитектуры. Контроллер памяти чаще всего часть либо чипсета, либо CPU. Между CPU и чипсетом у Intel’а использовались, по хронологии: FSB, DMI, QPI. В случае AMD, начиная с K10, для связи чипсета с процессором начали использовать гипертранспорт (HyperTransport). Одно время гипертранспорт достаточно активно продвигался в качестве ассиметричного ответа Intel’у, потому что как PCI, так и PCI Express это детища Intel’а, как и большинство современных периферийных шин. А гипертранспорт какое-то время был противовесом, казалось что отвоюет какую-то долю рынка, но так уже перестает казаться. Даже AMD уже планирует отказаться от его использования. Для связи с южным и северным мостом уже используется, де-факто, по другому названная PCIe x4 (alink), но с модифицированной электромеханикой — заранее известно, что ожидать с той стороны, и инициализация попроще. Для связи процессора и северного моста также может тоже уже не будет использоваться гипертранспорт.

Последнее K10 что помнит лектор MagnyCours (???) потом они сказали, что делают новую архитектуру, но как-то совсем всё грустно.

Архитектура Bulldozer — они решили сделать гипертрединг (hyper-threading) наоборот. Гипертрединг (гиперпоточность) — это попытка использовать избыток функциональных устройств. Здесь наоборот — взяли два ядра и объединили их по части FPU и по фронтенду. За счёт этого они решили выиграть по упрощению. Идея взялась из того, что фронтенд штука сложная, и хотелось их объединить. Но вот не срослось, по тестам штука грустная. Дальше были Piledriver и Streamveller. Они умудрились сохранить сокет. Все помнят, как Intel меняет сокеты. Почему в Sandy Bridge поменялся — потому что PCI Express переехал с чипсета на процессор, и вся схемотехника платы поменялась. В серверном варианте Sandy Bridge E у вас 40 линий gen3. AMD сокет довольно редко меняет, с K10 оно вроде все одинаковое.

Обзор платформ

Интересен IBM Power A2 18-ядерный, и с интерконнектом в чипе, и все это на 45 нм техпроцессе. Есть желание иметь большое количество вычислительных ядер и низкую latency. Шины типа QPI позволяют связывать не только процессор и чипсет, но и процессоры между собой, в случае последних архитектур от Intel’а. У AMD всё грустнее, они делают через гипертранспорт. У процессора до 4 гипертранспорт ендпойнтов из которых 3 кэш-когерентны, то есть можно собирать 3-4 процессорные конфигурации.

У Intel’а с Westmere Intel Xeon e8xxx, Xeon e7-8xxx там довольно большое количество QPI ендпойнтов. На вестмерах у супермикры есть варианты 8 процессорной платформы, они правда собраны не вполносвязный граф, а вдовольно интересную архитектуру.

У каждого ядра по станд набору регистров?

У х86 все очень развесисто. Есть рег общего назначения, которые на самом деле нифига не общего, общего начинаются только с x86-64, есть ещё куча всяких регистров.

add ax, bx
mul ax, cx
mov [dx], ax

xor ax, ax
mov ax, [cx]

Эти вещи можно выполнять параллельно. (Почему?!)

Чтобы более-менее утрясти и закончить с историей, расскажем в общих чертах что происходило с х86 и пауэрами. х86 реально можно рассматривать только Intel и AMD. в какой-то момент (386-486) было достаточно много других вариантов но как-то они все выглядели совершенно несерьезно разве что у глиа было преимущество по энергопотреблением, но оно все завончилось из-за довольно низкой производительности.

386 FPU

486 кэш L1

В P5 появились у-в конвейеры и ммх.

В P6 появились мопы, PAE (поддержка 64-битной адресации), L2 кэш. где-то здесь появился ещё SSE.

NetBurst и параллельно с ним Pentium M

У AMD K6 зднау, K7 Athlon,

В K8 MC → CPU, хотя и пришлось менять сокет, но зато наличие контроллера памяти в ЦПУ реально увеличивает производительность. У Intel’а при аналогичной штуке в Nehalem’е очень сильно старадала производительность PCI Express, изза того что PCIe оказался на чипсете, а контроллер памяти в процессоре, оказало очень плохое влияние на DMA — возможность пси-устройств напрямую работать с памятью хоста. Там стало всё очень плохо, это заметили те, кто занимался видеокарточками, сетевыми адаптерами, но это исправили только в Sandy Bridge.

Хотели достигнуть 3 ГГц, но теплопакет стал вываливать за 160 ватт и не достигли.

Сore SSE3

Сore 2 SSSE3

Nehalem AES-NI, MC → CPU

Sandy Bridge avx, PCIe → CPU

у AMD был K10.5

64 бита впервые появилось после K8 в AMD, у Intel’а 64 появилось в Pentium D.

По поводу IBM’а.

В следующий раз подробнее про то, как работает процессор.

Ссылки

  1. Подробно про устройство логических элементов: триггеры, память, счетчики, шины, пример простейшего процессора (отличный от оригинальной лекции)

  2. Кратко про схемы счётчиков

  3. Таблица развития x86 архитектуры из Википедии

LecturesCMC/ComputerArchitecture2012/Conspects/01 (последним исправлял пользователь Nyarcel 2012-10-30 13:13:49)