К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 86
Текст из файла (страница 86)
Однако высокопроизводительные процессоры работают на частоте, значительно превышающей частоту системной шины — как правило, в десятки раз. Поэтому давайте рассмотрим, как кэш влияет на систему такого типа. Пример 5.3 Предположим, у нас имеется один кэш, реализованный на микросхеме процессора, и основная память на основе микросхем ЯРКАМ. Мы также предполагаем, что тактовая частота системной шины в два раза меньше тактовой частоты процессора. Как и в примере 5.2, кэш состоит из блоков по 8 слов, и частота попаданий в кэш составляет 0,95 для команд и 0,9 для данных. Временная диаграмма ЯРКАМ такая же, как на рис. 5.9. Единственным ее отличием является то, что пакет состоит не нз четырех а из восьми слов данных. Таким образом, в соответствии с рис.
5.9, с момента выдачи сигнала КАК на пересылку блока данных между основной памятью и кэшем уходит 14 тактов. Поскольку сигналы КА3 н САБ генерируются контроллером памяти (рис. 5,11), необходим еще один такт, в течение которого процессор должен отослать контроллеру памяти адрес первого слова блока. Следовательно, всего на пересылку блока требуется 15 тактов. Такты, показанные на рис. 5.9, — это такты системной шины.
Если тактовая частота процессора вчетверо выше, на пересылку блока из восьми слов между процессором и основной памятью уходит 60 тактов процессора. Обратите внимание, что в схеме, представленной на рис. 5.9, на пересылку одного слова между процессором и основой памятью требуется 9 тактов шины — 8 тактов, показанных на рис. 5.9, плюс один такт, необходимый для пересылки адреса контроллеру памяти. Как видите, на доступ к одному слову основной памяти уходит 36 тактов процессора.И это несмотря на то, что обращение к слову в каше выполняется за один такт процессора! 5.6.
Производительность 369 Вот что получается, если повторить вычисления из примера 5.2 для других исходных данных: Время без кзша 130 х 36 Время с хашем 100(0,95 х 1+ 0,05 х 60) + 30(0,9 х 1+ 0,1 х 60) = 7,77 Таким образом, если учесть различие в скорости функционирования процессора и системной шины, кэш дает даже больший выигрыш в производительности. В предшествующих примерах мы различали частоту попаданий в кэш для данных и для команд.
Хотя в обоих случаях она может превышать 0,9, обычно для команд этот показатель выше, чем для данных. В общем случае частота попаданий зависит от организации каша и от схемы доступа к командам н данным, осуществляемого конкретной программой. Как же повысить частоту попаданий? Очевидно, это можно сделать путем увеличения объема каша, но не следует забывать, что при этом возрастет его стоимость.
Второй способ заключается в увеличении размера блока при неизменном общем размере кэша, что даст возможность полнее использовать свойство локализации ссылок в пространстве. Если для вычислений необходимы все элементы большого блока, лучше всего загружать их в кэш одним большим массивом, а не по частям. При этом можно будет воспользоваться преимуществами параллельного доступа к данным в памяти с чередованием адресов. 11о увеличение размера блока не может быть беспредельным, поскольку начиная с некоторого момента частота попаданий уже не только не повышается, но даже начинает снижаться.
Если блок слишком велик, то, пока он находится в кэше, к некоторым его элементам вообще не выполняются обращения. Другими словами, чтобы достичь наивысшей производительности, необходимо подобрать оптимальный размер блока. На практике чаще всего используются блоки размером от 16 до 128 байт. Напоследок отметим, что способ сокращения накладных расходов промаха все-таки существует. Он заключается в использовании технологии сквозной загрузки, применяемой при считывании в кэш новых блоков команд и данных.
Суть ее состоит в следуюшем; вместо того чтобы ожидать пересылку из памяти всего баока, процессор должен продолжать свою работу, как только в каше окажется необходимое слово. 5.6.3. Кеши на микросхеме процессора Когда информация пересылается между разными микросхемами, во входных и выходных вентилях микросхем происходят значительные задержки. Следовательно, самым оптимальным решением, способным увеличить скорость функционирования каша, является размещение его на микросхеме процессора. Однако пространство на микросхеме процессора предназначается н для многих других функций, поэтому возможный размер кэша здесь очень ограничен.
Микросхемы всех высокопроизводительных процессоров содержат хотя бы небольшой кэш. Некоторые процессоры, и в частности процессоры 68040, Реп11- вш 1П, РепГшш 4, имеют по два отдельных кеша, один для команд, а другой для 370 Глава 5. Система памяти данных. К числу тех, которые ограничиваются единым кешем, относится процессор АКМ710Т. Комбинированный кэш для команд и данных может обеспечить более высокую частоту попаданий, поскольку он гибче в отношении размещения новых данных, но зато к раздельным кашам возможен одновременный доступ, что также ведет к повышению производительности. Недостатком раздельных кашей является сложность управляющих схем.
Обычно высокопроизводительные процессоры имеют два уровня кэш-памяти. Кэш 1.1 интегрируется в микросхему процессора, а кэш 1.2 чаще всего бывает внешним, имеет больший объем и реализуется на основе микросхемы ЯКАМ. Случается, что и кзш второго уровня интегрируют в микросхему процессора, как в процессоре Реп1ппп П1 версии Сорреппше, о котором рассказывалось в разделе 5.5.4 (в таком случае его объем несколько меньше, чем у внешнего каша). Если процессор имеет два уровня кэш-памяти, доступ к кашу первого уровня должен выполняться предельно быстро, чтобы не задерживать работу процессора.
Правда, доступ к кашу не может осуществляться так же быстро, как к регистрам, поскольку кзш намного больше и сложнее по своей структуре. Поэтому доступ к кашу обычно ускоряют путем параллельного доступа к нескольким словам, которые затем по очереди используются процессором. Эта технология применяется во многих современных процессорах. Кэш второго уровня может быть более медленным, но он должен иметь больший объем, чтобы обеспечить высокую частоту попаданий.
Скорость его функционирования имеет сравнительно небольшое значение, поскольку она влияет только на накладные расходы, связанные с промахами кзша 1.1. Типичная рабочая станция может содержать кзш первого уровня объемом в несколько десятков килобайтов и кэш второго уровня объемом в несколько мегабайтов. Наличие каша второго уровня значительно снижает влияние скорости основной памяти на производительность компьютера. Среднее время доступа к памяти, каким оно представляется процессору в системе с двухуровневым кэшем, рассчитывается следующим образом: г, - Ь1С1 + (1 — 61)лзСз + (1 — Ь1)(1 — Ьз)М где: Ь1 — частота попаданий в кэш Е1; Ьз — частота попаданий в кэш Е2; С~ — время доступа к информации в каше Е1; Сз — время доступа к информации в каше 1.2; М вЂ” время доступа к информации в основной памяти. Количество промахов каша Е2, определяемое выражением (1 — Ь1)(1 — л2), должно быть предельно низким.
Если значения Ь1 и Ьз составляют порядка 90 Х, то общее количество промахов, требующих обращения к основной памяти, составит менее 1 Х. Таким образом, накладные расходы М с точки зрения производительности будут очень незначительны. В упражнении 5.18 вам предлагается выполнить количественную оценку соответствующих показателей. 5.6. Производительность 371 5.6.4.
Другие способы увеличения быстродействия Кроме уже рассмотренных нами ключевых конструкторских решений существует еще несколько возможностей повышения производительности системы памяти. О трех из них рассказывается в настоящем разделе. Буферизация записи При использовании протокола сквозной записи каждой операции записи соответствует операция сохранения нового значения в основной памяти.
Если процессор будет ждать окончания этой операции, его работа очень сильно замедлится. Однако дальнейшая работа процессора в ближайшее время, как правило, не зависит от результата операции записи, так что ему незачем дожидаться ее завершения. А раз так, в систему памяти можно добавить буфер записи, предназначенный для временного хранения результатов операций записи. Процессор должен поместить в него запрос на запись и продолжать свою работу.
А тем временем, уже без его участия, запрос будет отослан в основную память, когда та не будет занята выполнением запросов на чтение. Запросы на чтение должны обслуживаться немедленно, поскольку процессор обычно не может продолжать работу без тех данных, которые он запросил. Поэтому у запросов на чтение более высокий приоритет, чем у запросов на запись.
В буфере записи может скопиться много запросов. Поэтому не исключены ситуации, когда запросы на чтение ссылаются на данные, которые еще находятся в буфере записи. Для обеспечения корректной работы системы адреса данных, подлежащих чтению из памяти, обязательно сравниваются с адресами в буфере записи, и в случае их совпадения используются данные из буфера записи. При использовании протокола обратной записи ситуация становится несколько иной. В этом случае в результате операции записи изменяются только данные в кзше. Но что происходит, когда по причине промаха нужно прочитать в кэш новый блок данных, поместив его на место блока с измененными и еще не сохраненными данными? Перед удалением из каша измененный блок, конечно же, записывается в основную память.
Если обратная запись производится часто, процессору приходится подолгу дожидаться выполнения операции чтения из памяти очередного блока данных. Поэтому разумнее сначала прочитать новый блок, чтобы процессор мог продолжить работу, а потом заняться записью в память удаленного из хаша блока. Для этого нужен быстрый буфер записи, куда перед чтением нового блока будет временно помещаться старый. Когда новый блок будет прочитан из основной памяти, в нее можно будет записать содержимое старого блока. Как видите, буфер записи необходим при любом из протоколов записи. Упреждающая выборка Рассказывая о технологиях кэширования, мы предполагали, что данные копируются в кэш тогда, когда они нужны процессору. Это означает, что процессор обращается к памяти, и если в каше не оказывается нужных данных, таковые загружаются из основной памяти.