Как стать автором
Обновить

Комментарии 18

И еще сторонний вопрос — не попадалась ли тебе java оболочка для CPUID, позволяющая определять максимальное кол-во параметров? меня спрашивают разработчики приложений под Андроид, а я им кроме советов нативно компилировать, ничего сказать не могу.
Увы, не встречал. С другой стороны, если кому-то удастся из Джавы узнать возможности нижележащей аппаратуры, то воспользоваться ими всё-равно получится только через JNI. А раз есть JNI, то и CPUID из него можно позвать.
Вот сформулировать аппаратно-независимый интерфейс для идентификации общих для многих архитектур расширений (векторы, шифрование, DSP) — это было бы интересно. Особенно если бы это оказалось полезным на практике, а для чего уже понадобятся библиотеки (или даже ОС), умеющие абстрагировать специфику ЦПУ.
Зачем нативно-то? Там вполне реалистично можно прочитать /proc/cpuinfo и оттуда вытащить тучу всего. Я на самом деле с трудом представляю, зачем на Android может понадобиться что-то, что оттуда вытащить нельзя.
В /proc/cpuinfo может не быть всей информации о процессоре.
Например, если ядро у вас достаточно старое и не знает о существовании AVX, то оно разумеется не сможет отобразить AVX в /proc/cpuinfo даже, если железо его поддерживает.
Но в то же время, если ядро не поддерживает AVX, то пользоваться им в user-space нельзя, так как ядро не сохранит AVX регистры при переключении контекста.
Я бы сказал, что в данном случае это не безопасно.

AVX наверно не лучший пример, вот Вам другой — AVX2. Ядро может знать о существовании AVX, но не подозревать о AVX2. При этом использование AVX2 будет абсолютно безопасным, но в /proc/cpuinfo оно отображено не будет.

Моя идея состоит в том, что на /proc/cpuinfo пологаться не стоит.
Для Android у Marat Dukhan (Ph.D, Georgia Tech's College of Computing; SO) есть подпроект «Yeppp! CPUID for Android». Сам yeppp вроде бы включает в себя cpuid, и содержит "bindings for Java and .Net/Mono": docs.yeppp.info/java/ "Additionally, the library provides information about the CPU, such as processor vendor and microarchitecture, and an OS- and hardware-independent interface to processor cycle counters, and high-resolution timers.".

Ага, на андроиде она парсит /proc/cpuinfo: bitbucket.org/MDukhan/yeppp/src/b8db687e912bbd7e2a26dd93c348ef2d7a5febdc/library/sources/library/CpuArm.cpp?at=default#cl-24

Зато возможные флаги расписаны: Full list of ARM features reported in /proc/cpuinfo

Размер кэша, например, эта библиотека получает из информации об архитектуре (Cortex- A5, A7, A8, A9, A15, ...):
"There is no way to determine the cache size in user mode in Linux. So I make a best guess from the architecture. Guess about L1 cache size is almost always accurate, but L2 might be different on an actual platform."
Спасибо!
Если софт жестко подстраивать под архитектуру, то придется архитектуру определять постоянно, а то в гетерогенном кластере виртуальная машина может ВНЕЗАПНО смигрироваться на немного другой процессор (или заснуть на одном, а проснуться — на другом).
Если особенности аппаратуры определяются в начале работы программы и потом не меняются в процессе её работы до финиша, то грех ими не воспользоваться; не всё же для 386 без матсопроцессора писать. В случае ВМ с живой миграцией это действительно не так.
Решений я вижу три: 1) монитор ВМ должен «утаивать» часть расширений, сводя допустимый набор к поддерживаемым самой старой машины облака, подводя все машины под общий знаменатель, но в таком случае появляется самое слабое звено по ISA; 2) монитор должен эмулировать на старых хостах недостающие инструкции, гарантируя сохранность ISA, но в таком случае скорость работы никакая.
Мне кажется, правильное решение — 3) при миграции учитывать возможности используемых машин и выбирать приёмник для ВМ так, чтобы ISA не менялась, или, при невозможности сделать так, выдавать жирное предупреждение, но продолжать работать в режиме эмуляции.
На многих виртуализаторах (XEN и HyperV точно, про KVM и VMWare не скажу) команда CPUID отдает марку процессора = физическому, хотя число ядер под машину можно менять. Можно сделать такой странный одноядерный Xeon E5. К счастью, остальная периферия (чипсет, диски, видео) там эмулируется и всегда одинаковая.

Мы как-то писали статью на тему «Повышение надежности SCADA путем запуска ее в облаке» и собрали «облако» или «кластер» из двух старых серверов CoreDuo и CeleronD под Xen. Дак WindowsXP даже не падала при переезде.

Согласен с решением 3, при миграции в большом облаке надо учитывать что-то вроде affinity и мигрировать на ноды хотя бы такого-же поколения процессоров.
Пара мелких замечаний.

1. CPUID всё-таки появился не в 80486м, а в P5 (коммерческое название — Pentium). Позже она была добавлена в P24C (коммерческое название — IntelDX4; «внутри» это вариант 80486 с несколькими новыми командами от P5).
2. Расширенный регион связан с AMD, но конкретно с 64-битным расширением связан косвенно: AMD всегда использовала этот регион для своих расширений (начиная с 3DNBow! в K6-2), но Intel предпочитала всё эту деятельность игнорировать. Но когда Itanic накрылся медным тазом пришлось срочно заимствовать-таки x86-64 — вместе с соответствующими функциями CPUID…

P.S. А ещё у AMD есть забавная особенность: Brand String в их процессорах нет вообще. То есть совсем. Фишка в том, что из одного и того же кристалла могут «выпекаться» совершенно разные CPU (в зависимости от того, сколько чего там работоспособно оказалось), да и коммерческое название процессора может меняться часто… решение — просто до гениальности: эта строка зашивается BIOS'ом в MSRC001_00[35:30] и, как несложно догадаться, написано там может быть всё, что угодно. В частности если BIOS не знает вашего процессора, то там часто оказываются куски разных названий самых разных процессоров. При этом всё более-менее работает, но вот называться процессор будет как-нибудь типа DuronFX4+ 600MHz.
Большое спасибо за уточнения! Как раз про то, что я не знал.

P.S. А ещё у AMD есть забавная особенность: Brand String в их процессорах нет вообще.

Я находил похожую информацию о том, что у некоторых VIA можно менять ещё и строку из нулевого листа, тоже через MSR'ы. И тем самым прикидываться GenuineIntel, AuthenticAMD и т.д.

Фишка в том, что из одного и того же кристалла могут «выпекаться» совершенно разные CPU (в зависимости от того, сколько чего там работоспособно оказалось), да и коммерческое название процессора может меняться часто…

По-моему, само введение всех этих строк было неудачной идеей как раз по этой причине.
Ещё одна фишка процессоров от AMD. Некоторые процессоры на ядре Bulldozer могут возвращать флаг AVX=1, но при этом флаги SSE42, SSE41 и SSSE3 равными 0, причём все эти технологии присутствуют. Зачем это сделано — не очень понятно. Но старые программы точно не смогут «обнаружить» технологии «занулёные» технологии.
Очень интересно. А можно поподробнее, откуда такая информация? Из официальной документации или пользователи обнаружили? Похоже на баг, такое обычно исправляют достаточно быстро обновлениями прошивки.
Я склонен считать, что это была бага процессора. В официальной доке ничего такого нет.

К нам обратились клиенты, которые жаловались, что наше ПО медленно работает на их достаточно топовой машине. После процесса отладки было обнаружено, что большинство оптимизированных функций не работают. Стали смотреть на процедуру идентификации процессора и обнаружили, что CPUID выдаёт нулевые биты для «предыдущих» SSE технолигий. Самое интересное, что наше ПО находило бит AVX, но проверяло наличие всех битов AVX/SSE42/SSE41/SSSE3 для запуска AVX версии. Пришлось поправить код, и довольствоваться одним битом.
Дополню список софта для чтения CPUID: Sysinternals Coreinfo
Утилита с довольно подробным выводом, умеющая читать также информацию из некоторых MSRов, связанных с поддержкой виртуализации. Например, на моей системе выдача следующая:

c:\bin> Coreinfo.exe

Coreinfo v3.31 — Dump information on system CPU and memory topology
Copyright © 2008-2014 Mark Russinovich
Sysinternals — www.sysinternals.com

Intel® Core(TM) i5-4300U CPU @ 1.90GHz
Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
Microcode signature: 00000017
HTT * Hyperthreading enabled
HYPERVISOR — Hypervisor is present
VMX * Supports Intel hardware-assisted virtualization
SVM — Supports AMD hardware-assisted virtualization
X64 * Supports 64-bit mode

SMX * Supports Intel trusted execution
SKINIT — Supports AMD SKINIT

NX * Supports no-execute page protection
SMEP * Supports Supervisor Mode Execution Prevention
SMAP — Supports Supervisor Mode Access Prevention
PAGE1GB * Supports 1 GB large pages
PAE * Supports > 32-bit physical addresses
PAT * Supports Page Attribute Table
PSE * Supports 4 MB pages
PSE36 * Supports > 32-bit address 4 MB pages
PGE * Supports global bit in page tables
SS * Supports bus snooping for cache operations
VME * Supports Virtual-8086 mode
RDWRFSGSBASE * Supports direct GS/FS base access

FPU * Implements i387 floating point instructions
MMX * Supports MMX instruction set
MMXEXT — Implements AMD MMX extensions
3DNOW — Supports 3DNow! instructions
3DNOWEXT — Supports 3DNow! extension instructions
SSE * Supports Streaming SIMD Extensions
SSE2 * Supports Streaming SIMD Extensions 2
SSE3 * Supports Streaming SIMD Extensions 3
SSSE3 * Supports Supplemental SIMD Extensions 3
SSE4a — Supports Streaming SIMDR Extensions 4a
SSE4.1 * Supports Streaming SIMD Extensions 4.1
SSE4.2 * Supports Streaming SIMD Extensions 4.2

AES * Supports AES extensions
AVX * Supports AVX intruction extensions
FMA * Supports FMA extensions using YMM state
MSR * Implements RDMSR/WRMSR instructions
MTRR * Supports Memory Type Range Registers
XSAVE * Supports XSAVE/XRSTOR instructions
OSXSAVE * Supports XSETBV/XGETBV instructions
RDRAND * Supports RDRAND instruction
RDSEED — Supports RDSEED instruction

CMOV * Supports CMOVcc instruction
CLFSH * Supports CLFLUSH instruction
CX8 * Supports compare and exchange 8-byte instructions
CX16 * Supports CMPXCHG16B instruction
BMI1 * Supports bit manipulation extensions 1
BMI2 * Supports bit manipulation extensions 2
ADX — Supports ADCX/ADOX instructions
DCA — Supports prefetch from memory-mapped device
F16C * Supports half-precision instruction
FXSR * Supports FXSAVE/FXSTOR instructions
FFXSR — Supports optimized FXSAVE/FSRSTOR instruction
MONITOR * Supports MONITOR and MWAIT instructions
MOVBE * Supports MOVBE instruction
ERMSB * Supports Enhanced REP MOVSB/STOSB
PCLMULDQ * Supports PCLMULDQ instruction
POPCNT * Supports POPCNT instruction
LZCNT * Supports LZCNT instruction
SEP * Supports fast system call instructions
LAHF-SAHF * Supports LAHF/SAHF instructions in 64-bit mode
HLE * Supports Hardware Lock Elision instructions
RTM * Supports Restricted Transactional Memory instructions

DE * Supports I/O breakpoints including CR4.DE
DTES64 * Can write history of 64-bit branch addresses
DS * Implements memory-resident debug buffer
DS-CPL * Supports Debug Store feature with CPL
PCID * Supports PCIDs and settable CR4.PCIDE
INVPCID * Supports INVPCID instruction
PDCM * Supports Performance Capabilities MSR
RDTSCP * Supports RDTSCP instruction
TSC * Supports RDTSC instruction
TSC-DEADLINE * Local APIC supports one-shot deadline timer
TSC-INVARIANT * TSC runs at constant rate
xTPR * Supports disabling task priority messages

EIST * Supports Enhanced Intel Speedstep
ACPI * Implements MSR for power management
TM * Implements thermal monitor circuitry
TM2 * Implements Thermal Monitor 2 control
APIC * Implements software-accessible local APIC
x2APIC * Supports x2APIC

CNXT-ID — L1 data cache mode adaptive or BIOS

MCE * Supports Machine Check, INT18 and CR4.MCE
MCA * Implements Machine Check Architecture
PBE * Supports use of FERR#/PBE# pin

PSN — Implements 96-bit processor serial number

PREFETCHW * Supports PREFETCHW instruction

Maximum implemented CPUID leaves: 0000000D (Basic), 80000008 (Extended).

Logical to Physical Processor Map:
**-- Physical Processor 0 (Hyperthreaded)
--** Physical Processor 1 (Hyperthreaded)

Logical Processor to Socket Map:
**** Socket 0

Logical Processor to NUMA Node Map:
**** NUMA Node 0

No NUMA nodes.

Logical Processor to Cache Map:
**-- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64
**-- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64
**-- Unified Cache 0, Level 2, 256 KB, Assoc 8, LineSize 64
**** Unified Cache 1, Level 3, 3 MB, Assoc 12, LineSize 64
--** Data Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64
--** Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64
--** Unified Cache 2, Level 2, 256 KB, Assoc 8, LineSize 64

Logical Processor to Group Map:
**** Group 0

c:\bin> Coreinfo.exe -v

Coreinfo v3.31 — Dump information on system CPU and memory topology
Copyright © 2008-2014 Mark Russinovich
Sysinternals — www.sysinternals.com

Intel® Core(TM) i5-4300U CPU @ 1.90GHz
Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
Microcode signature: 00000017
HYPERVISOR — Hypervisor is present
VMX * Supports Intel hardware-assisted virtualization
EPT * Supports Intel extended page tables (SLAT)

Зарегистрируйтесь на Хабре , чтобы оставить комментарий