# cpuinfo

Библиотека для программного определения характеристик процессора во время выполнения. Она предоставляет API для получения детальной информации о CPU: производителе, модели, микроархитектуре, количестве ядер, размерах кэша, поддержке наборов инструкций (SIMD, виртуализация) и топологии процессорной системы. Библиотека использует низкоуровневые методы доступа к регистрам процессора, системным таблицам (ACPI, SMBIOS) и операционной системе для сбора максимально точных данных о процессорной архитектуре.

## Особенности

- кроссплатформенность (Linux, Windows, macOS, Android, iOS, BSD);
- определение производителя (Intel, AMD, ARM, Apple Silicon) и микроархитектуры;
- обнаружение поддержки расширений инструкций (SSE, AVX, NEON, SVE и др.);
- анализ топологии процессора (ядра, потоки, NUMA-узлы, кэш-память);
- минимальные зависимости и высокая производительность работы.

## Основные компоненты

Библиотека предоставляет набор функций и структур данных для доступа к информации о процессоре (подробнее с документацией можно ознакомиться [здесь](https://deepwiki.com/pytorch/cpuinfo)):

### Инициализация и базовые функции

API для первичной настройки библиотеки, включающий функции сбора процессорной информации через низкоуровневые интерфейсы (CPUID, системные вызовы, таблицы ACPI/SMBIOS). Обеспечивает базовые операции: инициализацию внутренних структур, освобождение ресурсов, получение количества логических процессоров и физических ядер системы:

- `cpuinfo_initialize()` — инициализация библиотеки и сбор информации о процессоре;
- `cpuinfo_deinitialize()` — освобождение ресурсов библиотеки;
- `cpuinfo_processors_count()` — получение общего количества логических процессоров;
- `cpuinfo_cores_count()` — получение количества физических ядер.

### Информация о процессорах и ядрах

Интерфейс доступа к структурированным данным о процессорных элементах, включая массивы структур cpuinfo_processor (логические процессоры) и cpuinfo_core (физические ядра). Предоставляет детальную информацию о производителе, микроархитектуре, частотах и взаимосвязях между компонентами системы:

- `cpuinfo_get_processors()` — получение массива структур `cpuinfo_processor` для всех логических процессоров;
- `cpuinfo_get_cores()` — получение массива структур `cpuinfo_core` для физических ядер;
- `cpuinfo_get_packages()` — получение информации о физических процессорных пакетах (сокетах).

### Характеристики процессора

Функции идентификации специфических параметров CPU: определение вендора и микроархитектуры, получение размеров и ассоциативности кэш-памяти всех уровней (L1-L4), частотных диапазонов работы процессора и поддержки технологий виртуализации:

- `cpuinfo_get_vendor()` — определение производителя процессора (Intel, AMD, ARM и др.);
- `cpuinfo_get_uarch()` — получение микроархитектуры процессора;
- `cpuinfo_get_cache()` — информация об уровнях кэш-памяти (L1, L2, L3);
- `cpuinfo_get_max_frequency()` и `cpuinfo_get_min_frequency()` — максимальная и минимальная частоты процессора.

### Поддержка инструкций

API детекции расширений наборов инструкций через проверку флагов CPUID и системных регистров. Включает проверки для векторных (SSE/AVX/NEON/SVE), криптографических (AES-NI/SHA), битовых (BMI) расширений и технологий безопасности (SGX/TrustZone):

- `cpuinfo_has_x86_*()` — семейство функций для проверки поддержки x86-инструкций (SSE, AVX, AESNI, BMI и др.);
- `cpuinfo_has_arm_*()` — семейство функций для проверки поддержки ARM-инструкций (NEON, SVE, Cryptography Extensions);
- `cpuinfo_has_riscv_*()` — функции для проверки RISC-V расширений.

### Топология системы

Интерфейс анализа иерархической организации процессора: определение кластеров ядер, топологии кэш-памяти (разделяемые/эксклюзивные кэши), распределения по NUMA-узлам и связей между физическими ядрами и кэш-памятью разных уровней:

- `cpuinfo_get_clusters_count()` — количество кластеров (групп ядер с одинаковой микроархитектурой);
- `cpuinfo_get_l1i_cache()`, `cpuinfo_get_l1d_cache()`, `cpuinfo_get_l2_cache()`, `cpuinfo_get_l3_cache()` — информация о кэш-памяти разных уровней;
- `cpuinfo_get_max_cache_size()` — максимальный размер совместно используемого кэша.
