Команды работы со стеком.

Запись слова в стек

push операнд — запись значения операнд в вершину стека.

Чтение слова из стека

pop операнд — запись значения из вершины стека по месту, указанному операндом.

!!!Операндом не может быть регистр CS

!!! Команды PUSH и POP не осуществляют проверку на выход за пределы стека.

Например, если стек пуст, а мы считываем слово из стека, будет считано слово за сегментом стека.

Использование стека

· для временного сохранения значений регистров

например, push cx

. . . ; например во вложенных циклах

pop cx

· для сохранения текущих состояний флагов и последующего их восстановления

pushf

popf

· для определения или изменения состояния любого флага

· для пересылки данных

например, X:=Y push Y

pop X

· при работе с процедурами;

· при определении локальных переменных.

 

29. Иерархия памяти. Кэш памяти.

 

Две возможные стратегии для ускорения быстродействия– уменьшение времени отклика или упреждающий запрос нужной памяти.

Использование регистров и оперативной памяти.

Регистры – самые быстрые элементы памяти, РѕРЅРё находятся непосредственно РЅР° СЏРґСЂРµ, Рё доступ Рє РЅРёРј практически мгновенный. Если ваша программа делает какие-то вычисления, хотелось Р±С‹, чтобы РІСЃРµ промежуточные данные хранились РЅР° регистрах. Понятно, что это невозможно. РћРґРЅР° РёР· возможных проблем производительности– это проблема вытеснения регистров. РљРѕРіРґР° РІС‹ РїРѕРґ каким-РЅРёР±СѓРґСЊ анализатором производительности смотрите РЅР° ассемблерный РєРѕРґ, РІС‹ видите, что Сѓ вас очень РјРЅРѕРіРѕ движения СЃРѕ стека РІ регистры Рё обратно выгрузка регистров РЅР° стек. Стоит РІРѕРїСЂРѕСЃ – как оптимизировать РєРѕРґ так, чтобы самые горячие адреса, самые горячие промежуточные данные, лежали именно РЅР° системных регистрах.

Следующая часть памяти – это обычная оперативная память. С ростом производительности процессоров стало ясно, что самым узким местом производительности является доступ к оперативной памяти. Для того, чтобы добраться до оперативной памяти, нужны сотня, а то и две сотни тактов процессора. То есть, запросив какую-то ячейку памяти в оперативной памяти, мы будем ждать двести тактов, а процессор будет простаивать.

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

 

Кэширование

Кэш-память служит для уменьшения времени доступа к данным.

Для этого блоки оперативной памяти отображаются в более быструю кэш-память.

Если адрес памяти находится в кэше – происходит "попадание" и скорость получения данных значительно увеличивается.

В противном случае – "промах" (cash miss)

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

Можно выделить следующие виды кэш-памяти:

· полностью ассоциативная кэш-память (каждый блок может отображаться в любое место кэша)

· память с прямым отображением (каждый блок может отображаться в одно место)

· гибридные варианты (секторная память, память с множественно-ассоциативным доступом)

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

Качество использования кэша – ключевое условие быстродействия.

Дополнительная информация: в современных IA32 системах размер кэш-линии 64 байта.

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

Существуют разные реализации РєСЌС€-памяти. Бывает полностью ассоциативная РєСЌС€-память, РєРѕРіРґР° каждый блок может отображаться РІ любое место кэша. Существует память СЃ прямым отображением, РєРѕРіРґР° каждый блок может отображаться РІ РѕРґРЅРѕ место, также существуют различные гибридные варианты – например РєСЌС€ СЃ множественно-ассоциативным доступом. Р’ чем разница? Разница РІРѕ времени Рё сложности проверки РЅР° наличие нужного адреса РІ РєСЌС€-памяти. Предположим, что нам нужен определенный адрес. Р’ случае СЃ ассоциативной памятью нам нужно проверить весь РєСЌС€ – убедиться, что этого адреса РІ кэше нет. Р’ случае СЃ прямым отображением нам нужно проверить только РѕРґРЅСѓ ячейку. Р’ случае СЃ гибридными вариантами, например, РєРѕРіРґР° используется РєСЌС€ СЃ множественно-ассоциативным доступом, нам нужно проверить, Рє примеру, четыре или восемь ячеек. РўРѕ есть, задача определить есть ли адрес РІ кэша – тоже важна. Качество использования кэша – важное условие быстродействия. Если нам удастся написать программу так, чтобы как можно чаще те данные, СЃ которыми РјС‹ собирались работать, находились РІ кэше, то такая программа будет работать гораздо быстрее.

Характерные времена отклика при обращении к кэш памяти для Nehalem i7:

В· L1 - latency 4

В· L2 - latency 11

В· L3 - latency 38

Время отклика для оперативной памяти > 100

Упреждающий механизм доступа к памяти реализован при помощи механизма упреждающей выборки (hardware prefetching).

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

Для примера возьмем наш последний процессор Nehalem: i7.

Здесь мы имеем не просто кэш, а некий иерархический кэш. Долгое время он был двухуровневый, в современной системе Nehalem он трехуровневый – совсем немного очень быстрого кэша, чуть побольше кэша второго уровня и достаточно большое количество кэша третьего уровня. При этом, эта система построена так, что если какой-то адрес находится в кэше первого уровня, он автоматически находится во втором и в третьем уровнях. Это и есть иерархическая система. Для кэша первого уровня задержка – 4 такта, для второго – 11, третьего – 38 и время отклика оперативной памяти – больше 100 тактов процессора.

Принцип локальности. Качество упреждающей выборки.

Локальность ссылки (locality of reference) – повторное использование переменных или взаимосвязанных данных. Различают временную локальность (temporal locality) – РєРѕРіРґР° речь идет РѕР± РѕРґРЅРёС… Рё тех же данных Рё пространственную локальность (spatial locality) – использование различных данных, имеющих относительно близкие области хранения.

Механизм кэширования использует принцип временной локальности. (Стремится сохранять в кэше наиболее часто используемые данные).

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

Кэш aliasing – из-за неудачного расположения в памяти различных объектов, участвующих в вычислении, происходит вытеснению из кэш памяти одних адресов другими.

Второй вариант улучшения быстродействия и работы с памятью, про который мы упомянули – это подкладывать в кэш заранее необходимые адреса – упреждающий механизм доступа к памяти (Hardware Prefetching). Этот механизм выявляет закономерности, с которыми вы обращаетесь к памяти, и заранее закачивает в кэш адреса, которые могут вам понадобиться. Если вы обрабатываете несколько массивов, движетесь по ним последовательно или с каким-то постоянным шагом, то, скорее всего, этот механизм начнет эти адреса заранее подгружать. Есть специальный набор инструкций, позволяющий загрузить в кэш память, расположенную по определенному адресу. (Software Prefetching)

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

Локальность ссылки – переиспользование переменных или взаимосвязанных данных. Различают временную локальность – переиспользование определенных данных Рё ресурсов Рё пространственную локальность - использование данных, имеющих относительно близкие области хранения.

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

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

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

Иерархическая структура памяти является традиционным решением проблемы

хранения большого количества данных Она изображена на рис. 2.15. На самом

верху находятся регистры процессора. Доступ к регистрам осуществляется быст-

рее всего. Дальше идет кэш-память, объем которой сейчас составляет от 32 Кбайт

до нескольких мегабайт. Затем следует основная пам'ять. Далее идут магнитные

диски и, наконец, накопители на магнитной ленте и оптические диски, которые

используются для хранения архивной информации.

 

РРёСЃ. 2.15. Пятиуровневая организация памяти

По мере продвижения по структуре сверху вниз возрастают три параметра. Во-

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

наносекунд, доступ к кэш-памяти — немного больше, доступ к основной памяти —

несколько десятков наносекунд. Дальше идет большой разрыв: доступ к дискам

занимает по крайней мере 10 мке, а время доступа к магнитным лентам и оптичес-

ким дискам вообще может измеряться в секундах (поскольку эти накопители ин-

формации еще нужно взять и поместить в соответствующее устройство).

Р’Рѕ-вторых, увеличивается объем памяти. Регистры РјРѕРіСѓС‚ содержать РІ лучшем

случае 128 байтов, кэш-память — несколько мегабайтов, основная память — десятки

тысяч мегабайтов, магнитные диски — от нескольких гигабайтов до нескольких

десятков гигабайтов. Магнитные ленты и оптические диски хранятся автономно

от компьютера, поэтому их объем ограничивается только финансовыми возмож-

ностями владельца.

В-третьих, увеличивается количество битов, которое вы получаете за 1 доллар.

Стоимость объема основной памяти измеряется в долларах за мегабайт1, объем

магнитных дисков — в пенни за мегабайт, а объем магнитной ленты — в долларах

за гигабайт или еще дешевле.

Регистры, РєСЌС€-память Рё РѕСЃРЅРѕРІРЅСѓСЋ память РјС‹ уже рассмотрели. Р’ следующих

разделах мы расскажем о магнитных дисках, а затем приступим к изучению оп-

тических дисков. Накопители на магнитных лентах мы рассматривать не будем,

поскольку они очень редко используются; к тому же о них практически нечего

сказать.

КЭШ памяти.

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

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

Уровни кэша

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

· Самым быстрым является кэш первого уровня — L1 cache (level 1 cache). По сути, она является неотъемлемой частью процессора, поскольку расположена на одном с ним кристалле и входит в состав функциональных блоков. В современных процессорах обычно L1 разделен на два кэша — кэш команд (инструкций) и кэш данных (Гарвардская архитектура). Большинство процессоров без L1 не могут функционировать. L1 работает на частоте процессора, и, в общем случае, обращение к нему может производиться каждыйтакт. Зачастую является возможным выполнять несколько операций чтения/записи одновременно.

· Вторым по быстродействию является кэш второго уровня — L2 cache, который обычно, как и L1, расположен на одном кристалле с процессором. В ранних версиях процессоров L2 реализован в виде отдельного набора микросхем памяти на материнской плате. Объём L2 от 128 кбайт до 1−12 Мбайт. В современных многоядерных процессорах кэш второго уровня, находясь на том же кристалле, является памятью раздельного пользования — при общем объёме кэша в nM Мбайт на каждое ядро приходится по nM/nCМбайта, где nC — количество ядер процессора.

· Кэш третьего уровня наименее быстродействующий, но он может быть очень большим — более 24 Мбайт. L3 медленнее предыдущих кэшей, но всё равно значительно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании и предназначен для синхронизации данных различных L2.

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