Journal influence
Bookmark
Next issue
Abstract:
Аннотация:
Authors: Kalabin, A.L. (alex.ka.86@gmail.com) - Tver State Technical University, Tver , Russia, Ph.D, () - | |
Ключевое слово: |
|
Page views: 30579 |
Print version Full issue in PDF (13.63Mb) |
Для квалифицированного и эффективного использования персонального компьютера важно знать: - тип процессора; - частоту процессора для одинаковой временной задержки на разных компьютерах, а также для настройки работы программы, исходя из частоты и типа процессора; - работает ли процессор в штатном или «разогнанном» режиме; - может ли данный процессор выполнить ту или иную инструкцию: например, если часть программы оптимизирована под MMX или SSE, то перед выполнением этой оптимизированной части важно убедиться в том, что процессор поддерживает эту технологию. Такая информация также необходима для выявления систематических проблем, связанных с работой приложений на различных процессорах, так как многие коммерческие приложения при возникновении ошибки отправляют информацию о системе и коде ошибки в службу поддержки, которая в том числе анализирует влияние типа процессора и его характеристик на возникшую ошибку, а также для полной информации о процессоре. Существует множество программ и методик определения характеристик процессора, но они, на наш взгляд, имеют следующие основные недо- статки: - в них не предусмотрено появление новых процессоров и новых технологий; - использование их ограничено из-за не полноты их описания; - большинство подобных программ ориентируется при определении процессора на его сигнатуру (семейство, модель, степпинг) и на объем кэш-памяти второго уровня, что не всегда является верным, поскольку может приводить к неоднозначному и неверному определению типа процессора для новых моделей, в которых объем кэш-памяти может измениться; - использование MSR-регистров для этих целей должным образом не документировано. Предлагаемая нами методика направлена на решение этих проблем. Для определения типа процессора используется инструкция CPUID, которая определяет: - производителя процессора; - поддержку процессором соответствующих технологий; - информацию о типе и размере кэш-памяти 1-го, 2-го и 3-го уровней процессора, а также информацию о TLB-буферах процессора; - название процессора и его частоту (в некоторых случаях); - дату выпуска и партию (только для процессоров Transmeta). Для использования этой инструкции проверяется, поддерживается ли она тестируемым процессором. Это определяется возможностью программного изменения 21-го бита регистра EFLAGS, которое свидетельствует о поддержке процессором инструкции CPUID [3,4,7]. Следующим шагом является запуск CPUID (при eax=0). Это позволяет узнать производителя и количество поддерживаемых стандартных уровней инструкции CPUID. Далее необходимо последовательно выполнить CPUID для этих уровней и сохранить всю полученную информацию. Затем выполняется CPUID (при eax=80000000h), что позволяет выявить, поддерживаются ли дополнительные уровни CPUID, и, если они поддерживаются, последовательно выполнить CPUID для дополнительных уровней и сохранить всю полученную информацию. В случае если процессор поддерживает специальные уровни CPUID, надо проделать такую же последовательность действий, как для стандартных и дополнительных уровней. Название процессора в общем случае определяется в порядке приоритетности следующим образом. 1. Определятся производитель процессора, в основном с помощью инструкции CPUID при eax=0 (строка названия производителя записывается в регистры ebx, edx, ecx). 2. Название процессора пытаемся извлечь из Brand String (строка названия процессора содержится в регистрах eax, ebx, ecx, edx после выполнения инструкции CPUID при eax=0x80000002h, eax=0x80000003h, eax=0x80000004h), она поддерживается, если инструкция CPUID при eax=0x80000000h возвращает в eax число не меньше 0x80000004h. 3. Если Brand String не поддерживается, то проверятся Brand ID. Ненулевое значение Brand ID свидетельствует о поддержке Brand ID. Тогда по таблицам значений Brand ID для соответствующего производителя идентифицируется тип процессора. 4. Иначе определятся тип процессора по его сигнатуре (битовому массиву, содержащему информацию о семействе, модели, степпинге). При этом необходимо также учитывать и производителя, так как некоторые процессоры, например, Celeron, Pentium II могут иметь одинаковую сигнатуру, то надо сравнивать размер кэш-памяти второго уровня с известными для данных моделей размерами, однако, например, процессор Penti- um III и Xeon (модель 7), а также Pentium II и Xeon (модель 5) могут иметь одинаковый размер кэш-памяти, и в этом случае их стоит различать по типу упаковки. Тип упаковки можно узнать из MSR-регистра процессора. Для определения частоты процессора в общем случае надо: 1) выяснить, поддерживает ли процессор TSC 64-битный счетчик реального времени, для чего проверяется бит 4 регистра edx после выполнения инструкции CPUID с параметром 1; 2) если процессор работает с этим счетчиком, то необходимо получить текущее значение счетчика с помощью инструкции rdtsc (ReaD from Time Stamp Counter); при этом 64-битное значение счетчика помещается в регистры edx и eax; 3) после этого сделать задержку в течение определенного промежутка времени (это наиболее сложная часть определения частоты процессора); 4) считать новое значение счетчика с помощью инструкции rdtsc; 5) вычислить разность первоначального значения счетчика и конечного; 6) получить частоту в мегагерцах, разделив разность на время задержки в микросекундах. Вследствие сложности выполнения точной и короткой задержки приведенная схема вычисления частоты усложняется. Конкретная методика зависит от операционной системы. Для операционной системы Windows на период работы со счетчиками настоятельно рекомендуется установить для потока и процесса, в которых производится измерение, самый высокий приоритет: для процесса (REALTIME_PRIORITY_CLASS) и для потока (THREAD_PRIORITY_TIME_CRITICAL). Для многопроцессорных систем с помощью функции API SetThreadAffinityMask надо назначить процессор, который один будет задействован в работе этого процесса и потока, чтобы избежать влияние на вычисление частоты многопроцессорности. Функции Win32 API, которые также могут понадобиться для вычисления задержки QueryPerformance- Counter, QueryPerformanceFrequency, подробно описаны в [5]. MSR-регистры (Model Specific Register – модельно-зависимый регистр микропроцессора) впервые появились в архитектуре микропроцессора Pentium как средство мониторинга производительности. MSR-регистры относятся к модельно-зависимому слою архитектуры процессора. Наличие и назначение этих регистров по определению зависит от конкретной модели процессора, что, в свою очередь, не гарантирует их поддержку будущими процессорами. MSR-регистры обеспечивают управление различными аппаратными и программно-зависимыми средствами (счетчики мониторинга производительности, расширения отладки, поддержка исключения машинной ошибки и архитектуры машинного контроля (MCA), регистры MTRR для поддержки расширенных средств кэширования и т.п.) [1,2]. Для чтения значения этих регистров предусмотрена команда rdmsr (ReaD from Model Specific Register). Адрес регистра определяется содержимым регистра ecx до выполнения инструкции rdmsr. Результат операции помещается в пару регистров edx:eax. Для доступа к MSR-регистрам необходимо обеспечить нулевой уровень привилегий. Этого можно достигнуть в MS DOS или с помощью специального драйвера для Windows (причем для Win9x этот драйвер будет отличен от драйвера для WinNT, 2000, XP). Наиболее полное описание MSR-регистров в процессорах компании Intel приведено в [6]. Однако это описание не является достаточно полным, так как в нем не расшифровывается умножитель системной шины процессора и тип упаковки процессора. Авторами определено, что: · тип упаковки процессора зашифрован в битах 52-50 регистра IA32_PLATFORM_ID (адрес 17h); · умножитель для процессора Intel Pentium II, Pentium III зашифрован в битах 25-22 и в 27-м дополнительном бите регистра EBL_CR_POWERON (адрес 2Ah); · умножитель для процессора Intel Pentium 4 с ядром Willamete (сигнатура < 0´0F20) зашифрован в битах 11-8 регистра MSR_EBC_HARD_POWERON (адрес 2Ah); · умножитель для процессора Intel Pentium 4 с ядром Northwood и более поздних (сигнатура >= 0´0F20) зашифрован в битах 31-24 регистра MSR_EBC_FREQUENCY_ID (адрес 2Ch); · умножитель для процессора AMD Athlon, Duron зашифрован в битах 27-24 и в 19-м дополнительном бите регистра MSR_K7_HWCR (адрес 0C0010015h); · умножитель для процессора AMD K6 зашифрован в битах 3-0 MSR-регистра (адрес 0C0000087h). Для процессоров фирмы Intel возможно определить штатную тактовую частоту, на которой он должен работать, даже если процессор работает во внештатном режиме. Для этого надо получить коэффициент умножения и умножить его на частоту системной шины, полученной из MSR-регистров: · для Intel Pentium II, III – биты 19:18 регистра EBL_CR_POWERON, адрес 2Ah. (00b – 66 MHz, 10b – 100 MHz, 01b – 133 MHz); · для Intel Pentium 4 (Willamete, модель < 2) – биты 23:21 регистра MSR_EBC_FREQUENCY_ID, адрес 2Ch. (000b – 100 MHz); · для Intel Pentium 4 (новые, модель >= 2) – биты 18:16 регистра MSR_EBC_FREQUENCY_ID, адрес 2Ch. (000b – 100 MHz, 001b – 133 MHz, 010b – 200 MHz, 011b – 166 MHz). После умножения получаем частоту, на которой должен работать процессор. Сравнивая ее с частотой, вычисляемой с помощью счетчика реального времени TSC, как было показано выше, можем сделать вывод о том, работает ли процессор в нормальном или во внештатном режиме. Предлагаемая методика программно реализована и протестирована на процессорах: Intel Pentium, Intel Pentium MMX, Intel Pentium II, Intel Pentium III, Intel Pentium 4, Intel Celeron (PII, PIII и P4), AMD 486DX4, AMD Athlon (в том числе и мобильный), AMD Duron, AMD-K6 3D. Также проведено тестирование на появившихся после окончания разработки процессорах Intel Pentium 4 c 800 MHz шиной и AMD Athlon (ядро Barton). Верно определены их тип и параметры. Это подтверждает работоспособность и приме- нимость предлагаемой методики для новых процессоров. Представленная методика протестирована на определение процессоров, работающих во внештатном режиме. Более детальное описание определения типа процессора и его характеристик, а также тестовую версию программы вы можете найти на сайте http://cpuid.nm.ru. Авторы будут благодарны за присланные скриншоты работы программы для продолжения тестирования, а также за замечания и предложения по адресу: cpuid@nm.ru. Список литературы 1. Assembler / В. Юров. – СПб: Изд-во ”Питер”, 2000. – 624 с.: ил. 2. Assembler: практикум / В. Юров. – СПб: Изд-во ”Питер”, 2003. – 400 с. 3. AP-485, Intel® Processor Identification and the CPUID Instruction, November 2002, Order Number: 241618-022. 4. AMD Processor Recognition Application Note Publication # 20734 Rev: 3.01 Issue Date: May 2003. 5. MSDN Library October 2002. 6. IA-32 Intel ® Architecture Software Developer’s Manual Volume 3: System Programming Guide, 2003, Order Number 245472-010. 7. http://www.sandpile.org |
Permanent link: http://swsys.ru/index.php?id=630&lang=en&page=article |
Print version Full issue in PDF (13.63Mb) |
The article was published in issue no. № 3, 2003 |
Perhaps, you might be interested in the following articles of similar topics:
- Зарубежные базы данных по программным средствам вычислительной техники
- Оптимизация структуры базы данных информационной системы ПАТЕНТ
- Эвристические и точные методы программной конвейеризации циклов
- Интеллектуальная система для моделирования затрат-потерь и распределения ресурсов по графическим образам
- Системы баз данных и знаний, разработанные в Республике Куба
Back to the list of articles