К. Касперски - Техника оптимизации программ, Эффективное использование памяти (1127752), страница 26
Текст из файла (страница 26)
Отнюдь! Инженерный опыт, приобретенный в процессе создания этой, не побоюсь сказать, чрезвычайно высокотехнологичной памяти, несомненно, найдет себе применение в дальнейших разработках. Взять хотя бы машину Бэббиджа. Согласитесь, несмотря на передовые идеи, ее реальное воплощение проигрывало по всем позициям даже конторским счетам. Аналогично и с Р!гесг КРКАМ. Достичь пропускной способности в 1,6 Гбайт/с можно и более простыми путями. Сравнительная характеристика основных типов памяти С точки зрения пользователя РС, главная характеристика памяти это — скорость работы или, выражаясь точнее, ее быстродействие.
Казалось бы, что может быть проще, чем измерять быстродействие? Достаточно подсчитать количество информации, выдаваемой памятью в единицу времени (скажем, мегабайт в секунду), и ничего не получится! Ведь, как мы уже знаем, время доступа к памяти непостоянно и, в зависимости от характера обращений, варьируется в очень широких пределах. Наибольшая скорость достигается при последовательном чтении, а наименьшая — при чтении в разброс.
Но и это еще не все! Современные модули памяти имеют несколько независимых банков и потому позволяют обрабатывать несколько запросов параллельно. Если запросы следуют друг за другом непрерывным потоком, непрерывно генерируются и ответы.
Несмотря на то, что задержка между поступлением запроса и выдачей соответствующего ему ответа может быть весьма велика, в данном случае это не играет никакой роли, поскольку латентность (т. е. величина данной задержки) полностью маскируется конвейеризацией и производительность памяти определяется исключительно ее пропускной способностью. Можно провести следующую аналогию: пусть сборка одного отдельного взятого Мерседеса занимает ну, скажем, целый месяц. Однако если множество машин собирается параллельно, завод может выдавать хоть по сотне Мерседесов в день и его "пропускная способность" в большей сте- Оперативная память пени определяется именно количеством сборочных линий, а не временем сборки каждой машины.
В настоящее время практически все производители оперативной памяти маркируют свою продукцию именно в пропускной способности, но наблю- дающийся в последнее время стремительный рост пропускной способности (рис. 2.3) адекватного увеличения производительности приложений, как это ни странно, не вызывает. Почему? 3500 3000 и 2500 Х 2ООО о О 1500 5 1000 500 о о ш Ю в о Рис.
2.8. Максимально достижимая пропускная способность основных типов памяти Основной камень преткновения — фундаментальная проблема зависимости ив данным 1см. равд. ?Уопраление зависимостпей па данным" этпой главы). Рассмотрим следующую ситуапию. Пусть ячейка № 1 хранит указатель на ячейку № 2, содержащую обрабатываемые данные. До тех пор, пока мы не получим содержимое ячейки № 1, мы не сможем послать запрос на чтение ячейки № 2, поскольку еше не знаем ее адреса.
Следовательно, производительность памяти в данном случае будет определяться не пропускной способностью, а латентностью. Причем не латентностью микросхемы памяти, а латентностью всей подсистемы памяти — кзш-контроллером, системной шиной, набором системной логики и т. д, Латентность всей атой совокупности устройств очень велика и составляет порядка 20 тактов системной 118 Глава 2 шины, что многократно превышает полное время доступа к ячейке оперативной памяти. Таким образом, при обработке зависимых данных быстродействие памяти вообще не играет никакой роли — и ЯРКАМ РС100, и КОКАМ-800 покажут практически идентичный результат! Причем описываемый случай отнюдь не является надуманным, скорее наоборот — зто вполне типичная ситуация. Основные структуры данных (такие как деревья и списки) имеют ярко выраженную зависимость по данным, поскольку объединяют свои элементы именно посредством указателей, что "съедает" весь выигрыш от быстродействия микросхем памяти.
Таким образом, теоретическая пропускная способность памяти, заявленная производителями, совсем ничего не говорит о ее реальной производительности (табл. 2.1). Таблица 2.1. Важнейшие характеристики основных типов памяти Разряд- Время Время Пропускная ность, доступа, рабочего способность, бит ис цикла,ис Мбайт/с Тип памяти Рабочая частота, Мгц 70; 60 60; 50 40; 30 40; 35 25; 20 10; 7,5 ЕРМ 25, ЗЗ 32 100, 132 160, 200 528, 800, 1064 1600, 2100 1600, 2400, 3200 ЕГЗО 40, 50 32 ЗОВАМ 66, 100, 133 64 00В 100, 133 64 ВОВАМ 400, 600, 800 16 30; 22,5 5; 3,75 —; —; 30 —; —; 2,5 Взаимодействие памяти и процессора Вопреки распространенному заблуждению, процессор взаимодействует с оперативной памятью не напрямую, а через специальный контроллер, подключенный к системной шине процессора приблизительно так же, как и остальные контроллеры периферийных устройств.
Причем механизм обращения к портам ввода/вывода и к ячейкам оперативной памяти с точки зрения процессора практически идентичен. Процессор сначала выставляет на адресную шину требуемый адрес, а в следующем такте уточняет тип запроса: происходит ли обращение к памяти, портам ввода/вывода или подтверждение прерывания. В некотором смысле оперативную память можно рассматривать как совокупность регистров ввода/вывода, каждый из которых хранит некоторое значение. Обработка запросов процессора ложится на набор системной логики (так же называемый чилсетом), среди прочего включающий в себя и контроллер ла- Оперативная память летти. Контроллер памяти полностью "прозрачен" для программиста, однако знание его архитектурных особенностей существенно облегчает оптимизацию обмена с памятью. Рассмотрим механизм взаимодействия памяти и процессора на примере чипсета !п1е1 815ЕР (рис. 2,9).
Когда процессору требуется получить содержимое ячейки оперативной памяти, он, дождавшись освобождения шины, через механизм арбитража захватывает шину в свое владение (что занимает ' один такт) и в следующем такте передает адрес искомой ячейки. Еще один такт уходит на уточнение типа запроса, назначение уникального идентификатора транзакции, сообщение длины запроса и маскировку байтов шины.
Подробнее об этом можно прочитать в спецификациях на шины Рб и ЕЧ6, здесь же достаточно отметить, что эта фаза запроса осуществляется за три такта системной шины. Рис. 2.9. Устройство серверного моста чипсета )п1е) 815ЕР, содержащего (среди всего прочего) контроллер памяти !2О Глава 2 Независимо от размера читаемой ячейки (байт, слово, двойное слово) длина запроса всегда равна размеру линейки 1.2-кэша (подробнее об устройстве кэша мы поговорим в одноименной главе), что составляет 32 байт для процессоров Кб/Р-П/Р-П1, 64 байт — для АМВ Аг(з!оп и 128 байт — для Р-4. Такое решение значительно увеличивает производительность памяти при последовательном чтении ячеек и практически не уменьшает ее при чтении ячеек вразброс, что и неудивительно, т.
к. латентность чипсета в несколько раз превышает реальное время передачи данных, и им можно пренебречь. Контроллер тины (В1Ю вЂ” Вцз 1п!ег(асе 1пй), "вживленный" в северный мост чипсета, получив запрос от процессора, в зависимости от ситуации либо передает его соответствуюшему агенту (в нашем случае — контроллеру памяти), либо ставит запрос в очередь, если агент в этот момент чем-то занят. Потребность в очереди объясняется тем, что процессор может посылать очередной запрос, не дожидаясь завершения обработки предыдущего, а раз так, то запросы приходится где-то хранить.
Но, так или иначе, наш запрос оказывается у контроллера памяти (МСТ— Мешогу Соп!гойег). В течение одного такта он декодирует полученный адрес в физический номер строки/столбца ячейки и передает его модулю памяти по сценарию, описанному в раэд. "Устройство и принципы функционирования оперативной памяти' этой главы. В зависимости от архитектуры контроллера памяти он работает с памятью либо только на частоте системной шины (синхронный контроллер), либо поддерживает память любой другой частоты (асинхронный контроллер).
Синхронные контролеры ограничивают пользователей ПК в выборе модулей памяти, но, с другой стороны, асинхронные контроллеры менее производительны. Почему? Во-первых, в силу несоответствия частот, читаемые данные не могут быть непосредственно переданы на контроллер шины, и их приходится сначала складывать в промежуточный буфер, откуда шинный контроллер сможет их извлекать с нужной ему скоростью. (Аналогичная ситуация наблюдается и с записью.) Во-вторых, если частота системной шины и частота памяти не соотносятся как целые числа, то перед началом обмена приходится дожидаться завершения текущего тактового импульса.
Таких задержек (в просторечии пенальти) возникает две: О при передаче микросхеме памяти адреса требуемой ячейки; О при передаче считанных данных шинному контроллеру. Все это значительно увеличивает латентность подсистемы памяти — т. е. промежутка времени с момента посылки запроса до получения данных. Таким образом, асинхронный контроллер, работающий с памятью ЯВКАМ РС-133 на системной шине в 100 МГц, проигрывает своему синхронному собрату, работающему на той же шине с памятью ЯЖАМ РС-100.