nForce2 – Решение проблемы "пляски частот"

9 ноября 2003, воскресенье 00:58

Эта работа прислана на наш конкурс статей


1. Предисловие

Прошло два дня со времени написания статьи "nForce2 – А пляшут ли частоты?", пользователи форума потребовали более подробных разбирательств, и решения проблемы "плясок". По этой причине были проведены некоторые исследования и написаны дополнительные тестовые программы, отдельное спасибо SweetLow за идею использования таймера ACPI, и за алгоритм определения реального делителя таймера RTC. Во время исследований было обнаружено еще несколько автономных таймеров, и все имеют разную точность!

Вот список:

  • PIC/RTC
  • APIC
  • CMOS
  • ACPI/PM Clock
  • HPET/MM Timer

Кроме того, теоретически, в качестве таймера можно использовать последовательные и параллельные порты, звуковую карту... но ограничимся пока первыми четырьмя ;)

2. Подозреваемый

Отныне, можно с уверенностью утверждать, что пляшут не частоты, а таймер. А поскольку таймеров в системе, как оказалось немало, конкретизирую – виноват таймер Расширенного Контроллера Прерываний (APIC), который изначально предназначался для мультипроцессорных систем, и который даже самими Microsoft не рекомендуется к использованию по причине малой точности и нестабильности:





APIC Timer. The Advanced Programmable Interrupt Controller (APIC) timer has many of the capabilities of the real-time clock and was designed to be used to synchronize multiple processors, but it has poor resolution and the clocks silicon is sometimes very buggy. (http://www.microsoft.com/whdc/hwdev/platform/proc/mm-timer.mspx)

Несмотря на это, в системах nforce2/WindowsXP используется по умолчанию именно таймер APIC, а не старого доброго PIC. Для проверки этой догадки была использована программа, написанная SweetLow. Результат – при использовании APIC+ACPI ядра для WindowsXP частота таймера являлась 18.2Hz, что для мультизадачной системы слишком мало, но опять же это начальное значение, которое устанавливает BIOS для нормальной работы DOS. Перепрограммирование таймера RTC на систему не влияло. При использовании ядра ACPI ситуация изменилась, частота таймера возросла до 1000hz, перепрограммирование таймера наконец-то дало результат.

3. Еще один гвоздь в гроб MadOnion

В прошлой статье я писал о теоретически возможном читерстве с помощью перепрограммирования таймера, в этой я продемонстрирую полученные результаты. Была установлена частота RTC=500Hz и запущен 3DMark2001se:

3DMark Score 18504
Game 1 - Car Chase - Low Detail 281.5 fps
Game 1 - Car Chase - High Detail 130.1 fps
Game 2 - Dragothic - Low Detail 261.1 fps
Game 2 - Dragothic - High Detail 143.0 fps
Game 3 - Lobby - Low Detail 294.3 fps
Game 3 - Lobby - High Detail 143.3 fps
Game 4 - Nature 90.4 fps

Сейчас такими цифрами мало кого удивишь, но ведь моя видеокарта всего лишь GeForce3 Ti200, да и процессор средний - AthlonXP 2000Mhz :) С 3DMark2003 ситуация аналогичная – результаты удвоились. Самое забавное, что многие тесты процессора начали показывать вдвое бОльшую частоту, чем та, на которой работает процессор :) Например, thg_clock при 220x8

Фирменные утилиты AMD, Aida32, CPUZ 1.20 также показывают аналогичный результат :)

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

4. Решение проблемы





По моим наблюдениям, проблема "пляски частот" существует только у пользователей WindowsXP, и решается заменой стандартного ядра ACPI+APIC на ядро ACPI. Сделать это несложно:

Вариант 1:

Поставить в BIOS пункт: Advanced BIOS Features/APIC mode в disable, переустановить WindowsXP.

Вариант 2:

Сменить ядро WindowsXP на ACPI-ядро. Выключать APIC при этом в BIOS не обязательно. Для этого нужно найти в дистрибутиве Windows файлы halacpi.dl_ и halaacpi.dll, распаковать командой:

extract halacpi.dl_ halacpi.dll
extract halaacpi.dl_ halaacpi.dll

Если у вас нет файла Extract.exe, то его можно взять здесь. Закинуть распакованные файлы в каталог WINDOWS/SYSTEM32, и подредактировать скрытый файл BOOT.INI в корневом каталоге диска C:.

Обычно этот файл представляет собой следующее:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"

Копируем полностью последнюю строчку, добавив в конце /hal=halacpi.dll, и получаем:





[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional (PIC)" /hal=halacpi.dll
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional (APIC)" /hal=halaacpi.dll

Теперь при загрузке у вас будет два новых пункта: старый вариант, вариант с PIC, и вариант загрузки с APIC. Если загрузка с PIC прошла успешно, остальные пункты удаляем (можно поменять местами или оставить для экспериментов). Но имейте в виду, в результате замены ядра на ACPI+PIC, у вас уменьшится количество прерываний, что может сказаться на некоторых устройствах, не желающих работать в паре. Впрочем, в большинстве случаев проблем быть не должно.

Уфф... ну все. Плясок у вас больше быть не должно :) если будут – пишите.

5. Тест, написанный для проведения экспериментов

Данная программа может быть использована не только для проведения тестирования, но и, например, для прохождения сложных мест в слишком быстрых для вас играх! :) После установки таймера на вдвое мЕньшую частоту, игры замедляются, и все становится как замедленной съемке, или как с замедлителем в Max Payne :) Естественно, это сработает только в одиночной игре, в сетевой будет облом.

Можно взять здесь: (файл timertest.rar)

  • Группа Timers:
    • ACPI timer ticks per 1000ms RTC: Частота системного таймера, измеренная по таймеру ACPI.
    • CPU Frequency via System Clock: Частота процессора, по таймеру системы
    • CPU Frequency (Corrected by ACPI timer): Частота процессора, скорректированная в соответствии с длительностью системной секунды, по секундомеру ACPI.
  • Группа Clocks:
    • Показания энергонезависимых часов CMOS, часов Windows, и их отличие.
    • Кнопка Sync устанавливает время системы по часам CMOS.
  • Set RTC Rate: Установка частоты таймера PIC/RTC, в герцах. Работает только с ядром PIC. Эта функция была написана для проверки реакции приложений на изменение частоты таймера, и эмуляции сбойных ситуаций, когда частота якобы занижалась по некоторым тестам.
  • RTC Resolution: Текущая частота таймера RTC.
  • ACPI Timer Resolution: Частота таймера ACPI

6. Заключение

На этом я думаю можно вопрос пляски частот считать закрытым. Остается вопрос – почему пляшет таймер APIC nForce2? Является ли это нерешаемой аппаратной проблемой, или может проблема в неправильной инициализации таймера при начальной загрузке BIOS? Или это вообще проблема WindowsXP? Но это вопросы скорее к nVidia и Microsoft, экспериментами тут выяснить что-либо уже довольно сложно.

Страницы материала
Страница 1 из 0
Оценитe материал

Популярные новости

Сейчас обсуждают