Кэш процессора

Поделись знанием:
(перенаправлено с «CPU cache»)
Перейти к: навигация, поиск

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

Когда процессору нужно обратиться в память для чтения или записи данных, он сначала проверяет, доступна ли их копия в кэше. В случае успеха проверки процессор производит операцию используя кэш, что значительно быстрее использования более медленной основной памяти. Подробнее о задержках памяти см. Латентность SDRAM: tCAS, tRCD, tRP, tRAS.

Большинство современных микропроцессоров для компьютеров и серверов имеют как минимум три независимых кэша: кэш инструкций для ускорения загрузки машинного кода, кэш данных для ускорения чтения и записи данных и буфер ассоциативной трансляции (TLB) для ускорения трансляции виртуальных (логических) адресов в физические, как для инструкций, так и для данных. Кэш данных часто реализуется в виде многоуровневого кэша (L1, L2, L3).

Увеличение размера кэш-памяти может положительно влиять на производительность почти всех приложений[2], хотя в некоторых случаях эффект незначителен[3]. Работа кэш-памяти обычно прозрачна для программиста, однако для её эффективного использования в некоторых случаях применяются специальные алгоритмические приёмы, изменяющие порядок обхода данных в ОЗУ или повышающие их локальность (например, при блочном умножении матриц)[4].





Принцип работы

Данный раздел описывает типичный кэш данных и некоторые виды кэшей инструкций; TLB может быть устроен сложнее, а кэш инструкций — проще. На диаграмме справа изображены основная и кэш-память. Каждая строка — группа ячеек памяти содержит данные, организованные в кэш-линии. Размер каждой кэш-линии может различаться в разных процессорах, но для большинства x86-процессоров он составляет 64 байта. Размер кэш-линии обычно больше размера данных, к которому возможен доступ из одной машинной команды (типичные размеры от 1 до 16 байт). Каждая группа данных в памяти размером в 1 кэш-линию имеет порядковый номер. Для основной памяти этот номер является адресом памяти с отброшенными младшими битами. В кэше каждой кэш-линии дополнительно ставится в соответствие тег, который является адресом продублированных в этой кэш-линии данных в основной памяти.

При доступе процессора в память сначала производится проверка, хранит ли кэш запрашиваемые из памяти данные. Для этого производится сравнение адреса запроса со значениями всех тегов кэша, в которых эти данные могут храниться. Случай совпадения с тегом какой-либо кэш-линии называется попаданием в кэш (англ. cache hit), обратный же случай называется кэш-промахом (англ. cache miss). Попадание в кэш позволяет процессору немедленно произвести чтение или запись данных в кэш-линии с совпавшим тегом. Отношение количества попаданий в кэш к общему количеству запросов к памяти называют рейтингом попаданий (англ. hit rate), оно является мерой эффективности кэша для выбранного алгоритма или программы.

В случае промаха в кэше выделяется новая запись, в тег которой записывается адрес текущего запроса, а в саму кэш-линию — данные из памяти после их прочтения либо данные для записи в память. Промахи по чтению задерживают исполнение, поскольку они требуют запроса данных в более медленной основной памяти. Промахи по записи могут не давать задержку, поскольку записываемые данные сразу могут быть сохранены в кэше, а запись их в основную память можно произвести в фоновом режиме. Работа кэшей инструкций во многом похожа на вышеприведенный алгоритм работы кэша данных, но для инструкций выполняются только запросы на чтение. Кэши инструкций и данных могут быть разделены для увеличения производительности (принцип, используемый в Гарвардской архитектуре) или объединены для упрощения аппаратной реализации.

Для добавления данных в кэш после кэш-промаха может потребоваться вытеснение (англ. evict) ранее записанных данных. Для выбора замещаемой строки кэша используется эвристика, называемая политика замещения (англ. replacement policy). Основной проблемой алгоритма является предсказание, какая строка вероятнее всего не потребуется для последующих операций. Качественные предсказания сложны, и аппаратные кэши используют простые правила, такие, как LRU. Пометка некоторых областей памяти как некэшируемых (англ. non cacheable) улучшает производительность за счёт запрета кэширования редко используемых данных. Промахи для такой памяти не создают копию данных в кэше.

При записи данных в кэш должен существовать определенный момент времени, когда они будут записаны в основную память. Это время контролируется политикой записи (англ. write policy). Для кэшей со сквозной записью (англ. write-through) любая запись в кэш приводит к немедленной записи в память. Другой тип кэшей, обратная запись англ. write-back (иногда также называемый copy-back), откладывает запись на более позднее время. В таких кэшах отслеживается состояние кэш-линеек ещё не сброшенных в память (пометка битом «грязный» англ. dirty). Запись в память производится при вытеснении подобной строки из кэша. Таким образом, промах в кэше, использующем политику обратной записи, может потребовать двух операций доступа в память, один для сброса состояния старой строки и другой — для чтения новых данных.

Существуют также смешанные политики. Кэш может быть со сквозной записью (англ. write-through), но для уменьшения количества транзакций на шине записи могут временно помещаться в очередь и объединяться друг с другом.

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

Структура записи в кэше

Типичная структура записи в кэше

Блок данных тег бит актуальности

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

Структура адреса

тег индекс смещение

Адрес памяти разделяется (от старших бит к младшим) на Тег, индекс и смещение. Длина поля индекса равна <math>\lceil \log_2(cache\_rows) \rceil</math> бит и соответствует ряду (строке) кэша, используемой для записи. Длина смещения равна <math>\lceil \log_2(data\_blocks) \rceil</math>.

Ассоциативность

Ассоциативность является компромиссом. Проверка большего числа записей требует больше энергии, площади чипа, и, потенциально, времени. Если бы существовало 10 мест, в которые алгоритм вытеснения мог бы отобразить место в памяти, тогда проверка наличия этого места в кэше потребовала бы просмотра 10 записей в кэше. С другой стороны, кэши с высокой ассоциативностью подвержены меньшему количеству промахов (см. ниже "конфликтующие промахи") и процессор тратит меньше времени на чтения из медленной основной памяти. Существует эмпирическое наблюдение, что удвоение ассоциативности (от прямого отображения к 2-канальной или от 2- к 4-канальной) имеет примерно такое же влияние на интенсивность попаданий (hit rate), что и удвоение размера кэша. Увеличение ассоциативности свыше 4 каналов приносит меньший эффект для уменьшения количества промахов (miss rate) и обычно производится по другим причинам, например, из-за пересечения виртуальных адресов.

В порядке ухудшения (увеличения длительности проверки на попадание) и улучшения (уменьшения количества промахов):

  1. кэш прямого отображения (англ. direct mapped cache) — наилучшее время попадания и, соответственно, лучший вариант для больших кэшей;
  2. 2-канальный множественно-ассоциативный кэш англ. 2-way set associative cache;
  3. 2-канальный skewed ассоциативный кэш (англ. «the best tradeoff for …. caches whose sizes are in the range 4K-8K bytes» — André Seznec);
  4. 4-канальный множественно-ассоциативный кэш (англ. 4-way set associative cache);
  5. полностью ассоциативный кэш, англ. fully associative cache — наилучший (самый низкий) процент промахов (miss rate) и лучший вариант при чрезвычайно высоких затратах при промахе (miss penalty).

Псевдоассоциативный кэш

Виды промахов

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

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

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

Категории промахов (Three Cs)

  • Compulsory misses — промахи, вызванные первым упоминанием запрошенного адреса. Размеры кэшей и их ассоциативность не влияют на количество данных промахов. Предвыборка (prefetching), как программная, так и аппаратная, может помочь, так же, как и увеличение размера кэш-линии (в качестве вида аппаратной предвыборки). Такие промахи иногда называются "холодными".
  • Capacity misses — промахи, вызванные исключительно конечным размером кэша, происходящие вне зависимости от степени ассоциативности или размера кэш-линии. График таких промахов относительно размера кэша может дать некоторую меру временной локальности (temporal locality) некоторого набора запросов в память. Стоит заметить, что не существует понятия полного кэша, пустого кэша или почти полного кэша, так как кэши процессора почти все время имеют кэш-линии в занятом состоянии, и, значит, практически каждое заведение новой линии потребует гашения уже занятой.
  • Conflict misses — промахи, вызванные конфликтом. Их можно избежать, если бы кэш не вытеснил запись ранее. Можно дополнительно разделить на промахи, вызванные отображением (конкретным значением ассоциативности) и промахи замещения, которые вызваны конкретным алгоритмом выбора записей для замещения.

Трансляция адресов

Большая часть процессоров общего назначения реализует какой-либо вариант виртуальной памяти. Кратко говоря, каждая программа, исполняющаяся на машине, видит собственное упрощенное адресное пространство, содержащее код и данные только этой программы. Любая программа использует своё виртуальное адресное пространство вне зависимости от его местоположения в физической памяти.

Наличие виртуальной памяти требует от процессора проведения трансляции виртуальных (математических) адресов, используемых программой, в физические адреса, соответствующие реальному местоположению в ОЗУ. Часть процессора, проводящая это преобразование, называется устройство управления памятью (MMU). Для ускорения трансляций в MMU добавлен кэш недавно использованных отображений (соответствий виртуальных и физических адресов), называемый Translation Lookaside Buffer (TLB).

Для дальнейшего описания важны три особенности процесса трансляции адресов:

  • Задержка: Физический адрес будет получен от MMU только спустя некоторое время, вплоть до нескольких тактов, после подачи на вход MMU виртуального адреса с генератора адресов.
  • Эффект наложения: Несколько виртуальных адресов могут соответствовать одному физическому. В большинстве процессоров гарантируется, что все записи по физическому адресу будут совершены в порядке, заданном программой. Для выполнения этого свойства требуется проверка, что только один экземпляр копии данных с физического адреса находится в данный момент в кэше.
  • Единица отображения: Виртуальное адресное пространство разбито на страницы — блоки памяти фиксированного размера, начинающиеся с адресов, кратных их размеру. Например, 4 ГБ адресного пространства можно разделить на 1048576 страниц по 4 КБ, для каждой из которых возможно независимое соответствие физическим страницам. В современных процессорах часто поддерживается использование одновременно нескольких размеров страниц, например, 4 КБ и 2 МБ для x86-64, а в некоторых современных AMD-процессорах ещё и 1 ГБ.

Важно также заметить, что первые системы виртуальной памяти были очень медленными, потому что они требовали проверки таблицы страниц (хранимой в основной ОЗУ) перед любым программным обращением в память. Без использования кэширования для отображений такие системы уменьшают скорость работы с памятью примерно в 2 раза. Поэтому использование TLB очень важно и иногда его добавление в процессоры предшествовало появлению обычных кэшей данных и инструкций.

По отношению к виртуальной адресации кэши данных и инструкций могут быть поделены на 4 типа. Адреса в кэшах используются для двух разных целей: индексирования и тегирования.

  • Physically indexed, physically tagged (PIPT) — физически индексируемые и физически тегируемые. Такие кэши просты и избегают проблем с наложением (aliasing), но они медленны, так как перед обращением в кэш требуется запрос физического адреса в TLB. Этот запрос может вызвать промах в TLB и дополнительное обращение в основную память перед тем, как наличие данных будет проверено в кэше.
  • Virtually indexed, virtually tagged (VIVT) — виртуально индексируемые и виртуально тегируемые. И для тегирования, и для индекса используется виртуальный адрес. Благодаря этому проверки наличия данных в кэше происходят быстрее, не требуя обращения к MMU. Однако возникает проблема наложения, когда несколько виртуальных адресов соответствуют одному и тому же физическому. В этом случае данные будут закэшированы дважды, что сильно усложняет поддержку когерентности. Другой проблемой являются омонимы, ситуации, когда один и тот же виртуальный адрес (например, в разных процессах) отображается различные физические адреса. Становится невозможным различить такие отображения исключительно по виртуальному индексу. Возможные решения: сброс кэша при переключении между задачами (context switch), требование непересечения адресных пространств процессов, тегирование виртуальных адресов идентификатором адресного пространства (address space ID, ASID) или использование физических тегов. Также возникает проблема при изменении отображения виртуальных адресов в физические, что требует сброса кэш-линий, для которых изменилось отображение.
  • Virtually indexed, physically tagged (VIPT) — виртуально индексируемые и физически тегируемые. Для индекса используется виртуальный адрес, а для тега — физический. Преимуществом над первым типом является меньшая задержка, поскольку можно искать кэш-линию одновременно с трансляцией адресов в TLB, однако сравнение тега задерживается до получения физического адреса. Преимуществом над вторым типом является обнаружение омонимов (homonyms), так как тег содержит физический адрес. Для данного типа требуется больше бит для тега, поскольку индексные биты используют иной тип адресации.
  • Physically indexed, virtually tagged — физически индексируемые и виртуально тегированные кэши считаются бесполезными и маргинальными и представляют исключительно академический интерес[5].

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

Виртуальное тегирование и механизм vhints

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

Достаточно длительное время кэши использовали для тегов как физические, так и виртуальные адреса, хотя виртуальное тегирование в настоящее время встречается очень редко. Если TLB-запрос заканчивается раньше запроса в кэш-память, физический адрес будет доступен для сравнения с тегом к моменту, когда это будет необходимо, и, следовательно, виртуальное тегирование не потребуется. Большие кэши чаще тегируются физическими адресами, и только небольшие быстродействующие кэши используют для тегов виртуальные адреса. В современных процессорах общего назначения, виртуальное тегирование заменено на механизм vhints, описанный далее.

Виртуальное индексирование и пересечения виртуальных адресов

Проблема гомонимов и синонимов

Расцвечивание страниц

Иерархия кэшей в современных микропроцессорах

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

Специализированные кэши

Суперскалярные ЦПУ осуществляют доступ к памяти из нескольких этапов конвейера: чтение инструкции (instruction fetch), трансляция виртуальных адресов в физические, чтение данных (data fetch). Очевидным решением является использование различных физических кэшей для каждого из этих случаев, чтобы не было борьбы за доступ к одному из физических ресурсов с разных стадий конвейера. Таким образом, наличие конвейера обычно приводит к наличию, по крайней мере, трёх раздельных кэшей: кэш инструкций, кэш трансляций TLB и кэш данных, каждый из которых специализирован на своей задаче.

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

Многоуровневые кэши

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

В единичных случаях реализуют 4 уровня кэш-памяти[6][7].

Многоуровневые кэши обычно работают в последовательности от меньших кэшей к большим. Сначала происходит проверка наименьшего и наибыстрейшего кэша первого уровня (L1), в случае попадания процессор продолжает работу на высокой скорости. Если меньший кэш дал промах, проверяется следующий, чуть больший и более медленный кэш второго уровня (L2), и так далее, пока не будет запроса к основному ОЗУ.

По мере того, как разница задержек между ОЗУ и быстрейшим кэшем увеличивается, в некоторых процессорах увеличивают количество уровней кэша (в некоторых — до 3х уровней на кристалле). К примеру, процессор Alpha 21164 в 1995 году имел накристалльный кэш 3го уровня в 96 КБ; IBM POWER4 в 2001 году имел до четырёх кэшей L3 по 32 МБ[8] на отдельных кристаллах, используемых совместно несколькими ядрами; Itanium 2 в 2003 году имел 6 МБ кэш L3 на кристалле; Xeon MP под кодом «Tulsa» в 2006 году — 16 МБ кэша L3 на кристалле, общий на 2 ядра; Phenom II в 2008 году — до 6 МБ универсального L3 кэша; Intel Core i7 в 2008 году — 8 МБ накристалльного кэша L3, являющимся инклюзивным и разделяемым между всеми ядрами. Польза от кэша L3 зависит от характера обращений программы в память.

Наконец, с другой стороны иерархии памяти находится регистровый файл самого микропроцессора, который можно рассматривать как небольшой и самый быстрый кэш в системе со специальными свойствами (например, статическое планирование компилятором при распределении регистров, когда он располагает данные из ОЗУ на регистр). Подробнее см. loop nest optimization. Регистровые файлы также могут иметь иерархию: Cray-1 (в 1976 году) имел 8 адресных «A»-регистров и 8 скалярных «S»-регистров общего назначения. Также машина содержала набор из 64 адресных «B» и 64 скалярных «T» регистров, обращение к которым было дольше, но все же значительно быстрее основной ОЗУ. Эти регистры были введены по причине отсутствия в машине кэша данных (хотя кэш команд в машине имелся)

Эксклюзивность (исключительность) и инклюзивность

Для многоуровневых кэшей требуется делать новые архитектурные решения.

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

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

Преимущество исключительных кэшей в том, что они хранят больше данных. Это преимущество больше, когда исключительный кэш L1 сопоставим по размеру с кэшэм L2, и меньше, если кэш L2 во много раз больше, чем кэш L1. Когда L1 пропускает и L2 получает доступ в случае попадания, строка кэша попадания в L2 обменивается со строкой в L1.

Victim cache

Victim cache или Victim buffer[9]) (дословно Кэш жертв) — это небольшой специализированный кэш, хранящий те кэш-линии, которые были недавно вытеснены из основного кэша микропроцессора при их замещении. Данный кэш располагается между основным кэшем и его англ. refill path. Обычно кэш жертв является полностью ассоциативным и служит для уменьшения количества конфликтных промахов (conflict miss). Многие часто используемые программы не требуют полного ассоциативного отображения для всех попыток доступа к памяти. По статистике только небольшая доля обращений к памяти потребует высокой степени ассоциативности. Именно для таких обращений служит кэш жертв, предоставляющий высокую ассоциативность для подобных редких запросов. Был предложен Norman Jouppi (DEC) в 1990[10]. Размер такого кэша может составлять от 4 до 16 кэш-линий.[11]

Кэш трасс

Одним из наиболее экстремальных случаев специализации кэшей можно считать кэш трасс (англ. trace cache), используемый в процессорах Intel Pentium 4. Кэш трасс — это механизм для увеличения пропускной способности загрузки инструкций и для уменьшения тепловыделения (в случае Pentium 4) за счёт хранения декодированных трасс инструкций. Таким образом этот кэш исключал работу декодера при повторном исполнении недавно выполнявшегося кода.

Одной из ранних публикацией о кэше трасс была статья коллектива авторов (Eric Rotenberg, Steve Bennett и Jim Smith), вышедшая в 1996 году под названием «Trace Cache: a Low Latency Approach to High Bandwidth Instruction Fetching.» (Кэш трасс: низколатентный подход для обеспечения высокой пропускной способности загрузки инструкций).

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

Линии трасс хранятся в кэше трасс по адресам, соответствующим счётчику инструкций первой машинной команды из трассы, к которым добавлен набор признаков предсказания ветвлений. Такая адресация позволяет хранить различные трассы исполнения, начинающиеся с одного адреса, но представляющие различные ситуации по результату предсказания ветвлений. На стадии подгрузки инструкции (instruction fetch) конвейера инструкций для проверки попадания в кэш трасс используется как текущий счётчик инструкций (program counter), так и состояние предсказателя ветвлений. Если попадание свершилось, линия трассы непосредственно подается на конвейер без необходимости опрашивать обычный кэш (L2) или основное ОЗУ. Кэш трасс подает машинные команды на вход конвейера, пока не кончится линия трассы, либо пока не произойдет ошибка предсказания в конвейере. В случае промаха кэш трасс начинает строить следующую линию трассы, загружая машинный код из кэша или из памяти.

Похожие кэши трасс использовались в Pentium 4 для хранения декодированных микроопераций и микрокода, реализующего сложные x86-инструкции. [citeseer.ist.psu.edu/rotenberg96trace.html Smith, Rotenberg and Bennett’s paper См полный текст работы] в Citeseer.

Реализации

История

В ранние годы микропроцессорных технологий доступ в память был лишь немного медленнее доступа к процессорным регистрам. Но с 1980-х[12] разрыв в производительности между процессорами и памятью стал нарастать. Микропроцессоры совершенствовались быстрее, чем память, особенно в плане частоты функционирования, таким образом, память становилась узким местом при достижении полной производительности от системы. Хотя было технически возможным иметь основную память столь же быстрой, как и ЦПУ, был выбран более экономичный путь: использовать избыточное количество низкоскоростной памяти, но ввести в систему небольшую, но быструю кэш-память, для смягчения разрыва в производительности. В итоге получили на порядок большие объёмы памяти, примерно за ту же цену и с небольшими потерями общей производительности.

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

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

Ассоциативный кэш более сложен, потому что некоторый вариант тега нужно считать для определения, какую часть кэша выбрать. Кэш N-way set-associative первого уровня обычно считывает одновременно все N возможных тегов и N данных параллельно, затем проводит сравнение тегов с адресом и выбор данных, ассоциированных с совпавшим тегом. Кэши 2го уровня в целях экономии энерговыделения иногда выполняют сначала чтение тегов, и только затем чтение одного элемента данных из SRAM-данных.

Диаграмма справа должна показать, как происходит использование различных частей адреса. Бит 31 адреса является наиболее значимым битом (старшим), бит 0 — наименее значащим битом (младшим). На диаграмме показаны две SRAM, индексация и мультиплексирование для 4 КБ, 2-way set-associative, виртуально индексированного и виртуально тегированного кэша с 64байтными блоками, 32битной шириной чтения и 32битным виртуальным адресом.

Поскольку кэш имеет размер 4 КБ и линии размером 64 байта, в нём хранится 64 линии, и мы можем считать за два раза из тега SRAM, который содержит 32 столбца, каждый из которых содержит пару 21-битных тегов. Хотя может быть использована любая функция виртуальной адресации битов 31 по 6, чтобы индексировать тег и данные SRAM, проще всего воспользоваться младшими разрядами. Так же, потому что объём кэша составляет 4 кБ и имеет четырёхбайтный путь для чтения, и чтение производится по двум путями для каждого доступа, данные SRAM составляют 512 рядов шириной 8 байт.

Более современный кэш, возможно, был бы 16-килобайтным, четырёхпутным, набор-ассоциативным, виртуально индексируемым, виртуально попадаемым и физически помечаемым (тегом), с 32-битными строками, 32-битной шириной шины чтения и 36-битным физическим адресованием. Рекуррентное соотношение пути чтения для такого кэша выглядит очень схоже с рассмотренными выше. Вместо тегов читаются виртуальные попадания? (англ. vhits), и снова производится соответствие подмножества виртуальному адресу. Позже, в конвейере, виртуальный адрес переводится в физический адрес TLB, и производится чтение физического тега (только одно, так как виртуальное попадание поставляет путь для чтения кэша). В конце физический адрес сравнивается с физическим тегом, чтобы определить, произошло ли попадание.

Некоторые процессоры SPARC имели ускоренные на несколько задержек затвора (англ. gate delay) L1 кэши за счёт использования SRAM-декодеров вместо сумматора виртуальных адресов. Подробнее см. en:Sum addressed decoder.

В X86

Когда x86 микропроцессоры достигли частот в 20 и более мегагерц (начиная с Intel 80386), для увеличения производительности в них было добавлено небольшое количество быстрой кэш-памяти. Это было необходимо из-за того, что используемая как системная ОЗУ DRAM имела значительные задержки (до 120 нс), и требовала такты для обновления. Кэш был построен на базе более дорогой, но значительно более быстрой SRAM, которая в те времена имела задержки около 10 нс. Ранние кэши были внешними по отношению к процессору и часто располагались на материнской плате как 8 или 9 микросхем в корпусах DIP, расположенные в сокетах для возможности увеличения или уменьшения размера кэша. Некоторые версии процессора I386 поддерживали от 16 до 64 КБ внешнего кэша[13].

С выходом процессора Intel 80486 8 КБ кэша было интегрировано непосредственно на кристалл микропроцессора. Этот кэш был назван L1 (первого уровня, англ. level 1), чтобы отличать его от более медленного кэша на материнской плате, названного L2 (второго уровня, англ. level 2). Последние были значительно больше, вплоть до 256 КБ.

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

В микропроцессоре Pentium используется раздельный кэш, команд и данных[14]. Буфер трансляции адресов (TLB) преобразует адрес в ОЗУ в соответствующий адрес в кэше. Кэш данных Pentium использует метод обратной записи (англ. write-back), который позволяет модифицировать данные в кэше без дополнительного обращения к оперативной памяти (данные записываются в ОЗУ только при удалении из кэша) и протокол MESI (Modified, Exclusive, Shared, Invalid), который обеспечивает когерентность данных в кэшах процессоров и в ОЗУ при работе в мультипроцессорной системе.

Каждый из раздельных кэшей, данных и команд, микропроцессора Pentium MMX имеет объёмом 16 кБ и содержит два порта, по одному для каждого исполнительного конвейера. Кэш данных имеет буфер трансляции адресов (TLB).

Следующий вариант реализации кэшей в x86 появился в Pentium Pro, в котором кэш второго уровня (объединённый для данных и команд, размером 8 кБ) размещён в одном корпусе с процессором и кэшем первого уровня, размером 8 кБ, раздельным для данных и команд, и поднял его частоту до частоты ядра. Позже кэш второго уровня стал размещаться на том же кристалле, что и процессор.

Двойная независимая шина англ. DIB), новая архитектура кэш-памяти, использует разные шины для соединения процессорного ядра с основной оперативной памятью. Кэш первого уровня двухпортовый, неблокирующий, поддерживает одну операцию загрузки и одну операцию записи за такт. Работает на тактовой частоте процессора. За такт передаётся 64 бита.

В микропроцессоре Pentium II кэш первого уровня увеличен — 16 кбайт для данных и 16 кбайт для команд. Для кэша второго уровня используется BSRAM, расположенная на одной с процессором плате в картридже S.E.C. для установки в Slot 1.

С ростом популярности многоядерных процессоров на кристалл стали добавлять кэши третьего уровня, названные L3. Этот уровень кэша может быть общим для нескольких ядер и реализовывать эффективное взаимодействие между ядрами. Его объём обычно больше суммарного объёма кэшей всех подключенных к нему ядер и может достигать 16 МБ.

Популярным кэш на материнской плате оставался до эры выхода Pentium MMX и вышел из употребления с введением SDRAM и ростом разницы между частотой шины процессора и частотой ядра процессора: кэш на материнской плате стал лишь немногим быстрее основной ОЗУ.

Пример кэша (процессорное ядро К8)

Приведена схема кэшей ядра микропроцессоров AMD K8, на которой видны как специализированные кэши, так и их многоуровневость.

Ядро использует четыре различных специализированных кэша: кэш инструкций, TLB инструкций, TLB данных и кэш данных:

  • Кэш инструкций состоит из 64-байтных блоков, являющихся копией основной памяти, и может подгружать до 16 байтов за такт. Каждый байт в этом кэше хранится в 10 битах, а не в 8, причём в дополнительных битах отмечены границы инструкций (т. о. кэш проводит частичное преддекодирование). Для проверки целостности данных используется лишь контроль четности, а не ECC, так как бит четности занимает меньше места, а в случае сбоя повреждённые данные можно обновить правильной версией из памяти.
  • TLB инструкций содержит копии записей из таблицы страниц. На каждый запрос чтения команд требуется трансляция математических адресов в физические. Записи о трансляции бывают 4- и 8-байтными, и TLB разбит на 2 части, соответственно одна для 4 КБ отображений и другая для 2 и 4 МБ отображений (большие страницы). Такое разбиение упрощает схемы полностью ассоциативного поиска в каждой из частей. ОС и приложения могут использовать отображения различного размера для частей виртуального адресного пространства.
  • TLB данных является сдвоенным, и оба буфера содержат одинаковый набор записей. Их сдвоенность позволяет производить каждый такт трансляцию для двух запросов к данным одновременно. Так же, как и TLB инструкций, этот буфер разделен между записями двух видов.
  • Кэш данных содержит 64-байтные копии фрагментов памяти. Он разделен на 8 банков (банок), каждый содержит по 8 килобайт данных. Кэш позволяет производить по два запроса к 8-байтовым данным каждый такт, при условии, что запросы будут обработаны различными банками. Теговые структуры в кэше продублированы, так как каждый 64-байтный блок распределен по всем 8 банкам. Если совершается 2 запроса в один такт, они работают с собственной копией теговой информации.

Также в этом ядре используются многоуровневые кэши: двухуровневые TLB инструкций и данных (на втором уровне хранятся лишь записи о 4-кб отображениях), и кэш второго уровня (L2), унифицированный для работы как с кэшами данных и инструкций 1го уровня, так и для различных TLB. Кэш L2 является эксклюзивным для L1 данных и L1 инструкций, то есть каждый кэшированный 8-байтовый фрагмент может находиться либо в L1 инструкций, либо в L1 данных, либо в L2. Исключением могут быть лишь байты, составляющие записи PTE, которые могут находиться одновременно в TLB и в кэше данных во время обработки виртуального отображения со стороны ОС. В таком случае ОС отвечает за своевременный сброс TLB после обновления записей трансляции.

DEC Alpha

В микропроцессоре DEC Alpha 21164 (выпущенном в ноябре 1995 года с тактовой частотой 333 МГц) кэш первого уровня может поддерживать некоторое количество (до 21) необработанных промахов. Имеется шестиэлементный файл адресов необработанных промахов (англ. miss address file, MAF), каждый элемент которого содержит адрес и регистр для загрузки при промахе (если адреса промаха принадлежат одной строке кэша, то в MAF они рассматриваются как один элемент).

Помимо раздельных кэшей L1 со сквозной записью, на кристалле процессора расположены частично-ассоциативный кэш L2 с обратной записью и контроллер кэша L3, работающего как в синхронном, так и в асинхронном режиме.

В выпущенном в марте 1997 года DEC Alpha 21164PC внешний кэш второго уровня; объём кэша команд увеличен до 16 кБ.

В микропроцессоре DEC Alpha 21264 нет кэша второго уровня (контроллер которого, тем не менее, размещается на кристалле), но кэш первого уровня увеличен до 128 кБ (по 64 кБ для кэша команд и кэша данных соответственно).

PA-RISC

Разработка Hewlett-Packard для научных и инженерных вычислений PA-8000 содержит буфер переупорядочивания адресов (англ. ARB), отслеживающий все команды загрузки/сохранения, который позволяет сократить задержку адресования внешней кэш-памяти данных и команд, которая в данном процессоре может иметь объём до 4 МБ. Тем не менее, даже эффективное управление внешним кэшем при помощи высокоскоростных линий управления и предвыборки данных и команд из основной памяти в кэш не скомпенсировало невысокую скорость и высокую стоимость.

Устранить указанные недостатки удалось в PA-8500, в котором за счёт техпроцесса 0,25 мкм удалось добавить на кристалл 512 кБ кэша команд и 1 МБ кэша данных.

PowerPC

Построенный на гарвардской архитектуре PowerPC 620 содержит два встроенных кэша, ёмкостью 32 кБ каждый, которые имеют собственные блоки управления памятью (англ. MMU) и функционируют независимо друг от друга. Команды и адреса переходов кэшируются в кэше BTAC (англ. Branch-Target Adress Cache).

Шинный интерфейс процессора включает полную реализацию поддержки кэша второго уровня (объёмом до 128 МБ, работающем на частоте процессора либо вдвое/вчетверо меньшей), и для управления работой внешнего кэша не требует дополнительных тактов. Реализована комбинация сквозной и обратной записи а также поддержка протокола MESI.

MIPS

Своя специфика у кэша L1, применяемого в RA-10000, — каждая команда в кэше снабжена дополнительным четырёхбитным тегом, который используется в дальнейшем декодировании и классификации команды.

Текущие разработки

Напишите отзыв о статье "Кэш процессора"

Примечания

  1. Виктор Владимирович Корнеев, Андрей Валентинович Киселев. 1.2.3 Структурные методы уменьшения времени доступа к памяти // Современные микропроцессоры. — М: «Нолидж», 1998. — С. 75-76. — 240 с. — 5 000 экз. — ISBN 5-98251-050-6.
  2. [www.thg.ru/cpu/performance_vs_cache/performance_vs_cache-02.html Зависимость производительности процессора от размера кэша L2]
  3. [www.thg.ru/cpu/amd_athlon_ii_x4_620_vs_phenom_ii/print.html AMD Athlon II X4 или Phenom II: влияние кэш-памяти L3 на производительность]
  4. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic Architecture. Order number 253665-021.
  5. [www.linuxjournal.com/article/7105 Understanding Caching]. Linux Journal. Проверено 2 мая 2010. [www.webcitation.org/67EG0Yf0S Архивировано из первоисточника 27 апреля 2012].
  6. www.theregister.co.uk/2004/05/06/hp_mx2_itaniummodule/ "HP has packed mx2 with 32MB of L4 cache "
  7. www.theregister.co.uk/2010/07/23/ibm_z196_mainframe_processor/ "L4 cache memory, which most servers do not have. (IBM added some L4 cache to its EXA chipsets for Xeon processors from Intel a few years back). This L4 cache is necessary for one key reason"
  8. [ixbtlabs.com/articles/ibmpower4/ IBM POWER4 Processor Review. Ixbtlabs] "An important feature of the L3 cache is a capability to combine separate caches of POWER4 chips up to 4 (128 MBytes) which allows using address interleaving to speed up the access."
  9. [www.ixbt.com/cpu/amd-hammer-family2.shtml Детальное исследование архитектуры AMD64] // ixbt.com, "Подсистема кэша. Поиск и анализ изменений"
  10. N.P.Jouppi. "Improving direct-mapped cache performance by the addition of a small fully-associative cache and prefetch buffers." - 17th Annual International Symposium on Computer Architecture, 1990. Proceedings., DOI:10.1109/ISCA.1990.134547
  11. [www.ecs.umass.edu/ece/koren/architecture/VCache/home.html Victim Cache Simulator]
  12. [www.acm.org/crossroads/xrds5-3/pmgap.html The Processor-Memory performance gap]. acm.org. Проверено 8 ноября 2007. [www.webcitation.org/67EG1BzQt Архивировано из первоисточника 27 апреля 2012].
  13. Михаил Гук. 4. Кэширование памяти // Процессоры Pentium II, Pentium Pro и просто Pentium. — М: Питер, 1999. — С. 126-143. — 288 с. — 7 000 экз. — ISBN 5-8046-0043-5.
  14. Виктор Владимирович Корнеев, Андрей Валентинович Киселев. 2.2.1.2 Раздельные кэш-память команд и данных // Современные микропроцессоры. — М: «Нолидж», 1998. — С. 75-76. — 240 с. — 5 000 экз. — ISBN 5-98251-050-6.

См. также

Ссылки

  • [lwn.net/Articles/252125/ Memory part 2: CPU caches] Статья на lwn.net (автор Ulrich Drepper) с детальным описанием кэшей
  • [www.zipcores.com/skin1/zipdocs/datasheets/cache_8way_set.pdf 8-way set-associative кэш] написанный на VHDL

Отрывок, характеризующий Кэш процессора

– Ах да, твое дело. В гусары то? Скажу, скажу. Нынче скажу все.
– Ну что, mon cher, ну что, достали манифест? – спросил старый граф. – А графинюшка была у обедни у Разумовских, молитву новую слышала. Очень хорошая, говорит.
– Достал, – отвечал Пьер. – Завтра государь будет… Необычайное дворянское собрание и, говорят, по десяти с тысячи набор. Да, поздравляю вас.
– Да, да, слава богу. Ну, а из армии что?
– Наши опять отступили. Под Смоленском уже, говорят, – отвечал Пьер.
– Боже мой, боже мой! – сказал граф. – Где же манифест?
– Воззвание! Ах, да! – Пьер стал в карманах искать бумаг и не мог найти их. Продолжая охлопывать карманы, он поцеловал руку у вошедшей графини и беспокойно оглядывался, очевидно, ожидая Наташу, которая не пела больше, но и не приходила в гостиную.
– Ей богу, не знаю, куда я его дел, – сказал он.
– Ну уж, вечно растеряет все, – сказала графиня. Наташа вошла с размягченным, взволнованным лицом и села, молча глядя на Пьера. Как только она вошла в комнату, лицо Пьера, до этого пасмурное, просияло, и он, продолжая отыскивать бумаги, несколько раз взглядывал на нее.
– Ей богу, я съезжу, я дома забыл. Непременно…
– Ну, к обеду опоздаете.
– Ах, и кучер уехал.
Но Соня, пошедшая в переднюю искать бумаги, нашла их в шляпе Пьера, куда он их старательно заложил за подкладку. Пьер было хотел читать.
– Нет, после обеда, – сказал старый граф, видимо, в этом чтении предвидевший большое удовольствие.
За обедом, за которым пили шампанское за здоровье нового Георгиевского кавалера, Шиншин рассказывал городские новости о болезни старой грузинской княгини, о том, что Метивье исчез из Москвы, и о том, что к Растопчину привели какого то немца и объявили ему, что это шампиньон (так рассказывал сам граф Растопчин), и как граф Растопчин велел шампиньона отпустить, сказав народу, что это не шампиньон, а просто старый гриб немец.
– Хватают, хватают, – сказал граф, – я графине и то говорю, чтобы поменьше говорила по французски. Теперь не время.
– А слышали? – сказал Шиншин. – Князь Голицын русского учителя взял, по русски учится – il commence a devenir dangereux de parler francais dans les rues. [становится опасным говорить по французски на улицах.]
– Ну что ж, граф Петр Кирилыч, как ополченье то собирать будут, и вам придется на коня? – сказал старый граф, обращаясь к Пьеру.
Пьер был молчалив и задумчив во все время этого обеда. Он, как бы не понимая, посмотрел на графа при этом обращении.
– Да, да, на войну, – сказал он, – нет! Какой я воин! А впрочем, все так странно, так странно! Да я и сам не понимаю. Я не знаю, я так далек от военных вкусов, но в теперешние времена никто за себя отвечать не может.
После обеда граф уселся покойно в кресло и с серьезным лицом попросил Соню, славившуюся мастерством чтения, читать.
– «Первопрестольной столице нашей Москве.
Неприятель вошел с великими силами в пределы России. Он идет разорять любезное наше отечество», – старательно читала Соня своим тоненьким голоском. Граф, закрыв глаза, слушал, порывисто вздыхая в некоторых местах.
Наташа сидела вытянувшись, испытующе и прямо глядя то на отца, то на Пьера.
Пьер чувствовал на себе ее взгляд и старался не оглядываться. Графиня неодобрительно и сердито покачивала головой против каждого торжественного выражения манифеста. Она во всех этих словах видела только то, что опасности, угрожающие ее сыну, еще не скоро прекратятся. Шиншин, сложив рот в насмешливую улыбку, очевидно приготовился насмехаться над тем, что первое представится для насмешки: над чтением Сони, над тем, что скажет граф, даже над самым воззванием, ежели не представится лучше предлога.
Прочтя об опасностях, угрожающих России, о надеждах, возлагаемых государем на Москву, и в особенности на знаменитое дворянство, Соня с дрожанием голоса, происходившим преимущественно от внимания, с которым ее слушали, прочла последние слова: «Мы не умедлим сами стать посреди народа своего в сей столице и в других государства нашего местах для совещания и руководствования всеми нашими ополчениями, как ныне преграждающими пути врагу, так и вновь устроенными на поражение оного, везде, где только появится. Да обратится погибель, в которую он мнит низринуть нас, на главу его, и освобожденная от рабства Европа да возвеличит имя России!»
– Вот это так! – вскрикнул граф, открывая мокрые глаза и несколько раз прерываясь от сопенья, как будто к носу ему подносили склянку с крепкой уксусной солью. – Только скажи государь, мы всем пожертвуем и ничего не пожалеем.
Шиншин еще не успел сказать приготовленную им шутку на патриотизм графа, как Наташа вскочила с своего места и подбежала к отцу.
– Что за прелесть, этот папа! – проговорила она, целуя его, и она опять взглянула на Пьера с тем бессознательным кокетством, которое вернулось к ней вместе с ее оживлением.
– Вот так патриотка! – сказал Шиншин.
– Совсем не патриотка, а просто… – обиженно отвечала Наташа. – Вам все смешно, а это совсем не шутка…
– Какие шутки! – повторил граф. – Только скажи он слово, мы все пойдем… Мы не немцы какие нибудь…
– А заметили вы, – сказал Пьер, – что сказало: «для совещания».
– Ну уж там для чего бы ни было…
В это время Петя, на которого никто не обращал внимания, подошел к отцу и, весь красный, ломающимся, то грубым, то тонким голосом, сказал:
– Ну теперь, папенька, я решительно скажу – и маменька тоже, как хотите, – я решительно скажу, что вы пустите меня в военную службу, потому что я не могу… вот и всё…
Графиня с ужасом подняла глаза к небу, всплеснула руками и сердито обратилась к мужу.
– Вот и договорился! – сказала она.
Но граф в ту же минуту оправился от волнения.
– Ну, ну, – сказал он. – Вот воин еще! Глупости то оставь: учиться надо.
– Это не глупости, папенька. Оболенский Федя моложе меня и тоже идет, а главное, все равно я не могу ничему учиться теперь, когда… – Петя остановился, покраснел до поту и проговорил таки: – когда отечество в опасности.
– Полно, полно, глупости…
– Да ведь вы сами сказали, что всем пожертвуем.
– Петя, я тебе говорю, замолчи, – крикнул граф, оглядываясь на жену, которая, побледнев, смотрела остановившимися глазами на меньшого сына.
– А я вам говорю. Вот и Петр Кириллович скажет…
– Я тебе говорю – вздор, еще молоко не обсохло, а в военную службу хочет! Ну, ну, я тебе говорю, – и граф, взяв с собой бумаги, вероятно, чтобы еще раз прочесть в кабинете перед отдыхом, пошел из комнаты.
– Петр Кириллович, что ж, пойдем покурить…
Пьер находился в смущении и нерешительности. Непривычно блестящие и оживленные глаза Наташи беспрестанно, больше чем ласково обращавшиеся на него, привели его в это состояние.
– Нет, я, кажется, домой поеду…
– Как домой, да вы вечер у нас хотели… И то редко стали бывать. А эта моя… – сказал добродушно граф, указывая на Наташу, – только при вас и весела…
– Да, я забыл… Мне непременно надо домой… Дела… – поспешно сказал Пьер.
– Ну так до свидания, – сказал граф, совсем уходя из комнаты.
– Отчего вы уезжаете? Отчего вы расстроены? Отчего?.. – спросила Пьера Наташа, вызывающе глядя ему в глаза.
«Оттого, что я тебя люблю! – хотел он сказать, но он не сказал этого, до слез покраснел и опустил глаза.
– Оттого, что мне лучше реже бывать у вас… Оттого… нет, просто у меня дела.
– Отчего? нет, скажите, – решительно начала было Наташа и вдруг замолчала. Они оба испуганно и смущенно смотрели друг на друга. Он попытался усмехнуться, но не мог: улыбка его выразила страдание, и он молча поцеловал ее руку и вышел.
Пьер решил сам с собою не бывать больше у Ростовых.


Петя, после полученного им решительного отказа, ушел в свою комнату и там, запершись от всех, горько плакал. Все сделали, как будто ничего не заметили, когда он к чаю пришел молчаливый и мрачный, с заплаканными глазами.
На другой день приехал государь. Несколько человек дворовых Ростовых отпросились пойти поглядеть царя. В это утро Петя долго одевался, причесывался и устроивал воротнички так, как у больших. Он хмурился перед зеркалом, делал жесты, пожимал плечами и, наконец, никому не сказавши, надел фуражку и вышел из дома с заднего крыльца, стараясь не быть замеченным. Петя решился идти прямо к тому месту, где был государь, и прямо объяснить какому нибудь камергеру (Пете казалось, что государя всегда окружают камергеры), что он, граф Ростов, несмотря на свою молодость, желает служить отечеству, что молодость не может быть препятствием для преданности и что он готов… Петя, в то время как он собирался, приготовил много прекрасных слов, которые он скажет камергеру.
Петя рассчитывал на успех своего представления государю именно потому, что он ребенок (Петя думал даже, как все удивятся его молодости), а вместе с тем в устройстве своих воротничков, в прическе и в степенной медлительной походке он хотел представить из себя старого человека. Но чем дальше он шел, чем больше он развлекался все прибывающим и прибывающим у Кремля народом, тем больше он забывал соблюдение степенности и медлительности, свойственных взрослым людям. Подходя к Кремлю, он уже стал заботиться о том, чтобы его не затолкали, и решительно, с угрожающим видом выставил по бокам локти. Но в Троицких воротах, несмотря на всю его решительность, люди, которые, вероятно, не знали, с какой патриотической целью он шел в Кремль, так прижали его к стене, что он должен был покориться и остановиться, пока в ворота с гудящим под сводами звуком проезжали экипажи. Около Пети стояла баба с лакеем, два купца и отставной солдат. Постояв несколько времени в воротах, Петя, не дождавшись того, чтобы все экипажи проехали, прежде других хотел тронуться дальше и начал решительно работать локтями; но баба, стоявшая против него, на которую он первую направил свои локти, сердито крикнула на него:
– Что, барчук, толкаешься, видишь – все стоят. Что ж лезть то!
– Так и все полезут, – сказал лакей и, тоже начав работать локтями, затискал Петю в вонючий угол ворот.
Петя отер руками пот, покрывавший его лицо, и поправил размочившиеся от пота воротнички, которые он так хорошо, как у больших, устроил дома.
Петя чувствовал, что он имеет непрезентабельный вид, и боялся, что ежели таким он представится камергерам, то его не допустят до государя. Но оправиться и перейти в другое место не было никакой возможности от тесноты. Один из проезжавших генералов был знакомый Ростовых. Петя хотел просить его помощи, но счел, что это было бы противно мужеству. Когда все экипажи проехали, толпа хлынула и вынесла и Петю на площадь, которая была вся занята народом. Не только по площади, но на откосах, на крышах, везде был народ. Только что Петя очутился на площади, он явственно услыхал наполнявшие весь Кремль звуки колоколов и радостного народного говора.
Одно время на площади было просторнее, но вдруг все головы открылись, все бросилось еще куда то вперед. Петю сдавили так, что он не мог дышать, и все закричало: «Ура! урра! ура!Петя поднимался на цыпочки, толкался, щипался, но ничего не мог видеть, кроме народа вокруг себя.
На всех лицах было одно общее выражение умиления и восторга. Одна купчиха, стоявшая подле Пети, рыдала, и слезы текли у нее из глаз.
– Отец, ангел, батюшка! – приговаривала она, отирая пальцем слезы.
– Ура! – кричали со всех сторон. С минуту толпа простояла на одном месте; но потом опять бросилась вперед.
Петя, сам себя не помня, стиснув зубы и зверски выкатив глаза, бросился вперед, работая локтями и крича «ура!», как будто он готов был и себя и всех убить в эту минуту, но с боков его лезли точно такие же зверские лица с такими же криками «ура!».
«Так вот что такое государь! – думал Петя. – Нет, нельзя мне самому подать ему прошение, это слишком смело!Несмотря на то, он все так же отчаянно пробивался вперед, и из за спин передних ему мелькнуло пустое пространство с устланным красным сукном ходом; но в это время толпа заколебалась назад (спереди полицейские отталкивали надвинувшихся слишком близко к шествию; государь проходил из дворца в Успенский собор), и Петя неожиданно получил в бок такой удар по ребрам и так был придавлен, что вдруг в глазах его все помутилось и он потерял сознание. Когда он пришел в себя, какое то духовное лицо, с пучком седевших волос назади, в потертой синей рясе, вероятно, дьячок, одной рукой держал его под мышку, другой охранял от напиравшей толпы.
– Барчонка задавили! – говорил дьячок. – Что ж так!.. легче… задавили, задавили!
Государь прошел в Успенский собор. Толпа опять разровнялась, и дьячок вывел Петю, бледного и не дышащего, к царь пушке. Несколько лиц пожалели Петю, и вдруг вся толпа обратилась к нему, и уже вокруг него произошла давка. Те, которые стояли ближе, услуживали ему, расстегивали его сюртучок, усаживали на возвышение пушки и укоряли кого то, – тех, кто раздавил его.
– Этак до смерти раздавить можно. Что же это! Душегубство делать! Вишь, сердечный, как скатерть белый стал, – говорили голоса.
Петя скоро опомнился, краска вернулась ему в лицо, боль прошла, и за эту временную неприятность он получил место на пушке, с которой он надеялся увидать долженствующего пройти назад государя. Петя уже не думал теперь о подаче прошения. Уже только ему бы увидать его – и то он бы считал себя счастливым!
Во время службы в Успенском соборе – соединенного молебствия по случаю приезда государя и благодарственной молитвы за заключение мира с турками – толпа пораспространилась; появились покрикивающие продавцы квасу, пряников, мака, до которого был особенно охотник Петя, и послышались обыкновенные разговоры. Одна купчиха показывала свою разорванную шаль и сообщала, как дорого она была куплена; другая говорила, что нынче все шелковые материи дороги стали. Дьячок, спаситель Пети, разговаривал с чиновником о том, кто и кто служит нынче с преосвященным. Дьячок несколько раз повторял слово соборне, которого не понимал Петя. Два молодые мещанина шутили с дворовыми девушками, грызущими орехи. Все эти разговоры, в особенности шуточки с девушками, для Пети в его возрасте имевшие особенную привлекательность, все эти разговоры теперь не занимали Петю; ou сидел на своем возвышении пушки, все так же волнуясь при мысли о государе и о своей любви к нему. Совпадение чувства боли и страха, когда его сдавили, с чувством восторга еще более усилило в нем сознание важности этой минуты.
Вдруг с набережной послышались пушечные выстрелы (это стреляли в ознаменование мира с турками), и толпа стремительно бросилась к набережной – смотреть, как стреляют. Петя тоже хотел бежать туда, но дьячок, взявший под свое покровительство барчонка, не пустил его. Еще продолжались выстрелы, когда из Успенского собора выбежали офицеры, генералы, камергеры, потом уже не так поспешно вышли еще другие, опять снялись шапки с голов, и те, которые убежали смотреть пушки, бежали назад. Наконец вышли еще четверо мужчин в мундирах и лентах из дверей собора. «Ура! Ура! – опять закричала толпа.
– Который? Который? – плачущим голосом спрашивал вокруг себя Петя, но никто не отвечал ему; все были слишком увлечены, и Петя, выбрав одного из этих четырех лиц, которого он из за слез, выступивших ему от радости на глаза, не мог ясно разглядеть, сосредоточил на него весь свой восторг, хотя это был не государь, закричал «ура!неистовым голосом и решил, что завтра же, чего бы это ему ни стоило, он будет военным.
Толпа побежала за государем, проводила его до дворца и стала расходиться. Было уже поздно, и Петя ничего не ел, и пот лил с него градом; но он не уходил домой и вместе с уменьшившейся, но еще довольно большой толпой стоял перед дворцом, во время обеда государя, глядя в окна дворца, ожидая еще чего то и завидуя одинаково и сановникам, подъезжавшим к крыльцу – к обеду государя, и камер лакеям, служившим за столом и мелькавшим в окнах.
За обедом государя Валуев сказал, оглянувшись в окно:
– Народ все еще надеется увидать ваше величество.
Обед уже кончился, государь встал и, доедая бисквит, вышел на балкон. Народ, с Петей в середине, бросился к балкону.
– Ангел, отец! Ура, батюшка!.. – кричали народ и Петя, и опять бабы и некоторые мужчины послабее, в том числе и Петя, заплакали от счастия. Довольно большой обломок бисквита, который держал в руке государь, отломившись, упал на перилы балкона, с перил на землю. Ближе всех стоявший кучер в поддевке бросился к этому кусочку бисквита и схватил его. Некоторые из толпы бросились к кучеру. Заметив это, государь велел подать себе тарелку бисквитов и стал кидать бисквиты с балкона. Глаза Пети налились кровью, опасность быть задавленным еще более возбуждала его, он бросился на бисквиты. Он не знал зачем, но нужно было взять один бисквит из рук царя, и нужно было не поддаться. Он бросился и сбил с ног старушку, ловившую бисквит. Но старушка не считала себя побежденною, хотя и лежала на земле (старушка ловила бисквиты и не попадала руками). Петя коленкой отбил ее руку, схватил бисквит и, как будто боясь опоздать, опять закричал «ура!», уже охриплым голосом.
Государь ушел, и после этого большая часть народа стала расходиться.
– Вот я говорил, что еще подождать – так и вышло, – с разных сторон радостно говорили в народе.
Как ни счастлив был Петя, но ему все таки грустно было идти домой и знать, что все наслаждение этого дня кончилось. Из Кремля Петя пошел не домой, а к своему товарищу Оболенскому, которому было пятнадцать лет и который тоже поступал в полк. Вернувшись домой, он решительно и твердо объявил, что ежели его не пустят, то он убежит. И на другой день, хотя и не совсем еще сдавшись, но граф Илья Андреич поехал узнавать, как бы пристроить Петю куда нибудь побезопаснее.


15 го числа утром, на третий день после этого, у Слободского дворца стояло бесчисленное количество экипажей.
Залы были полны. В первой были дворяне в мундирах, во второй купцы с медалями, в бородах и синих кафтанах. По зале Дворянского собрания шел гул и движение. У одного большого стола, под портретом государя, сидели на стульях с высокими спинками важнейшие вельможи; но большинство дворян ходило по зале.
Все дворяне, те самые, которых каждый день видал Пьер то в клубе, то в их домах, – все были в мундирах, кто в екатерининских, кто в павловских, кто в новых александровских, кто в общем дворянском, и этот общий характер мундира придавал что то странное и фантастическое этим старым и молодым, самым разнообразным и знакомым лицам. Особенно поразительны были старики, подслеповатые, беззубые, плешивые, оплывшие желтым жиром или сморщенные, худые. Они большей частью сидели на местах и молчали, и ежели ходили и говорили, то пристроивались к кому нибудь помоложе. Так же как на лицах толпы, которую на площади видел Петя, на всех этих лицах была поразительна черта противоположности: общего ожидания чего то торжественного и обыкновенного, вчерашнего – бостонной партии, Петрушки повара, здоровья Зинаиды Дмитриевны и т. п.
Пьер, с раннего утра стянутый в неловком, сделавшемся ему узким дворянском мундире, был в залах. Он был в волнении: необыкновенное собрание не только дворянства, но и купечества – сословий, etats generaux – вызвало в нем целый ряд давно оставленных, но глубоко врезавшихся в его душе мыслей о Contrat social [Общественный договор] и французской революции. Замеченные им в воззвании слова, что государь прибудет в столицу для совещания с своим народом, утверждали его в этом взгляде. И он, полагая, что в этом смысле приближается что то важное, то, чего он ждал давно, ходил, присматривался, прислушивался к говору, но нигде не находил выражения тех мыслей, которые занимали его.
Был прочтен манифест государя, вызвавший восторг, и потом все разбрелись, разговаривая. Кроме обычных интересов, Пьер слышал толки о том, где стоять предводителям в то время, как войдет государь, когда дать бал государю, разделиться ли по уездам или всей губернией… и т. д.; но как скоро дело касалось войны и того, для чего было собрано дворянство, толки были нерешительны и неопределенны. Все больше желали слушать, чем говорить.
Один мужчина средних лет, мужественный, красивый, в отставном морском мундире, говорил в одной из зал, и около него столпились. Пьер подошел к образовавшемуся кружку около говоруна и стал прислушиваться. Граф Илья Андреич в своем екатерининском, воеводском кафтане, ходивший с приятной улыбкой между толпой, со всеми знакомый, подошел тоже к этой группе и стал слушать с своей доброй улыбкой, как он всегда слушал, в знак согласия с говорившим одобрительно кивая головой. Отставной моряк говорил очень смело; это видно было по выражению лиц, его слушавших, и по тому, что известные Пьеру за самых покорных и тихих людей неодобрительно отходили от него или противоречили. Пьер протолкался в середину кружка, прислушался и убедился, что говоривший действительно был либерал, но совсем в другом смысле, чем думал Пьер. Моряк говорил тем особенно звучным, певучим, дворянским баритоном, с приятным грассированием и сокращением согласных, тем голосом, которым покрикивают: «Чеаек, трубку!», и тому подобное. Он говорил с привычкой разгула и власти в голосе.
– Что ж, что смоляне предложили ополченцев госуаю. Разве нам смоляне указ? Ежели буародное дворянство Московской губернии найдет нужным, оно может выказать свою преданность государю импературу другими средствами. Разве мы забыли ополченье в седьмом году! Только что нажились кутейники да воры грабители…
Граф Илья Андреич, сладко улыбаясь, одобрительно кивал головой.
– И что же, разве наши ополченцы составили пользу для государства? Никакой! только разорили наши хозяйства. Лучше еще набор… а то вернется к вам ни солдат, ни мужик, и только один разврат. Дворяне не жалеют своего живота, мы сами поголовно пойдем, возьмем еще рекрут, и всем нам только клич кликни гусай (он так выговаривал государь), мы все умрем за него, – прибавил оратор одушевляясь.
Илья Андреич проглатывал слюни от удовольствия и толкал Пьера, но Пьеру захотелось также говорить. Он выдвинулся вперед, чувствуя себя одушевленным, сам не зная еще чем и сам не зная еще, что он скажет. Он только что открыл рот, чтобы говорить, как один сенатор, совершенно без зубов, с умным и сердитым лицом, стоявший близко от оратора, перебил Пьера. С видимой привычкой вести прения и держать вопросы, он заговорил тихо, но слышно:
– Я полагаю, милостивый государь, – шамкая беззубым ртом, сказал сенатор, – что мы призваны сюда не для того, чтобы обсуждать, что удобнее для государства в настоящую минуту – набор или ополчение. Мы призваны для того, чтобы отвечать на то воззвание, которым нас удостоил государь император. А судить о том, что удобнее – набор или ополчение, мы предоставим судить высшей власти…
Пьер вдруг нашел исход своему одушевлению. Он ожесточился против сенатора, вносящего эту правильность и узкость воззрений в предстоящие занятия дворянства. Пьер выступил вперед и остановил его. Он сам не знал, что он будет говорить, но начал оживленно, изредка прорываясь французскими словами и книжно выражаясь по русски.
– Извините меня, ваше превосходительство, – начал он (Пьер был хорошо знаком с этим сенатором, но считал здесь необходимым обращаться к нему официально), – хотя я не согласен с господином… (Пьер запнулся. Ему хотелось сказать mon tres honorable preopinant), [мой многоуважаемый оппонент,] – с господином… que je n'ai pas L'honneur de connaitre; [которого я не имею чести знать] но я полагаю, что сословие дворянства, кроме выражения своего сочувствия и восторга, призвано также для того, чтобы и обсудить те меры, которыми мы можем помочь отечеству. Я полагаю, – говорил он, воодушевляясь, – что государь был бы сам недоволен, ежели бы он нашел в нас только владельцев мужиков, которых мы отдаем ему, и… chair a canon [мясо для пушек], которую мы из себя делаем, но не нашел бы в нас со… со… совета.
Многие поотошли от кружка, заметив презрительную улыбку сенатора и то, что Пьер говорит вольно; только Илья Андреич был доволен речью Пьера, как он был доволен речью моряка, сенатора и вообще всегда тою речью, которую он последнею слышал.
– Я полагаю, что прежде чем обсуждать эти вопросы, – продолжал Пьер, – мы должны спросить у государя, почтительнейше просить его величество коммюникировать нам, сколько у нас войска, в каком положении находятся наши войска и армии, и тогда…
Но Пьер не успел договорить этих слов, как с трех сторон вдруг напали на него. Сильнее всех напал на него давно знакомый ему, всегда хорошо расположенный к нему игрок в бостон, Степан Степанович Апраксин. Степан Степанович был в мундире, и, от мундира ли, или от других причин, Пьер увидал перед собой совсем другого человека. Степан Степанович, с вдруг проявившейся старческой злобой на лице, закричал на Пьера:
– Во первых, доложу вам, что мы не имеем права спрашивать об этом государя, а во вторых, ежели было бы такое право у российского дворянства, то государь не может нам ответить. Войска движутся сообразно с движениями неприятеля – войска убывают и прибывают…
Другой голос человека, среднего роста, лет сорока, которого Пьер в прежние времена видал у цыган и знал за нехорошего игрока в карты и который, тоже измененный в мундире, придвинулся к Пьеру, перебил Апраксина.
– Да и не время рассуждать, – говорил голос этого дворянина, – а нужно действовать: война в России. Враг наш идет, чтобы погубить Россию, чтобы поругать могилы наших отцов, чтоб увезти жен, детей. – Дворянин ударил себя в грудь. – Мы все встанем, все поголовно пойдем, все за царя батюшку! – кричал он, выкатывая кровью налившиеся глаза. Несколько одобряющих голосов послышалось из толпы. – Мы русские и не пожалеем крови своей для защиты веры, престола и отечества. А бредни надо оставить, ежели мы сыны отечества. Мы покажем Европе, как Россия восстает за Россию, – кричал дворянин.
Пьер хотел возражать, но не мог сказать ни слова. Он чувствовал, что звук его слов, независимо от того, какую они заключали мысль, был менее слышен, чем звук слов оживленного дворянина.
Илья Андреич одобривал сзади кружка; некоторые бойко поворачивались плечом к оратору при конце фразы и говорили:
– Вот так, так! Это так!
Пьер хотел сказать, что он не прочь ни от пожертвований ни деньгами, ни мужиками, ни собой, но что надо бы знать состояние дел, чтобы помогать ему, но он не мог говорить. Много голосов кричало и говорило вместе, так что Илья Андреич не успевал кивать всем; и группа увеличивалась, распадалась, опять сходилась и двинулась вся, гудя говором, в большую залу, к большому столу. Пьеру не только не удавалось говорить, но его грубо перебивали, отталкивали, отворачивались от него, как от общего врага. Это не оттого происходило, что недовольны были смыслом его речи, – ее и забыли после большого количества речей, последовавших за ней, – но для одушевления толпы нужно было иметь ощутительный предмет любви и ощутительный предмет ненависти. Пьер сделался последним. Много ораторов говорило после оживленного дворянина, и все говорили в том же тоне. Многие говорили прекрасно и оригинально.
Издатель Русского вестника Глинка, которого узнали («писатель, писатель! – послышалось в толпе), сказал, что ад должно отражать адом, что он видел ребенка, улыбающегося при блеске молнии и при раскатах грома, но что мы не будем этим ребенком.
– Да, да, при раскатах грома! – повторяли одобрительно в задних рядах.
Толпа подошла к большому столу, у которого, в мундирах, в лентах, седые, плешивые, сидели семидесятилетние вельможи старики, которых почти всех, по домам с шутами и в клубах за бостоном, видал Пьер. Толпа подошла к столу, не переставая гудеть. Один за другим, и иногда два вместе, прижатые сзади к высоким спинкам стульев налегающею толпой, говорили ораторы. Стоявшие сзади замечали, чего не досказал говоривший оратор, и торопились сказать это пропущенное. Другие, в этой жаре и тесноте, шарили в своей голове, не найдется ли какая мысль, и торопились говорить ее. Знакомые Пьеру старички вельможи сидели и оглядывались то на того, то на другого, и выражение большей части из них говорило только, что им очень жарко. Пьер, однако, чувствовал себя взволнованным, и общее чувство желания показать, что нам всё нипочем, выражавшееся больше в звуках и выражениях лиц, чем в смысле речей, сообщалось и ему. Он не отрекся от своих мыслей, но чувствовал себя в чем то виноватым и желал оправдаться.
– Я сказал только, что нам удобнее было бы делать пожертвования, когда мы будем знать, в чем нужда, – стараясь перекричать другие голоса, проговорил он.
Один ближайший старичок оглянулся на него, но тотчас был отвлечен криком, начавшимся на другой стороне стола.
– Да, Москва будет сдана! Она будет искупительницей! – кричал один.
– Он враг человечества! – кричал другой. – Позвольте мне говорить… Господа, вы меня давите…


В это время быстрыми шагами перед расступившейся толпой дворян, в генеральском мундире, с лентой через плечо, с своим высунутым подбородком и быстрыми глазами, вошел граф Растопчин.
– Государь император сейчас будет, – сказал Растопчин, – я только что оттуда. Я полагаю, что в том положении, в котором мы находимся, судить много нечего. Государь удостоил собрать нас и купечество, – сказал граф Растопчин. – Оттуда польются миллионы (он указал на залу купцов), а наше дело выставить ополчение и не щадить себя… Это меньшее, что мы можем сделать!
Начались совещания между одними вельможами, сидевшими за столом. Все совещание прошло больше чем тихо. Оно даже казалось грустно, когда, после всего прежнего шума, поодиночке были слышны старые голоса, говорившие один: «согласен», другой для разнообразия: «и я того же мнения», и т. д.
Было велено секретарю писать постановление московского дворянства о том, что москвичи, подобно смолянам, жертвуют по десять человек с тысячи и полное обмундирование. Господа заседавшие встали, как бы облегченные, загремели стульями и пошли по зале разминать ноги, забирая кое кого под руку и разговаривая.
– Государь! Государь! – вдруг разнеслось по залам, и вся толпа бросилась к выходу.
По широкому ходу, между стеной дворян, государь прошел в залу. На всех лицах выражалось почтительное и испуганное любопытство. Пьер стоял довольно далеко и не мог вполне расслышать речи государя. Он понял только, по тому, что он слышал, что государь говорил об опасности, в которой находилось государство, и о надеждах, которые он возлагал на московское дворянство. Государю отвечал другой голос, сообщавший о только что состоявшемся постановлении дворянства.
– Господа! – сказал дрогнувший голос государя; толпа зашелестила и опять затихла, и Пьер ясно услыхал столь приятно человеческий и тронутый голос государя, который говорил: – Никогда я не сомневался в усердии русского дворянства. Но в этот день оно превзошло мои ожидания. Благодарю вас от лица отечества. Господа, будем действовать – время всего дороже…
Государь замолчал, толпа стала тесниться вокруг него, и со всех сторон слышались восторженные восклицания.
– Да, всего дороже… царское слово, – рыдая, говорил сзади голос Ильи Андреича, ничего не слышавшего, но все понимавшего по своему.
Из залы дворянства государь прошел в залу купечества. Он пробыл там около десяти минут. Пьер в числе других увидал государя, выходящего из залы купечества со слезами умиления на глазах. Как потом узнали, государь только что начал речь купцам, как слезы брызнули из его глаз, и он дрожащим голосом договорил ее. Когда Пьер увидал государя, он выходил, сопутствуемый двумя купцами. Один был знаком Пьеру, толстый откупщик, другой – голова, с худым, узкобородым, желтым лицом. Оба они плакали. У худого стояли слезы, но толстый откупщик рыдал, как ребенок, и все твердил:
– И жизнь и имущество возьми, ваше величество!
Пьер не чувствовал в эту минуту уже ничего, кроме желания показать, что все ему нипочем и что он всем готов жертвовать. Как упрек ему представлялась его речь с конституционным направлением; он искал случая загладить это. Узнав, что граф Мамонов жертвует полк, Безухов тут же объявил графу Растопчину, что он отдает тысячу человек и их содержание.
Старик Ростов без слез не мог рассказать жене того, что было, и тут же согласился на просьбу Пети и сам поехал записывать его.
На другой день государь уехал. Все собранные дворяне сняли мундиры, опять разместились по домам и клубам и, покряхтывая, отдавали приказания управляющим об ополчении, и удивлялись тому, что они наделали.



Наполеон начал войну с Россией потому, что он не мог не приехать в Дрезден, не мог не отуманиться почестями, не мог не надеть польского мундира, не поддаться предприимчивому впечатлению июньского утра, не мог воздержаться от вспышки гнева в присутствии Куракина и потом Балашева.
Александр отказывался от всех переговоров потому, что он лично чувствовал себя оскорбленным. Барклай де Толли старался наилучшим образом управлять армией для того, чтобы исполнить свой долг и заслужить славу великого полководца. Ростов поскакал в атаку на французов потому, что он не мог удержаться от желания проскакаться по ровному полю. И так точно, вследствие своих личных свойств, привычек, условий и целей, действовали все те неперечислимые лица, участники этой войны. Они боялись, тщеславились, радовались, негодовали, рассуждали, полагая, что они знают то, что они делают, и что делают для себя, а все были непроизвольными орудиями истории и производили скрытую от них, но понятную для нас работу. Такова неизменная судьба всех практических деятелей, и тем не свободнее, чем выше они стоят в людской иерархии.
Теперь деятели 1812 го года давно сошли с своих мест, их личные интересы исчезли бесследно, и одни исторические результаты того времени перед нами.
Но допустим, что должны были люди Европы, под предводительством Наполеона, зайти в глубь России и там погибнуть, и вся противуречащая сама себе, бессмысленная, жестокая деятельность людей – участников этой войны, становится для нас понятною.
Провидение заставляло всех этих людей, стремясь к достижению своих личных целей, содействовать исполнению одного огромного результата, о котором ни один человек (ни Наполеон, ни Александр, ни еще менее кто либо из участников войны) не имел ни малейшего чаяния.
Теперь нам ясно, что было в 1812 м году причиной погибели французской армии. Никто не станет спорить, что причиной погибели французских войск Наполеона было, с одной стороны, вступление их в позднее время без приготовления к зимнему походу в глубь России, а с другой стороны, характер, который приняла война от сожжения русских городов и возбуждения ненависти к врагу в русском народе. Но тогда не только никто не предвидел того (что теперь кажется очевидным), что только этим путем могла погибнуть восьмисоттысячная, лучшая в мире и предводимая лучшим полководцем армия в столкновении с вдвое слабейшей, неопытной и предводимой неопытными полководцами – русской армией; не только никто не предвидел этого, но все усилия со стороны русских были постоянно устремляемы на то, чтобы помешать тому, что одно могло спасти Россию, и со стороны французов, несмотря на опытность и так называемый военный гений Наполеона, были устремлены все усилия к тому, чтобы растянуться в конце лета до Москвы, то есть сделать то самое, что должно было погубить их.
В исторических сочинениях о 1812 м годе авторы французы очень любят говорить о том, как Наполеон чувствовал опасность растяжения своей линии, как он искал сражения, как маршалы его советовали ему остановиться в Смоленске, и приводить другие подобные доводы, доказывающие, что тогда уже будто понята была опасность кампании; а авторы русские еще более любят говорить о том, как с начала кампании существовал план скифской войны заманивания Наполеона в глубь России, и приписывают этот план кто Пфулю, кто какому то французу, кто Толю, кто самому императору Александру, указывая на записки, проекты и письма, в которых действительно находятся намеки на этот образ действий. Но все эти намеки на предвидение того, что случилось, как со стороны французов так и со стороны русских выставляются теперь только потому, что событие оправдало их. Ежели бы событие не совершилось, то намеки эти были бы забыты, как забыты теперь тысячи и миллионы противоположных намеков и предположений, бывших в ходу тогда, но оказавшихся несправедливыми и потому забытых. Об исходе каждого совершающегося события всегда бывает так много предположений, что, чем бы оно ни кончилось, всегда найдутся люди, которые скажут: «Я тогда еще сказал, что это так будет», забывая совсем, что в числе бесчисленных предположений были делаемы и совершенно противоположные.
Предположения о сознании Наполеоном опасности растяжения линии и со стороны русских – о завлечении неприятеля в глубь России – принадлежат, очевидно, к этому разряду, и историки только с большой натяжкой могут приписывать такие соображения Наполеону и его маршалам и такие планы русским военачальникам. Все факты совершенно противоречат таким предположениям. Не только во все время войны со стороны русских не было желания заманить французов в глубь России, но все было делаемо для того, чтобы остановить их с первого вступления их в Россию, и не только Наполеон не боялся растяжения своей линии, но он радовался, как торжеству, каждому своему шагу вперед и очень лениво, не так, как в прежние свои кампании, искал сражения.
При самом начале кампании армии наши разрезаны, и единственная цель, к которой мы стремимся, состоит в том, чтобы соединить их, хотя для того, чтобы отступать и завлекать неприятеля в глубь страны, в соединении армий не представляется выгод. Император находится при армии для воодушевления ее в отстаивании каждого шага русской земли, а не для отступления. Устроивается громадный Дрисский лагерь по плану Пфуля и не предполагается отступать далее. Государь делает упреки главнокомандующим за каждый шаг отступления. Не только сожжение Москвы, но допущение неприятеля до Смоленска не может даже представиться воображению императора, и когда армии соединяются, то государь негодует за то, что Смоленск взят и сожжен и не дано пред стенами его генерального сражения.
Так думает государь, но русские военачальники и все русские люди еще более негодуют при мысли о том, что наши отступают в глубь страны.
Наполеон, разрезав армии, движется в глубь страны и упускает несколько случаев сражения. В августе месяце он в Смоленске и думает только о том, как бы ему идти дальше, хотя, как мы теперь видим, это движение вперед для него очевидно пагубно.
Факты говорят очевидно, что ни Наполеон не предвидел опасности в движении на Москву, ни Александр и русские военачальники не думали тогда о заманивании Наполеона, а думали о противном. Завлечение Наполеона в глубь страны произошло не по чьему нибудь плану (никто и не верил в возможность этого), а произошло от сложнейшей игры интриг, целей, желаний людей – участников войны, не угадывавших того, что должно быть, и того, что было единственным спасением России. Все происходит нечаянно. Армии разрезаны при начале кампании. Мы стараемся соединить их с очевидной целью дать сражение и удержать наступление неприятеля, но и этом стремлении к соединению, избегая сражений с сильнейшим неприятелем и невольно отходя под острым углом, мы заводим французов до Смоленска. Но мало того сказать, что мы отходим под острым углом потому, что французы двигаются между обеими армиями, – угол этот делается еще острее, и мы еще дальше уходим потому, что Барклай де Толли, непопулярный немец, ненавистен Багратиону (имеющему стать под его начальство), и Багратион, командуя 2 й армией, старается как можно дольше не присоединяться к Барклаю, чтобы не стать под его команду. Багратион долго не присоединяется (хотя в этом главная цель всех начальствующих лиц) потому, что ему кажется, что он на этом марше ставит в опасность свою армию и что выгоднее всего для него отступить левее и южнее, беспокоя с фланга и тыла неприятеля и комплектуя свою армию в Украине. А кажется, и придумано это им потому, что ему не хочется подчиняться ненавистному и младшему чином немцу Барклаю.
Император находится при армии, чтобы воодушевлять ее, а присутствие его и незнание на что решиться, и огромное количество советников и планов уничтожают энергию действий 1 й армии, и армия отступает.
В Дрисском лагере предположено остановиться; но неожиданно Паулучи, метящий в главнокомандующие, своей энергией действует на Александра, и весь план Пфуля бросается, и все дело поручается Барклаю, Но так как Барклай не внушает доверия, власть его ограничивают.