Все ли 64-битные архитектуры Intel поддерживают инструкции SSSE3/SSE4.1/SSE4.2?
Я искал в Интернете и руководство по программному обеспечению Intel. Но я не могу подтвердить, поддерживают ли все архитектуры Intel 64 до SSSE3 или до SSE4.1, или до SSE4.2, или AVX и т. Д., Чтобы я мог использовать в своей программе минимальные инструкции, поддерживаемые SIMD. Пожалуйста помоги.
2 ответа
Собственный процессор x64 (AMD64 или Intel 64) предназначен только для поддержки SSE и SSE2.
SSE3 поддерживается процессорами Intel Pentium 4 ("Prescott"), AMD Athlon 64 ("revision E"), AMD Phenom и более поздними процессорами. Это означает, что большинство, но не все, процессоры с поддержкой x64 должны поддерживать SSE3.
Дополнительный SSE3 (SSSE3) поддерживается процессорами Intel Core 2 Duo, Intel Core i7/i5/i3, Intel Atom, AMD Bulldozer, AMD Bobcat и более поздними.
SSE4.1 поддерживается на Intel Core 2 ("Penryn"), Intel Core i7 ("Nehalem"), Intel Atom (ядро Silvermont), AMD Bulldozer, AMD Jaguar и более поздних процессорах.
SSE 4.1 и SSE4.2 поддерживаются на процессорах Intel Core i7 ("Nehalem"), Intel Atom (ядро Silvermont), AMD Bulldozer, AMD Jaguar и более поздних.
AVX поддерживается процессорами Intel Sandy Bridge, AMD Bulldozer, AMD Jaguar и более поздними.
Смотрите эту серию блогов.
Процессор с собственной поддержкой x64, но без поддержки SSE3 будет 64-разрядным "первого поколения", который не поддерживается Windows 8.1 x64 native из-за требований для CMPXCHG16b, PrefetchW и LAHF/SAHF; поэтому на практике SSE3 весьма вероятно в более новых машинах. SSSE3 или более поздняя версия является более строгой в зависимости от того, на кого именно вы нацелены. Например, в обзоре оборудования Valve SSE4.1 оценивается в 77%, в SSE 4.2 - в 72% (у AMD или Intel с SSE4.1 также будут SSE3 и SSSE3).
Я пытался понять это, потому что не смог скомпилировать стороннее программное обеспечение с использованием SSE. Я обнаружил, что это может быть полезно:
cat /proc/cpuinfo
Тогда обратите внимание на раздел флагов
флаги: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tscopts_perfmulseconstant_tscop_perfmclpdbdbxpdcd_perfmclpdbdbdcdd_perfmplusbroddbdbxpdcd_perfmclpdbdbddddddddddddddddddddddbddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddbx VMX SMX Текущая ТМ2 SSSE3 sdbg ФМА CX16 xtpr pdcm PCID дк sse4_1 sse4_2 x2APIC movbe POPCNT tsc_deadline_timer АЕС XSAVE AVX F16C rdrand lahf_lm АВМ cpuid_fault EPB invpcid_single PTI intel_ppin ssbd IBRS ibpb stibp tpr_shadow vnmi FlexPriority ЕРТ VPID ept_ad fsgsbase tsc_adjust Bmi1 AVX2 smep bmi2 ERMS invpcid НКИ xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts md_clear flush_l1d
Я вижу:
sse4_1 sse4_2
Если вы пытаетесь написать код для автоматического обнаружения этого, может быть полезно следующее:
cat /proc/cpuinfo | grep flags | uniq | sed 's/.\+: //' | tr ' ' '\n' | grep -o "sse.*"
sse
sse2
sse3
sse4_1
sse4_2