overDDR

экстремальный разгон DDR-памяти

крис касперски ака мыщъх, noemail

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

подавляющее большинство настроек либо вообще не описано в прилагаемой документации, либо описано слишком кратно, а информация, подчерпнутая из Интернета недостоверна и взаимно противоречива.

статья ориентирована главным образом одно/двух канальные контролеры DDR-памяти, однако, во много будет интереса и пользователям умирающей SDR-памяти. DDR II память в силу своей новизны и незначительных конструктивных отличий от DDR здесь не рассматривается.

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

Никакой архиватор не обрабатывает весь файл целиком, вместо этого он нарезает его на крохотные порции (порядка 16 – 64 КБ) и каждую из них упаковывает индивидуально, сосредоточив максимум запросов в пределах кэш-памяти первого и второго уровней. А если емкости кэша окажется недостаточно? Тогда процессор задействует основную память и вот тут-то на ее настройках можно сыграть! Правда, более радикальной мерой будет переход на процессор с более емкой кэш-памятью, тем более что разница в стоимости не так уж и велика.

Реально в разгоне памяти нуждаются лишь приложения, обрабатывающие порции данных от 256 Кб и выше (программы видео монтажа, графические редакторы, динамичные игры и т.д.). Чем выше степень загрузки памяти, тем больший выигрыш дает ее разгон. Волна модинга вынесла на рынок множество оригинальных моделей с индикаторами загрузки по бортам (см. рис.1). Аналогичные индикаторы появились и в некоторых материнских платах. Эти перемигивающиеся огоньки не только красивы, но еще и полезны, поскольку, позволяют определить целесообразность разгона в данном конкретном случае (см. рис.2).

overddr_image_0.jpg

Рисунок 1 индикатор загрузки памяти

overddr_image_1.jpgoverddr_image_2.jpg

Рисунок 2 пример низкой (слева) и высокой (справа) загрузки паями. чем выше загрузка, тем больший выигрыш дает разгон

А если таких индикаторов у вас нет? Тогда интенсивность использования памяти можно определить косвенно – по ее нагреву. Чем выше нагрев, тем больше загрузка. Или же воспользуйтесь утилитой CPUMon от Марка Руссиновича, бесплатную версию которой можно скачать с сервера http://www.sysinternals.com. Пользоваться ей очень просто. В меню «Class» выбираете «Bus» (шина), а в окне «Counter« – BUS_TRAN_MEM (кол-во транзакций памяти). Теперь запускаете тестовое приложение (например, игрушку или процедуру редрединга) и нажимаете »Start», а затем, спустя некоторое временя (в течении которого утилита будет накапливать статистические данные), говорите «Stop» и в появившемся диалогом окне смотрите на строку BUS_TRAN_MEM (см. рис. 3). Чем больше происходит обращений в единицу времени, тем целесообразнее разгон.

Рисунок 3 утилита CPUMon за счетом количества транзакций к памяти

Для разгона лучше всего подходят материнские платы с большим количеством тонких настроек на борту (как-то: Gigabyte GA-K8VNXP или ASUS K8V Deluxe,). Конкретный перечень определяется возможностями чипсета с одной стороны и гибкостью прошивки BIOS с другой. Существует множество хакерских прошивок и утилит, открывающих доступ ко всем настройкам контроллера памяти, которые только поддерживает чипсет. Однако, прибегать к их помощи крайне нежелательно, т. к. зачастую они приводят к серьезным проблемам (и аппаратным поломкам в том числе!). Лучше изначально приобретайте плату с богатыми настройками, список которых можно найти в документации или просто войти в BIOS Setup и посмотреть.

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

Некоторые чипсеты (например, Intel 857P) тщательно контролируют температуру памяти, автоматически уменьшая интенсивность запросов при ее перегреве. С одной стороны это хорошо, т. к. усиливает стабильность системы, но с другой затрудняет ее экстремальный разгон. Либо отключите термодатчик, либо запретите мониторинг температуры памяти в BIOS, либо скорректируйте пороговые значения, либо… придумайте что-нибудь свое.

Не все модули памяти разгоняются одинаково. Уважающие себя производители (Kingston Technology, IBM, Samsung) обеспечивают солидный запас прочности и уверенно работают даже на ускоренных таймингах и повышенных тактовых частотах. Дерьмовые производители наоборот, еда выдерживают даже заявленные характеристики и их приходится слегка тормозить.

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

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

Для достижения стабильной работы разогнанной памяти рекомендуется чуть-чуть увеличить питающее напряжение (обычно за это отвечает линяя 3.3V) и поменять режим управления (Drive Control) с Normal на Strong, однако, делать это можно только при надлежащем охлаждении, в противном случае память перегреется и быстро выйдет из строя.

overddr_image_4.jpg

Рисунок 4 память с радиатором

Скоростные показатели подсистемы памяти описываются двумя фундаментальными характеристиками: пропускной способностью и латентностью. Пропускная способность определяет предельное количество данных, передаваемых за единицу времени, а латентность – промежуток между посылкой запроса и получением ответа.

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

Латентность и пропускная способность предъявляют взаимоисключающее требования к настройкам подсистемы памяти. Добиться идеальной конфигурации невозможно и каждое приложение требует индивидуального подхода. Ведь на то они и настройки, чтобы их настраивать. Подождите! Уж не хотите ли вы сказать, что при переключении с Word'а на PhotoShop мы должны входить в BIOSSetup и что-то там подкручивать?! Да, должны! То есть нет… В общем, если производительность компьютера вас устраивает, ничего крутить не надо. В противном случае, либо приобретайте более мощную машину, либо настраивайте систему на наиболее критичное к скорости приложение. Если же таких приложений у вас несколько и все они настраиваются неодинаково… Ищите компромисс или постоянно перенастраивайте свой компьютер. Увы! Чудес не бывает, как и легких путей тоже.

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

Главный «погодообразующий» фактор быстродействия системы это, конечно же, тактовая частота. При всяком открытии DRAM-страницы, микросхема копирует ее в специальный буфер, использующийся в операциях обмена вплоть до закрытия страницы. Чем выше частота, тем быстрее обмен, а разгоняемость у буферных элементов просто отличая. Некоторые экземпляры допускают двух и даже трех (!) кратное повышение частоты над номиналом (поскольку в DDR памяти данные передаются по обоим фронтам тактового импульса, физически часта изменяется не более чем в полтора раза, так что ничего удивительно в таком разгоне нет).

Ядро памяти, представляющее собой матрицу конденсаторов, намного более инертно и разгоняется из рук вон плохо, катастрофически уменьшая надежность сохранности информации даже при небольшом увеличении частоты. Чувствительнее всего матрица относится к продолжительности перезарядки (см. tRP) и времени открытия DRMA-страницы (см. tRCD), которые задаются в импульсах тактовой частоты. Для достижения максимальной производительности, вместе с увеличением тактовой частоты следует увеличивать и «ядерные» тайминги (чем больше значение тайминга, тем дольше задержка). Разумеется, это увеличение не обязательно должно быть строго пропорциональным. На хороших микросхемах памяти при двукратном увеличении тактовой частоты, тайминги увеличиваются всего лишь в полтора раза. При последовательном чтении ячеек, когда латентность полностью маскируется, вы получите двойной прирост производительности памяти при не сильно худшей надежности.

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

Независимо от выбранной частоты, в системах с DDR-памятью, команды на запись/чтение передаются только по переднему фронту тактового импульса, а сами обрабатываемые данные – по обоим. Расстояние между двумя соседними фронтами равно ½ тика, поэтому в настройках таймингов так много дробных величин.

Для перехода на ручное управление в меню BIOS необходимо найти пункт наподобие «AutoConfiguration» или «SPD» и переключить его на «Manual». SPD расшифровывается как «SerialPresenceDetect» и конструктивно представляет собой крошечную микросхему постоянной памяти, хранящую основные характеристики и тайминги DIMM-модуля, гарантируемые производителем (см. рис. 5).

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

Не доверяйте автоматике! Ручная настройка всегда предпочтительнее, поскольку оперирует не с произвольно взятой выборкой нескольких модулей памяти, а с конкретным экземпляром!

overddr_image_5.jpg

Рисунок 5 маленькая черная хреновина в верхнем правом углу и есть SPD

CL

Величина CL, более известная под именем CAS# Latency, задает количество тактов между отправкой DDR-микросхеме команды чтения (не записи!) и сбросом первой порции данных на шину, при этом DRAM-страница должна быть заблаговременно открыта, за что отвечает тайминг tRCD. При последовательном чтении ячеек величина CL не играет никакой роли и может быть сколь угодно большой, в противном случае мы теряем CL тактов на каждый цикл пакетного обмена, продолжительность которого даже при благоприятном стечении обстоятельств составляет по меньшей мере 10 –20 тактов, поэтому сокращения CAS# Latency на один такт в лучшем случае увеличивает производительность на ~10%. Кстати говоря, CAS# Latency хорошо разгоняется, поскольку управляет не тормозным массивом конденсаторов, а быстрым буфером статической памяти и обвязывающей его логикой. При хаотичном доступе к памяти, когда открытие/закрытие DRAM-страниц происходит на каждом шагу, вклад, вносимый задержкой CL в общую продолжительность цикла обмена становится настолько мал, что им можно полностью пренебречь.

В большинстве случаев CAS# Latency составляет 2.0 или 2.5 тактов. Уменьшать ее до 1.5 не рекомендуется, хотя… если качество используемого оборудования это позволяет, то почему бы и нет?

tRCD

Величина tRCD, так же называемая RASto CASDelayили Active to CMD, определяет время открытия DRAM-страницы, в процессе которого со строки конденсаторов считывается заряд и заносится в буфер статической памяти, локально обрабатывающий все последующие обращения. Средняя длина страницы составляет 2 Кб, ширина пакетного цикла обмена – 32 или 64 байт, и при последовательном чтении ячеек открытия новых страниц происходят на каждом 32, 64 цикле, а при перекрестном чередовании банков (о котором речь еще впереди) и того реже. Некоторые контроллеры памяти автоматически открывают следующую страницу, когда текущая подходит к концу, благодаря чему задержка полностью маскируется. При хаотичном доступе к памяти картина иная. Открытие новых страниц происходит значительно чаще, и латентность подсистемы памяти существенно возрастает. Тем не менее уменьшать величину tRCD категорически не рекомендуется. Во-первых, реального выигрыша производительности это все равно не даст (полный пакетный цикл занимает порядка 30 тактов и сокращение RAS# to CAS# Latency на один такт, увеличивает быстродействие всего лишь на ~3%). Во-вторых, с разгоном tRCD надежность микросхемы катастрофически падает и существенно увеличивается ее нагрев. Скажите честно, вам это надо?

Правильные люди не умешают RAS# to CAS# Latency, а напротив, увеличивают ее параллельно с этим наращивая тактовую частоту и в результате получая наибольший прирост производительности, который только может быть достигнут.

tRP

Величина tRP (она же RAS# Precharge Delay, она жеPrecharge to active) определяет время закрытия DRAM-страницы, в процессе которого происходит возврат данных в банк памяти и его перезарядка. Во время перезаряда банк недоступен, но доступны все остальные банки (большинство DDR-модулей содержит четыре таких банка). Банк закрывается на перезарядку всякий раз, когда происходит обращение к другой странице из этого же самого банка. При последовательном чтении/записи ячеек значение tRP никак не влияет на производительность. При чтении в разбор RAS# Precharge снижает быстродействие системы только тогда, когда все запросы оказываются сосредоточены в пределах одного банка, что при правильно выбранном чередовании практически никогда не случается.

Если микросхемы памяти поддерживают режим Auto Precharge, и контроллер об этом «знает», то перезаряд начинается сразу же после того, как будет прочитана последняя ячейка DRAM-страницы, в результате чего производительность системы несколько возрастает.

Недостаточно продолжительное время перезаряда приводит к потере оперативных данных и как следствие – нестабильной работе компьютера. Рекомендуется выбрать максимальное значение тайминга из всех предлагаемых BIOS'ом, особенно если тактовая частота памяти разогнана сверх номинального.

tRAS

ВеличинаtRAS (онажеDRAM Precharge Delay, онажеActive to Precharge Delay, онажеPrecharge Wait State, онажеRow Active Delay, онажеRow Precharge Delay) устанавливаетминимальныйпромежутоквременимеждуоткрытием/закрытиемодной DRAM-страницы. Отсюда, реальное время хаотичного доступа к одному банку памяти без учета латентности процессора и чипсета равно tRC == tRAS + tRP. Если микросхема памяти поддерживает tRAS Lockout feature – режим обхода tRAS (а большинство микросхем его поддерживают), то при переключении между DRAM-страницами величина tRAS игнорируется и вместо нее берется tRCD. Если же режим обхода tRAS не поддерживается, уменьшение Precharge Delay слегка ускоряет хаотичный доступ, но злоупотреблять этим не следует и лучше изменить чередование банков – и производительность возрастет и стабильность не пострадает.

Не все BIOS'ы обеспечивают возможность тонкой настройки памяти. Те же, что обеспечивают, не всегда открывают доступ по умолчанию (например, в Gigabyte GA-K8VNXP для этого необходимо нажать Ctrl-F1). Опции тонкой настройки не обеспечивают радикального прироста производительности, однако, в ряде случаев оказывают очень полезными.

overddr_image_7.jpg

Рисунок 6 тонкая настройка памяти на различных материнских платах

Burst Length

Длинна пакетного цикла чтения. Для достижения наивысшей производительности должна быть равна размеру процессорной кэш-линейки (32 байта или 4 пульса для P-III и 64 байта или 8 пульсов для P-4 или AMD Athlon). Никак не влияет на надежность, но более длинные пакетные циклы несколько уменьшают энергопотребление.

Bank Interleaving

Режим чередования банков. Если чередование выключено, мы обеспечиваем максимум одновременно открытых страниц для работы. Например, для копирования данных из пункта А в пункт B требуется два открытых банка. Однако, если эти оба «пункта» попадут в один банк, время копирования существенно возрастет и чтобы этого избежать необходимо изменить алгоритм трансляции адресов так, чтобы рассредоточить совместно обрабатываемые порции данных по различным банкам. Как правило, нужный режим чередования подбирается экспериментально и для каждого приложения этот режим свой.

Command Rate CMD

Определяет минимальный промежуток времени между двумя соседними командами. Чаще всего равен двум-трем тактам, реже – одному (это зависит не столько от используемого модуля памяти, сколько от проворности контроллера). Полная конвейеризация выдачи результата достигается лишь при Command Rate равном одному и увеличивает производительность подсистемы памяти практически на 25%.

Некоторые BIOS'ы именуют эту опцию как «2T Command» предлагая на выбор «Disabled» (отказаться) и «Enabled» (принять). Эх! Знать бы от чего мы отказываемся! Если по умолчанию частота следования команд была равна 1T, то 2T выбирать не надо. А если она равнялась 3T? Если документация молчит как партизан нужный режим работы приходится выбирать экспериментально.

tWCL, tDQSS

Тоже самое, что и CL, но только для записи. При последовательной записи ячеек с Command Rate равном одному полностью маскируется и никак не влияет на производительность, в противном случае сокращения tWCL на один такт слегка увеличивает быстродействие системы (но не более, чем на 10%). Слишком малая величина tWCL может стать причиной искажения записываемых данных.

tWR

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

tRWT

Минимальный промежуток времени между завершением операции записи и началом операции чтения одной и той же DRAM-страницы. При интенсивном чередовании команд записи и чтения существенно увеличивает производительность, однако, схема взаимодействия с оперативной памятью, реализованная в процессорах Intel Pentium и AMD Athlon, делает это событие крайне маловероятным и даже если оно произойдет. К тому же, большинство чипсетов имеют раздельные очереди на запись/чтение и автоматически оптимизируют порядок следования запросов, поэтому значение tRWT становится некритичным, поэтому лучше установить его на максимум для улучшения стабильности работы системы.

tREF

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

tRFC

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

tRC

Величина рабочего цикла RAS. Должна быть равна сумме tRAS и tRP, в противном случае нормальная работоспособность системы не гарантирована. Следует заменить, что некоторые BIOS'ы не позволяют явно выбирать tRP, но предоставляют доступ к tRAS и tRС, тогда tRP == tRC – tRAS.

Как быть, если в BIOS'е встретилась настройка, которая не описана ни в документации на материнскую плату, ни в настоящей статье? Обратитесь к спецификации на оперативную память, электронную версию которого можно бесплатно скачать с сервера огранизации JEDEC (http://www.jedec.org/DOWNLOAD/search/JESD79D.pdf). Если же ее не окажется и там, – загляните в техническое описание своего чипсета, которое можно найти на сайте производителя. Ведь не BIOS'же управляет памятью! Она всего лишь конфигурирует контролер и ее разработчики зачастую и сами не знают какой пункт за что отвечает!

Скажите: а что быстрее – КАМАЗ или Формула-1? А это смотря для чего! За какое время Формула перевез пару сотен тонн кирпича и за какое время ее перевезет КАМАЗ? Вот так и с тестовыми программами. Спору нет. Представленная ими информация объективна, одна она ничего не говорит о реальном быстродействии конкретного приложения на отдельно взятой задаче. Забудьте о тестовых программах. Лучше запустите свой любимую аплеуху и измерьте время выполнения типичной задачи, на которую вы расходуете львиную долю машинного времени. Теперь, манипулируя настройками BIOS'а добейтесь чтобы время выполнения этой задачи было минимальным, помня о том, что скорость выполнения всех остальных задач может как упасть, так и возрасти, заставляя вас искать золотую середину.

Народная мудрость говорит: нельзя все разгонять, на чем-то надо и «сидеть». За несколько дополнительных процентов производительности приходится расплачиваться нестабильной работой системы, частые зависания и перезагрузки которой съедают весь выигрыш от разгона. И хорошо если только перезагрузки, а не потеря всех хранящихся на жестком диске данных – ведь кэш файловой системы хранится в оперативной памяти и если он окажется искажен… Впрочем, такой исход событий крайне маловероятен и разгонять оперативную память не только можно, но и нужно.