|
|
|||||||
Команды работы со стеком.Запись слова в стек 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, объем магнитных дисков — в пенни за мегабайт, а объем магнитной ленты — в долларах за гигабайт или еще дешевле. егистры, кэш-память и основную память мы уже рассмотрели. В следующих разделах мы расскажем о магнитных дисках, а затем приступим к изучению оп- тических дисков. Накопители на магнитных лентах мы рассматривать не будем, поскольку они очень редко используются; к тому же о них практически нечего сказать.
|
||||||||
|