# Конспекты по архитектуре компьютера ## Лекция 1. ### Что такое компьютерная система Это не обязательно привычные нам ноутбуки и игровые компьютеры. Это также различные *мейнфреймы, ИУС ( Информационно-управляющие системы ), ВсС ( Встроенные Системы ), РсВсС ( Распределенные Встроенные Системы ) и т.д.* Также это не обязательно что-то материальное, так как __программные системы__ -- тоже __компьютерные системы__. Таким образом, __компьютерные системы не ограничены аппаратной составляющей.__ #### Computer System Сегодня идет тенденция в создании __систем__, у которых не __физические__, а __вычислительные__ компоненты организуют ее работу #### Что такое система в целом 1. __Система__ -- совокупность частей, у которой проявляются свойства, не свойственные ее отдельным частям 2. __Система__ -- это суперпозиция ( приложения ) множества интересов на разные стороны. 3. __Система__ -- совокупность взаимодействующих компонент, организованных для достижения одной или более установленных целей. #### Почему облако это круто: Программным способом можно управлять вычислительными мощностями системы ( программа может понять, что нужно поднять +5 серверов ). ### Неоднозначность компьютерных систем Все о том же, что компьютерные системы это не просто планшеты ноутбуки и компьютеры, а также мейнфреймы, ВсС, ИУС, РсВсС Компьютерные системы можно разделить на: * Информационные системы вход-преобразование/накопление-выход * Управляющие системы, взаимодействующие с физическим объектом ### Почему важен следующий график? Потому что показывает соотношение затрачиваемых средств на различные аспекты системы. ![hardware_software_costs](https://i.imgur.com/6GX7Sde.png) Благодаря тенденциям, полученным на графике и возникает следующее понятие: __Software-Intensive Systems__ — это вычислительные системы, стоимость по реализации которых ложится на разработку ПО. __Software Systems__ — это система, состоящая из программного обеспечения, аппаратного обеспечения и данных; и чей главной целью является исполнение программного обеспечения. Именно то, что __ПО__ достаточное __гибкое__ по своей сути позволяет нам разрабатывать стандарты его разработки и соответственно систем в целом. Одним из самых общих таких стандартов является __OMG Essence__. Причины, по которым у Software Engineers доступны самые продвинутые инструменты разработки и проектирования: * В данной сфере задействованно колоссальное количество людей и финансов * Данная предметная область является наисложнейшей * Разработчики инструментов для разработчиков --- те же самые разработчики ### System-of-interest И __computer system__ и __software system__ и __software-intensive system__ -- это все __system-of-interests__, т.е. системы которые удовлетворяют интересам __stakeholder'ов__. И которые определяются минимально несколькими соствляющими: + Функциональным окружением Operational Environment + Внутренним устройством Internal Organization Более целостное понимание о системе дает + ЖЦ Life Cycle + Enabling Systems ### В каком операционном ( функциональном ) окружении работаем #### Operational Environment При изучении функционального окружения системы, мы должны ответить на несколько вопросов: * Что есть система? * Каковы ее границы? * Где кончается наша зона ответственности за систему? Главный вопрос при анализе окружения: * Когда нам нужно остановиться? Так как можно расширять это окружение бесконечно На данные вопросы могут помочь ответить __stakeholder'ы__ ### Life Cycle __system life cycle__ — ЖЦ __system-of-interest__ __enabling system__ — системы, которые способствуют работе __system-of-interest__ в течение ее ЖЦ ( _Jenkins_ ) ## Лекция 2. ### Зачем рассматривать системы? Чтобы: 1. Правильно выстроить __протекающие процессы__ в системе 2. По процессам построить реализацию, удовлетворяющую __интересам stakeholder'ов__ В итоге, мы получим __system-of-interest__. В первую очередь при рассмотрении системы нас интересует этап ЖЦ, когда она будет __эксплуатироваться__. Таким образом, первоочередные stakeholder'ы нашей системы --- это ее __пользователи__. ### Internal Organization ( Внутреннее устройство ) Первый шаг, который мы предпринимаем, при __рассматривании системы__ -- это ее __внутреннее устройство__. Т.е. мы смотрим на ее __кусочки__ и как они __взаимодействуют__ -- именно это и позволяет системы выполнять ту __функциональность__, __ради которой ее создали__. Однако, мы должны не забывать ограничивать степень углубления, иначе даже __hello world__ придется изучать бесконечно. ### Что включает в себе анализ системы Для анализа берем систему в ее операционном окружении и в момент ее эксплуатации. + Можем построить иерархию по бургер нотации ![burger](https://i.imgur.com/m0kE1Qs.png) + Также нужно понять в какие системы и надсистемы она входит. Дополнительно: с чем взаимодействует ( потенциальный источник требований к системе ). ### Какие этапы МОЖЕТ пройти система помимо эксплуатации ( utilization ) ``` Concept Development Production Utilization Support Retirement -----o---------o-----------o----------o---------o--------o--------- ``` + __Concept__ -- в принципе есть востребованность в системе + __Development__ -- то, что сохраняем в гитхаб + __Production__ -- производство артефакта, которое способно эксплуатироваться + __Utilization__ -- исполняемый артефакт + __Support__ -- сбор информации о системе ( что работает, не работает, ищем точки роста -- что можем развивать ) + __Retirement__ -- утилизация как она есть ( 3R в плане hardware ) Строгой хронологии придерживаться не обязательно. И этапы могу накладываться ### Как описать систему? 1. Не ограничиваться стандартами ISO 2. Акцентироваться на отличительных особенностях системы ### Enabling Systems __Enabling Systems__ -- системы, которые помогают провести систему через ее ЖЦ ( Concept -- OMG Essence, Development -- IDE, Production -- Jenkins... ) ### Что такое архитектура компьютерной системы __Архитектура компьютерной системы__ -- __совокупность принятых решений__, mistake в которых приведет к fault'у. Причем к решениям относятся не только __взвешенный и осознанные__, принятые путем долгих обсуждений, __но и__ простых решений, принятых __по привычке и наитию__. ``` software architecture is the set of decisions which may cause project to be cancelled if incorrect the decisions were. Eoin Woods ( SEI 2010 ) ``` __Архитектура компьютерной системы__ -- фундаментальная организация и свойства системы, воплощенная в их операционном окружении и элементах, взаимодействиях между ними, принципах дизайна и эволюции. ( читай говорит о том, что нужно чтобы разрабатывать систему и чинить ее, затрагивает все аспекты проектирования системы ) ### Белковые вычислители Я думаю все помнят, поэтому не буду писать ## Лекция 3. ### Арифмометры Вычислительная машина построена так, что __конкретные результаты вычислений не записаны, а вычисляются на ходу__. Его __размер растет неравномерно.__ ### Логарифмическая линейна Передвигаем две линейки относительно друг друга получаем значения, которые __вшиты в линейку.__ + Плюс: можно двигать между делениями ( взять поточнее ) + Минусы: можно двигать между делениями ( погрешность в полделения ) ### Жаккардовый станок ![jacquard](https://i.imgur.com/zkEjfhf.png) Итого, в жаккардовом станке мы видим: + принцип __программного управления__ (выделение постоянной и изменчивой части); + глубокая __интеграция кибернетической и физической составляющей__ системы; + __бинарное__ кодирование; + __перфокарты__; ### Поиск кратчайшего пути в графе Решение за $O(1)$ -- строим электрический макет графа, где вес ребра -- сопротивление с соответствующим сопротивлением, а вершина -- контактная площадка. Подаем высокое напряжение на контактные площадки, соответствующие вершинам путь между которыми нужно найти. Сгоревшие резисторы образуют путь. ### Квантовый компьютер Выполняет вычисления сразу на всех данных. Но не взыскал популярности, кроме как в шифровании. ### Логические контроллеры и релейные схемы #### Логический контроллеры __Логический контроллер__ -- устройство, которое принимает сигнал от двух источников и сравнивает, чтобы они пришли одновременно, для реализации функции управления. #### Реле ![rail](https://i.imgur.com/LtsJ3Gj.png) ##### Ladder diagrams ``` ---[\]--- ---[ ]--- IN(1) IN(0) ---( ) OUT -----[ ]---[ ]---( ) C = A & B A B C --+---[ ]---+----( ) C = A | B | A | C +---[ ]---+ B ``` ### Базис булевых компьютеров Это компьютеры, построенные на: 1. Элементах И, ИЛИ, НЕ 2. Триггерах, способных хранить состояние ``` D-trigger +-+---+ D ----| | T |-- Q | | | CLK --| | o-- !Q +-+---+ ``` Используем два сигнала `0` и `1`: `+++` + надежность и помехоустойчивость + легко в плане аппаратной реализации + диапазон и точность наращивается с увеличением разрядности + погрешности из-за архитектуры в целом, а не конкретной реализации `---` + неудобно для человека + простые дроби в виде бесконечных двоичных дробей Но, дополнительно нужны еще два сигнала: + `z` -- отключено, провод не хранить ни нуля, ни единицы + `x` -- неизвестное значение, ошибка синхронизации, деление на нуль. Однако __на практике всегда будет конкретное значение --- 0 или 1__ #### Комбинационные схемы -- схема, составленная из набора логических элементов Должна иметь стабильное состояние, иначе не комбинационная. ``` AND OR NOT BUF +---+ +---+ --| & | --| + | +--+ +--+ | |-- | |-- --| |o-- --| |-- --| | --| | +--+ +--+ +---+ +---+ ``` ##### Способы проектирования комбинационных схем __Утверждение:__ можно реализовать сколь угодно сложную функцию + черный ящик -- реализация таблицы истинности + белый ящик -- понимаем природу функции, можем разложить ее на "многошаговый" процесс ##### Основные особенности комбинационных схем + корректный вход -- ведет к установлению стабильного состояния + есть задержка в установлении стабильного состояния при изменении входных сигналов + параллельная работа + есть накопление ошибки в физическом процессе ( при преобразовании из аналогово в дискретный ) `решается путем использовании "буферов", которые выравнивают сигнал` #### Особенности последовательных схем + позволяет хранить состояния $\Rightarrow$ организовывать вычисления в несколько этапов + позволяет разбить одну схему на несколько комбинационных, соединенных буферами Таким образом, можно распараллелить вычисления и одновременно защелкивать результаты. Синхронные схемы позволяют делать следующее: + конвейеризация + управления тактовой частотой ![ctrlfreq](https://i.imgur.com/Mtl9R6x.png) #### Особенности условных переходов Могут реализовываться: + через регистры состояния `( ZF, SF, CF... )` + через мультиплексоры #### Особенности схем в целом + все процессы между регистрами происходят параллельно + система не может остановиться, она всегда продолжает работу, если есть энергия + передача сигнала -- физический процесс, а значит, если мы не определили следующий сигнал, то дальше его значение случайно, но он будет 0 или 1 это точно. ## Лекция 7 Плюсы программируемого процессора + алгоритм разрабатывается отдельно от железки + легкое перепрограммирование Требования к ПО: 1. ПО Тьюринг полно -- должно реализовывать любой алгоритм 2. удобно для программиста Процессора в основном соответствуют схеме: + поток входных данных + поток выходных данных + хранилище + обработчик данных __Поток входных данных опционален.__ OMG Essence ( __Call for Actions__ ) -- лучшее о том, а как какать ( проектировать программные системы ) -- унифицированное описание методологий проектирования программных систем 7 аспектов любой программной системы ( $7\alpha$ ): __Solutions:__ 1. требования -- определены, зафискированы, согласованы с заказчиком, проверяемые 2. сама программная система -- архитектурная спецификация, прототипчик, реализация, счастливый заказчик 3. customers -- заинтересованные люди, стейкхолдеры 4. endeavour -- производство + сама работа + методология + люди, которые ее делают 6. opportunity -- возможности, технически можно, есть что поесть, есть время __Программная система__ -- совокупность ПО, аппаратного обеспечения, и данные. Говорим о рабочей системе. Аппаратное обеспечение важно, так как любые требования и численные характеристики можно смотреть, когда есть железяка. Данные в данном контексте -- это всякие константы, шаблоны, шрифты в Word. Зачем делается процессор? Чтобы дать новые фишки, возможности программисту. Любой процессор формирование следующего уровня абстракций. Каждый раз для вычислений выстраиваются высшие уровни на основе нижних. Поэтому появляются текущие абстракции. Состав любого уровня: 1. __вычислитель__ -- физически запускает те __процессы__, которые нужны, разворачивает их во времени 2. сам __процесс__ ( тоже несколько ) 3. __спецификация__ -- на формальном языке, которому этот процесс должен соответствовать ( число может быть больше одной ) __Разворот во времени__ означает, что каждому __куску ассемблерных инструкций__ соответствует __аппаратный кусок__. __CGRA__ -- не универсальные, но и не схемы электрические, процессор из супер специфических блоков, логическое развитие __CISC__-архитектуры __ASIC__ -- СБИС, специализированная схема __FPGA__ -- ПЛИС, схема электрическая, заданная программным образом __GPU__ -- много одинаковых процессоров, которые 'лопатят' данные ( видеокарты ) __DSP__ -- большой быстрый поток данных, для которых нужно быстро посчитать, обработка звука, измерительное оборудование __CPU__ -- легко программируется -- гибкий, в теории решает любые задачи, но плохо и не эффективно. Архитектура Фон-Неймана -- многие процессоры к ней близки, и реализуют ее. Современное программирование, как структурное, процедурное, ООП, основано на архитектуре Фон-Неймана, дышит им. И проблемы зафиксированные тогда, актуальны и сейчас. Самая уникальная конструкция, которая меняет семантику: раскраска кода. + Стековые машины и язык программирования Forth. + CISC - Complex Instruction Set + RISC - Reduced Instruction Set + NISC - Not Instruction Set + Tagged архитектура - на аппаратуре есть типы данных + VLIW - не одно алу, а много + (S|M)I(S|M)D - (один|много) потоков инструкций (один|много) потоков данных + Language Directed Computer Design - опускание высокоуровневых абстракций на железку ( эксепшены, полиморфизм ARM, java интерпретатор на железке от ARM ) + __Потоковые машины__ -- данные распроcтраняются как по сети, микросервисная архитектура + __Редукционные ЭВМ__ -- строятся вокруг лямбда-исчислений + __Гранулярные архитектуры__ -- CGRPA имеют специализированные системы команд Понятия __высокоуровневый/низкоуровневый__ -- судятся __относительно аппаратуры__. ### Машина Тьюринга Особенности машины Тьюринга: * Бесконечная лента ( память ) * Головка катается по ленте * Есть операции: прочитать данные, записать, прокатиться влево/вправо Важно, что разделяется __control flow__ и __data flow__. Отдельно управляется развитие вычислительного процесса и отдельно какие данные и как будут обрабатываться, иногда пересекаясь. ### Процессор фон Неймана В отличие от машины Тьюринга, головка катается на произвольный адрес, а не влево-вправо. Разделен на CU ( Control Unit -- преобразует входы в управляющие сигналы ) и ALU. ## Лекция 8 В архитектуре фон Неймана есть разделение на CPU и MU. Основные принципы: + Проектировалась в период __ограниченных возможностей__: мало железа, дорогое железо, глючное железо + Представление данных в __бинарном сигнале__ -- __надежность__ кодирования ( есть двоично-десятичный формат ) ( есть трочное кодирование быстрее происходят вычисления ) ( кривые диапазоны в целочисленных, во float есть отрицательный и положительный ноль ) + Наличие __ПО__ в виде __данных и команд с последовательным исполнением.__ ( один из важных ) + __Единое хранилище__ для хранения __программ и данных__. Единая система адресации, единый канал. __Однородность памяти__ -- со всей памятью работаем одинаково + __Адресуемость адресного пространства__ ( нумерация ячеек памяти ) ( есть маппинги на устройства ) ( не всегда число -- относительно стека ) + Память может быть активом ( master ) -- dma ( простой чип ) или разделена с другими ядрами + Наличие условных jump'ов, if-statement'ы ( нарушает принцип последовательного исполнения ). + __Регистры__ работают __быстрее__, чем просто память + __Узкое место__ -- __доступ к памяти__ ( нужна и для данных и для инструкций ) + Одно чтение на инструкцию, на каждый операнд по такту ### Гарвардская архитектура Бонусы и недостатки: * __Паралелльное чтение__ из памяти данных и памяти инструкций * __Разная ширина слова__ для инструкций и для данных * Не бывает проблемы: читали инструкции, а получили данные и наоборот * Данные и инструкции перемешаны * __Замедляет загрузку программ__ из памяти данных в память инструкций * Физически трудно реализуемое * Трудно реализовать инструкции для передачи из одной памяти в другую ### Наследники Гарвардской архитектуры #### Модифицированная Гарвардская архитектура * Решает проблему числа ног на чипе * __Единый память__, но __работают независимо__ для процессора, так как кэшеруются #### Память инструкций как данные * есть дополнительные инструкции для переброса из данных в инструкции * записываем новые инструкции динамически во время выполнения #### Данные как память для инструкций * можно выполнять инструкции в памяти данных, реализовано на сегментах ## Лекция 9 * Процессора формировались в трудных условиях * средства были ограничены * железо было дорогое и работало медленнно и нестабильно ### Система команд фон Неймоновских ( Принстонских ) процессоров Ключевая характеристика: реализуемая система команд ISA Нужно различать понятия __архитектура процессора__, __архитектура команд__ и __организация процессора__. __Архитектура команд__ --- набор самих команд. Про остальные два определения ничего не сказано. Что фиксирует система команд: * __типы данных__, с которых будут проводиться операции ( внутренние адреса, целочисленные переменные ) * __система регистров__ * __методы адресации__ ( непосредственная адресация, непосредственное указание ячейки памяти, косвенная адресация ) * __модели памяти__ * __набор инструкций__ * __способ обработки прерываний и исключений__ * __методы ввода и вывода__ Недостаточно смотреть на архитектуру процессора как на совокупность поведенческих аспектов процессора, нужно рассматривать безопасность, энергопотребление, временные ограничения. Это к вопросу об уязвимостях Meltdown и Spectre ### Виды инструкций #### Работа с памятью Для работы с памятью нужны следующие команды: * Запись константных значений в регистры * Копирование данных между памятью и внутренними регистрами процессора * Чтение и запись данных по внешние устройства В современных процессорах работа с устройствами -- работа с памятью. Упрощает логику. Будет еще сказано позже. #### Арифметические и логические операции Для арифметики и логики достаточно следующих операций: * Сложение, вычитание, умножение и деление с сохранение результатов в регистр процессора. Инкремент и декремент значений * Побитовые И, ИЛИ, НЕ сдвиги, выборка/установка значений указанных битов * Сравнение значений в регистрах * Операции с плавающей точкой Бинарные слова позволяют эффективно закодировать нужное количество флагов. #### Управляющие операции * Безусловный и условный переход * Косвенный переход ( оптимизация ветвлений алгоритма -- branch prediction, JIT, шитый код ) * Вызов и возврат из подпрограмм #### Инструкции для сопроцессоров * Загрузка данных и получение результатов * Управление операциями сопроцессора ### Микрокомандное управление Идея заключается в том, что у нас есть набор простейших операций, которые могут исполняться параллельно относительно друг друга. Используя эти операции и храня микрокод в сегменте памяти, при подаче opcode микроинструкции на выходе мы получаем набор активированных сигнальных линий, которые что-то делают ( складывают число из памяти с регистром и т.д. ). Позволяет избежать копирования. Иначе требуется реализовывать **процедуры** или **инлайнинг**. Недостатки: * нужно отладить * взрывной рост числа команд * плохо обновлять микрокомандное управление ( теряется обратная совместимость ) Преимущества: * легко, быстро и просто создавать новые команды со сложным поведением ### Complex Instruction Set Architecture Почему появилось? Был только ассемблер, не было компиляторов и языков высокого уровня. Можно сочинять собственные инструкции. Произвольная длина инструкций, произвольная операция. Можно писать компактнее код. Большое количество микрокода, тянущееся с первых процессоров. ### Reduced Instruction Set Architecture Почему появилось? Появились языков высокого уровня ( умные компиляторы и т.д. ). Что привело к усложнению компиляторов на CISC. Смогли убрать уровень микрокодирования ( напрямую управляет машинный код ), так как инструкции все простые и их мало. Рост производительности ( за счет конвейеризации и нового уровня кешей ). Также были переиспользованы таблицы с микрокодом в качестве кешей. Минимальный набор команд простых команд, максимально быстрых и максимально однообразных. Упрощается конструкция памяти микрокоманд, так как декодер проще. Переиспользуем память микрокоманд под кэш инструкций -- рост производительности. + команды единообразны -- исполняются за конечное число тактов -- можно конвейезировать. ## Лекция 10 Благодаря развитию языков программирования появились CISC, а затем RISC процессорар. Производство кремниево завязано на тираж, поэтому новые игроки на рынке вынуждены тянутся за лидером ### No Instruction Set Architecture __Идея:__ компилятор генерирует управляющие сигналы сразу без всяких машинных кодов и микрокода ( 100% от аппаратуры, с которой работаем ). Оптимизация по объему команды и по производительности. Недостатки: - сложно написать такой компилятор и отладить его Преимущества: - компилятор контролирует весь процессор - упрощает архитектуру процессора __High-Level Syntethis__ -- __вход:__ программа; __выход:__ логическая схема процессора максимально эффективно решающая нужную задачу ## Стековые машины ( процессора ) Работает на базе либо RAM, либо сдвиговых регистров для организации стэка. Поддерживает высокоуровневую систему команд -- Forth. Безумно просты в реализации. ### GA144 ( Green Array ) Матрица из нескольких сотен процессоров, причем каждый процессор стековый и асинхронный. Можно организовать либо синхронно, либо асинхронно. Через каждый щелчок происходит затрат электроэнергии -- синхронный. Асинхронный работает только тогда, когда данные меняются ( здесь энергоэффективность ). Можно программировать каждый асинхронный процессор независимо. Энергоэффективный. ## Лекция 11 ### Пирамида памяти **Основной принцип:** `"Чем память больше по объему и дешевле, тем медленнее она работает. И наоборот"` * Жесткие диски, ленточные накопители, механическая память -- отсутствует произвольная адресация ( нужно провернуть физический процесс ) * Память произвольного доступа ( независимо от места нахождения данных ) * Flash-память ( случайное время обращения к диску, в произвольный доступ ) * Физическая память, RAM, оперативная память, основная память, storage * Кэши ( внутри процессора ), но было, когда отдельным чипом * Регистры процессора ( система команд не определима без него ) Ленты магнитные живее всех живых -- стоят копейки, с автоматическими податчиками. ### SRAM и DRAM #### SRAM Простая память, реализованная на транзисторах ( 6-8 ), быстрая, но огромная #### DRAM Нужно обновлять каждый раз. Сохраняет в конденсатор, который постепенно разряжается. Нужен контроллер обновляющий память ( репликация данных ). Всего один транзистор и не факт, что одна емкость. Плотная укладка. ### Кеширование Промежуточный буффер c быстрым доступом к нему, который содержит информацию, к которой мы чаще обращаемся. Есть даже сетевое кеширование ( TTL ). Кеш позволяет ускорить работу систему по 3 позициям: * изменение способа доступа к данным ( убрать накладные расходы на чтения с медленных устройств ) * ускорить доступ к памяти * поместить данные поближе к себе и локально ( CDN ) Все кеши завязаны на том, какой паттерн работы с адресами. Пространственная и временная локальность позволяет лучше работать кешу ( локальные данные читаем в один промежуток времени ). Кеш позволяет ускорить работу с памятью без участия программиста и компилятору. Читаем данные с кеша * Ищем данные в кеше по тэгу * Cache hit * быстро возвращаем данные * Cache miss * посмотрели, что нигде нет * смотрим есть ли не нужные данные * освобождаем данные, которые предполагаем, что не будут пользоваться позже ( LRU, каждый 10-ый такт декрементируем, 0 подменяем ) * пробрасывает доступ на чтение в основную память * записывается в выбранный слот * возвращаем процессору Пишем данные в кеш ( требуется консистентность ) * записать данные в кеш, синхронно записать в память * отложенная запись в кеш * по особому событию записываем в память ( при cache miss ) * накапливаем данные и затем пишем ( не тормозит поток исполнения ) Уровни кешей: + L0 глубоко интегрированы в процессор, чтобы расширить набор регистров + L1 для данных и инструкций ~100 Кб + L2 до 10 Мб ( индивидуальны для каждого ядра ) + L3 для многоядерных архитектур ( синхронизировать кеши ) + В проекте Phantom OS считается, что RAM -- это кеш для вторичной памяти ( HDD, SSD ) ## Лекция 12 Любой кеш независимо от операции должен просканировать все свои данные и вынести cache hit или cache miss. Возможные организации поиска по кешу: + Либо масштабируем горизонтально -- паралелльная работа ( плохо с энергопотреблением, так как часто большинство строк будет cache miss ) + Либо ищем линейно -- долго Присутствует логика предзагрузки ( угадываем следующие инструкции за счет локальности ) + branch prediction. Также с данными ( массивы предзагрузка ). Логика взаимодействия с основной памятью: * синхронно * асинхронно ( копим, сквошаем ) Многоуровневые кеши: * должно быть взаимодействие между уровнями * процессор только с L1 Кеши отличаются уровнями ассоциативности: 1. Полностью ассоциативный кеш -- каждая строка кеша адресует конкретную ячейку ( избыточность, неэффективное использование памяти ) 2. сегментированный кеш прямого доступа -- предполагаем, что в линейном адресном пространстве читает ячейки, расположенные рядышком ( можем урезать тэг, ширину компараторов, на одну строку кеша соответствует неограниченное число ячеек памяти ) n-размерный ассоциативный кеш: * несколько банков кеша, уникальные таблица соответствий * в первый записываем в любой, второй раз в свободный L3 -- есть проблема синхронизация между многоядерными процессорами. Решения: + **Инклюзивный** -- репликация данных в кешах + **Эксклюзивный** -- уникальная запись для каждого кэша Проблема когерентности кешей. Рядом с кешами стоит отдельный чип ( схема ), которая проверяет, есть ли в целом запись в кешах ( и помечен, как dirty ). CAP-теоремы: * Consistency -- везде хранятся все данные ( не дают не релевантные данные ) * Availability -- есть ли хотя бы часть работает, то можно получить данные * Partitioning Tolerance -- при обрыве связи в распределенных системах можем обрабатывать запросы на оборвавшихся узлах. * Строгая консистентность -- всегда полная согласованность * Слабая согласованность -- есть лаги между данные записались и распространились по системе. Не более двух свойств за раз можно достичь. ## Лекция 13 + I/O с участием процессора + I/O без процессора ( DMA ) ### Программно-управляемый ввод-вывод Спин-лок на проверку сигнала с ножки ( плохо ). + нельзя заниматься ничем параллельно + если делать, то писать код в неблокируещем режиме SPI -- дуплексный режим передавать от master к slave. По умолчанию 1 потому, что CS подключается к reset к малым устройствам, нужен 0, чтобы началось потребление электроэнергии. Нужно в цикле слушать шину ( частота в два раза больше ). При передаче также. А лучше x5 или x10. Если частота огромна, то дребезг может помешать. Цикл проверяет флаги, если установлен, то выполняем прикладной код. ### Memory-mapped I/O Процессор может обращаться к устройству не через специальные инструкции, через адреса в памяти. Шина адреса и шина данных не связана с устройством процессора -- гибкость ( так как кэши были отдельными чипами ). Если есть инструкции, то делаем прозрачно и творить волшебство. Процессор может тасовать инструкции в плане спекулятивных вычислений, суперскалярных вычислений. #### Барьер памяти Запрещает переставление инструкций. Пакетная обработка данных помогает улучшить ввод-вывод. Неоднородность памяти появляется. Отобразить порты ввода-вывода на инструкции ( асинхронно ). Но усложняется устройство CPU. #### Причины смены последовательности выполнения инструкций + Асинхронные прерывания + прерывания, генерируемые процессором + иключения Максируемые и немаскируемые прерывания -- решаем реагируем на них или нет. Должны быть критические секции. Приоретизация прерываний. Регистрация по фронту сигнала. В очередь, по дверному звонку. Нужен контроллер. Прерывания должны быть короткими, разносим длинные на несколько событий во времени. ### DMA Процессор не участвует в вводе-выводе. Плохо, когда процессор участвует, подстраивается под устройство, и частота в два раза больше должна быть, физически не может управлять устройством. Контроллер копирующий с I/O в память и обратно. + управляется процессором + много master'ов, сами инициируют ввод-вывод Либо + все подстраиваем под устройство + все подстраиваем под процессор + каждые 100 тактов, хозяин шины Раньше пользовались канальные процессоры, процессоры ввода-вывода, которым задается программа ввода-вывода ( когда был пакетный режим в мейнреймах ). ## Лекция 14 Как быстрее выполнять алгоритмы. Параллельно, а не последовательно. Выделяют две части задачи: + Сверху-вниз -- прикладные программисты, как описать задачу так, чтобы вычислительный процесс допускал максимальный уровень параллелизма. + Снизу-вверх -- каждый элемент вплоть до транзисторов каждый такт работал максимально эффективно. Параллелизмы снизу-вверх: 1. Параллелизм уровня бит. Если можем сделать процесс в комбинационное схеме, то можем распараллелить, так все процессы проиходят параллельно. Нет смысла наращивать машинное слово, так как на часто старшие нули будет тратится площадь вычислительных элементов и электропитание. Использование ПЛИС для нейронных сетей помогает лучше упаковать данные и нейроны. 2. Параллелизм уровня инструкций. Возможность тасование инструкций помогает организовать конвейеризацию в процессоре. Т.е. команды выполняются по цепочке проходя через несколько этапов обработки. Эффективнее используется конвейер, когда нет зависимостей по данным, устраняется пузырьками или переименованием регистров. ## Лекция 15