Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Жажда скорости

Крис Касперски

Хакер, номер #095, стр. 095-130-3


Руководящая идея

Процессоры семейства Pentium поддерживают счетчики производительности (performance-monitoring events), позволяющие подсчитывать различные события, в том числе и количество кэш-промахов. Как раз то, что нам нужно! Пишем несложную программу, работающую в фоновом режиме и несколько раз в секунду считывающую значение счетчика кэш-промахов. Зафиксировав стремительный рост кэш-промахов, слегка тормозим процессор, чтобы кэш в промежутках между загрузкой новой порцией данных успевал приостыть. Также, обнаружив, что данные в кэш памяти давно не менялись, обновляем их, предотвращая возможное «загнивание».

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

Вот какие преимущества дает программный разгон! Причем ключевой исходный код легко укладывается в несколько сотен строк и пишется (с отладкой!) за один вечер, плавно перетекающий в ночь, проводимую за игрой в 3D-стрелялку или перекодировкой DVD в DivX – это уж кто чем больше заниматься любит.

Как мы будем действовать

Счетчики производительности по-разному реализованы в процессорах семейства P6 (к которым принадлежат Pentium Pro/Pentium-II/Pentium-3) и Pentium-4. Никаких принципиальных различий нет, но коды счетчиков производительности и номера MSR-регистров слегка другие, и код, предназначенный для P6, попав на Pentium-4, вызывает исключение, как правило, заканчивающиеся «голубым экраном смерти» под Windows NT.

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

Процессоры семейства P6 несут на своем борту два счетчика производительности, физически представляющие собой внутренние 40-битные MSR-регистры — PerfCtr0 и PerfCtr1, каждый из которых может подсчитывать события определенного вида. Их коды задаются другими MSR-регистрами — PerfEvtSel0 и PerfEvtSel1 соответственно. Они же отвечают за запуск/остановку счетчиков производительности.

Коды событий, которые процессор может подсчитывать, перечислены в приложении «A» руководства по системному программированию «Intel Architecture Software Developer's Manual Volume 3: System Programming Guide». В частности, событие «промах кэш-памяти данных» проходит под номером 48h, а «промах кэш-памяти кода» — 81h.

Назад на стр. 095-130-2  Содержание  Вперед на стр. 095-130-4