Как определить поддержку CPU для набора инструкций SSE3
Вопрос:
- код, предусмотренная в задаче. Support?
решение:
вот более надежный метод для обнаружения поддержки CPU для SSE3 и различных наборов инструкций:
code:
#ifdef _win332
// окна
#define cpuid (info, x) __cpuidex (info, x, 0)
#еще
// GCC Intrinsics
#include
void cpuid (int info [4], int infotype) {
__cpuid_count (Infotype, 0, Info [0], Info [1], Info [2], Info [3]);
}
#endif
// Разное.
bool hw_mmx;
bool hw_x64;
bool hw_abm; // Усовершенствованные битовые манипуляции
bool hw_rdrand;
bool hw_bmi1;
bool hw_bmi2;
bool hw_adx;
bool hw_prefetchwt1;
// simd: 128-битный
bool hw_sse;
bool hw_sse2;
bool hw_sse3;
bool hw_ssse3;
bool hw_sse41;
bool hw_sse42;
bool hw_sse4a;
bool hw_aes;
bool hw_sha;
// simd: 256-битный
bool hw_avx;
bool hw_xop;
bool hw_fma3;
bool hw_fma4;
bool hw_avx2;
// simd: 512-бит
bool hw_avx512f; // AVX512 Фонд
bool hw_avx512cd; // Обнаружение конфликтов AVX512
bool hw_avx512pf; // AVX512 Предварительная перефшита
bool hw_avx512er; // avx512 экспоненциальный взаимный
bool hw_avx512vl; // AVX512 расширения векторной длины
bool hw_avx512bw; // Byte Word AVX512
bool hw_avx512dq; // avx512 DoubleWord Quadword
bool hw_avx512ifma; // avx512 целое число 52-битное слитое сплановое добавление
bool hw_avx512vbmi; // avx512 Инструкции по манипуляции с вектором
int info [4];
CPUID (информация, 0);
int nids = info [0];
CPUID (информация, 0x80000000);
unsigned nexids = info [0];
// обнаружить функции
if (nids> = 0x00000001) {
CPUID (информация, 0x00000001);
Hw_mmx = (info [3] & ((int) 1 = 0x00000007) {
CPUID (информация, 0x00000007);
Hw_avx2 = (info [1] & ((int) 1 = 0x80000001) {
CPUID (информация, 0x80000001);
Hw_x64 = (info [3] & ((int) 1 Используя этот метод, вы можете определить, поддерживает ли ЦПР инструкция SSE3 путем проверки логической переменной hw_sse3 после выполнения кода.
Примечание: #ifdef _WIN32
// Windows
#define cpuid(info, x) __cpuidex(info, x, 0)
#else
// GCC Intrinsics
#include
void cpuid(int info[4], int InfoType) {
__cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);
}
#endif
// Misc.
bool HW_MMX;
bool HW_x64;
bool HW_ABM; // Advanced Bit Manipulation
bool HW_RDRAND;
bool HW_BMI1;
bool HW_BMI2;
bool HW_ADX;
bool HW_PREFETCHWT1;
// SIMD: 128-bit
bool HW_SSE;
bool HW_SSE2;
bool HW_SSE3;
bool HW_SSSE3;
bool HW_SSE41;
bool HW_SSE42;
bool HW_SSE4a;
bool HW_AES;
bool HW_SHA;
// SIMD: 256-bit
bool HW_AVX;
bool HW_XOP;
bool HW_FMA3;
bool HW_FMA4;
bool HW_AVX2;
// SIMD: 512-bit
bool HW_AVX512F; // AVX512 Foundation
bool HW_AVX512CD; // AVX512 Conflict Detection
bool HW_AVX512PF; // AVX512 Prefetch
bool HW_AVX512ER; // AVX512 Exponential Reciprocal
bool HW_AVX512VL; // AVX512 Vector Length Extensions
bool HW_AVX512BW; // AVX512 Byte Word
bool HW_AVX512DQ; // AVX512 Doubleword Quadword
bool HW_AVX512IFMA; // AVX512 Integer 52-bit Fused Multiply-Add
bool HW_AVX512VBMI; // AVX512 Vector Byte Manipulation Instructions
int info[4];
cpuid(info, 0);
int nIds = info[0];
cpuid(info, 0x80000000);
unsigned nExIds = info[0];
// Detect Features
if (nIds >= 0x00000001){
cpuid(info, 0x00000001);
HW_MMX = (info[3] & ((int)1 = 0x00000007){
cpuid(info, 0x00000007);
HW_AVX2 = (info[1] & ((int)1 = 0x80000001){
cpuid(info, 0x80000001);
HW_x64 = (info[3] & ((int)1 . Чтобы фактически использовать эти инструкции в вашем коде, вам может потребоваться внести коррективы на основе конкретного языка программирования и операционной системы, которую вы используете.
]