Задача: Как узнать какие инструкции поддерживает процессор в системе.

Инструкции процессора — это команды, которые процессор умеет выполнять аппаратно. Можно представить их как «словарь» процессора: чем больше инструкций он знает, тем больше операций может выполнять быстро и эффективно.

Ну допустим есть VM в среде виртуализации Proxmox 8.2.2 где для процессора указан Type: host, т.е. операционная система внутри (а к примеру, это будет Ubuntu 24.04 LTS Server) задействует инструкции установленного процессора (Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz) на материнской плате (Gigabyte C246-WU4). Вопрос к самому себе, а какой набор инструкций (Instruction Set Architecture, ISA) поддерживает CPU? Для чего это может пригодится? — знаю, что бывает, что установленное приложение не запускается, а выдает при запуске в консоли:

Incompatible processor. This Qt build requires the following features: ssse3 sse4.1 sse4.2 popcnt

Aborted (core dumped)

И вот по прошествии некоторого количества времени — мой вопрос к самому себе, как вывести и сделать небольшую памятку по этой теме, т.е. какие инструкции поддерживает мой CPU (Кстати это же и различные архитектуры Intel & AMD, а?) и CPU на арендуемых VPS и т.д.

Шаг №1: Выводим информацию по инструкция текущего CPU с которым может взаимодействовать виртуальная машина (но также и хостовая, если без виртуализации):

ekzorchik@srv-s2404a:~$ cat /proc/cpuinfo | grep -E "model name|flags"

или

ekzorchik@srv-s2404a:~$ grep -m1 "model name" /proc/cpuinfo

model name      : Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz

ekzorchik@srv-s2404a:~$ grep -m1 "flags" /proc/cpuinfo

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arat vnmi umip md_clear flush_l1d arch_capabilities

ekzorchik@srv-s2404a:~$

Шаг №2: Теперь собираем по крупицам из общедоступных источников в виде пунктов что делает каждый флаг возможностей текущего CPU — ну это так для расширения кругозора:

  • fpu - Аппаратный сопроцессор для вычислений с плавающей точкой (Floating Point Unit).
  • vme - Поддержка виртуального режима 8086.
  • de  - Аппаратная поддержка точек останова (Debug Extensions).
  • pse - Страницы памяти размером 4 МБ.
  • tsc - Счетчик тактов процессора (Time Stamp Counter).
  • msr - Регистры специального назначения (Model Specific Registers).
  • pae - Физическая адресация памяти более 4 ГБ (36-бит).
  • mce - Обнаружение аппаратных ошибок (Machine Check Exception).
  • cx8  - Инструкция CMPXCHG8B (атомарные операции).
  • apic - Локальный контроллер прерываний APIC.
  • sep - Быстрый переход в режим ядра (SYSENTER/SYSEXIT).
  • mtrr - Управление кэшированием памяти.
  • pge - Глобальные страницы памяти.
  • mca - Архитектура проверки аппаратных ошибок.
  • cmov - Условное перемещение без переходов.
  • pat - Таблица атрибутов памяти.
  • pse36 - Поддержка 36-битной адресации больших страниц.
  • clflush - Очистка строки кэша.
  • mmx - Первое поколение SIMD-инструкций Intel.
  • fxsr - Быстрое сохранение состояния FPU/SSE.
  • sse - Streaming SIMD Extensions.
  • sse2 - Второе поколение SSE.
  • ss - Самостоятельное управление стеком при исключениях.
  • ht - Hyper-Threading (логические ядра).
  • syscall - Быстрые системные вызовы в 64-битном режиме.
  • nx - Запрет выполнения кода в памяти (No eXecute).
  • pdpe1gb - Поддержка страниц памяти размером 1 ГБ.
  • rdtscp - Чтение счетчика тактов с идентификатором ядра.
  • lm - 64-битный режим (Long Mode).
  • constant_tsc -  Частота TSC не меняется при изменении частоты CPU.
  • arch_perfmon - Аппаратный мониторинг производительности.
  • rep_good - Оптимизированные инструкции REP MOVS/STOS.
  • nopl - Инструкция NOP с параметрами.
  • xtopology - Информация о топологии процессора.
  • cpuid - Поддержка инструкции CPUID.
  • tsc_known_freq - Известная частота TSC.
  • pni SSE3 - (Prescott New Instructions).
  • pclmulqdq - Быстрое умножение для криптографии (CRC, AES-GCM).
  • vmx - Аппаратная виртуализация Intel VT-x.
  • ssse3 - Supplemental SSE3.
  • fma Fused Multiply-Add — очень важно для ИИ.
  • cx16 CMPXCHG16B (128-битные атомарные операции).
  • pdcm - Мониторинг производительности.
  • pcid - Идентификаторы контекста страниц памяти.
  • sse4_1 - SSE версии 4.1.
  • sse4_2 - SSE версии 4.2.
  • x2apic -  Расширенный APIC.
  • movbe -   Инструкция перестановки байтов.
  • popcnt -  Быстрый подсчет единичных битов.
  • tsc_deadline_timer -   Таймер на основе TSC.
  • aes - Аппаратное ускорение AES.
  • xsave -   Сохранение расширенного состояния процессора.
  • avx - 256-битные векторные инструкции.
  • f16c - Аппаратное преобразование чисел FP16 ↔ FP32.
  • rdrand -  Аппаратный генератор случайных чисел.
  • hypervisor -   Процессор работает в виртуальной машине.
  • lahf_lm - Инструкции LAHF/SAHF в 64-битном режиме.
  • abm - Дополнительные битовые инструкции (LZCNT).
  • 3dnowprefetch -    Инструкция предварительной выборки данных.
  • cpuid_fault -  Возможность блокировать CPUID.
  • ssbd - Защита от Spectre Variant 4.
  • ibrs - Защита от Spectre Variant 2.
  • ibpb - Barrier для защиты от Spectre.
  • stibp - Защита Hyper-Threading от Spectre.
  • ibrs_enhanced - Улучшенная защита Spectre.
  • tpr_shadow - Оптимизация виртуализации.
  • flexpriority - Оптимизация APIC в виртуальных машинах.
  • ept - Extended Page Tables (VT-x).
  • vpid - Virtual Processor ID.
  • ept_ad - Биты доступа/изменения для EPT.
  • fsgsbase - Быстрая работа с регистрами FS/GS.
  • tsc_adjust -   Коррекция TSC.
  • bmi1 - Bit Manipulation Instructions 1.
  • hle - Hardware Lock Elision (ускорение многопоточности).
  • avx2 - Второе поколение AVX — критично для нейронных сетей.
  • smep - Защита ядра от выполнения пользовательского кода.
  • bmi2 - Bit Manipulation Instructions 2.
  • erms - Ускоренные операции REP MOVSB/STOSB.
  • invpcid - Сброс кэша TLB по идентификатору процесса.
  • rtm - Restricted Transactional Memory.
  • mpx - Intel Memory Protection Extensions (устарело).
  • rdseed - Аппаратный источник энтропии.
  • adx - Расширенные арифметические инструкции.
  • smap - Защита доступа ядра к памяти пользователя.
  • clflushopt -   Быстрая очистка кэша.
  • xsaveopt - Оптимизированное сохранение состояния CPU.
  • xsavec -  Компактное сохранение состояния.
  • xgetbv1 - Чтение расширенных регистров состояния.
  • xsaves -  Расширенное сохранение состояния процессора.
  • arat - Постоянно работающий таймер APIC.
  • vnmi - Виртуализация немаскируемых прерываний.
  • umip - User Mode Instruction Prevention.
  • md_clear - Защита от атак Microarchitectural Data Sampling.
  • flush_l1d - Очистка кэша L1D для защиты от утечек.
  • arch_capabilities - Дополнительные сведения о возможностях и средствах защиты процессора.

Но если смотреть и вникать в каждый флаг, то мне как системному администратору это не нужно, главное под приложение уметь посмотреть, а поддерживает ли мой CPU и если я задамся целью приобщиться к ИИ (YOLO,PyTorch,OpenCV) то в тех инструментах мне как бы нужны: AVX,AVX2,FMA,SSE4.1,SSE4.2,AES,BMI1/BMI2,F16C.

Они нужны для библиотек машинного обучения и компьютерного зрения.

Может если нет нужного флага, часть функционала просто не будет работать, и сборка пакета сообщит мне об этом или системные требования к проекту, тут либо менять CPU на тот что нужно или пока отложить задачу.

Шаг №3: К примеру, выше я показал, что у меня программное обеспечение не запускается внутри виртуальной машины, в Proxmox для VM можно выбрать Type, что я и сделал указав Type: Host, а то по умолчанию было выбрано: kvm64, как примеру или x86-64-v2-AES.

По итогу я узнал чуть больше чем до этого, немного, но все же, с миру по нитке и все начинает складываться и пониматься.

На этом пока все, с уважением автор блога ekzorchik.