Задача: Как узнать какие инструкции поддерживает процессор в системе.
Инструкции процессора — это команды, которые процессор умеет выполнять аппаратно. Можно представить их как «словарь» процессора: чем больше инструкций он знает, тем больше операций может выполнять быстро и эффективно.
Ну допустим есть 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.