como determinar o suporte da CPU para o SSE3 Instrutivest Set
Pergunta:
é o código fornecido na descrição de uma maneira válida para verificar sse3 Suporte?
Responder:
NO, o snippet de código não é válido para verificar suporte SSE3 no Windows XP.
Solução:
Aqui está um método mais confiável para detectar suporte da CPU para SSE3 e vários outros conjuntos de instruções:
código:
// Windows
#define cpuid (info, x) __cpuidex (info, x, 0)
#outro
// GCC Intrinsics
#include
Void CPUID (int info [4], int infotipo) {
__cpuid_count (infotipo, 0, info [0], info [1], info [2], info [3]);
}
#endif
// misc.
bool hw_mmx;
bool hw_x64;
bool hw_abm; // manipulação avançada de bits
bool hw_rdrand;
bool hw_bmi1;
bool hw_bmi2;
bool hw_adx;
bool hw_prefetchwt1;
// SIMD: 128 bits
bool hw_sse;
bool hw_ssse2;
bool hw_ssse3;
bool hw_ssse3;
bool hw_ssse41;
bool hw_ssse42;
bool hw_ssse4a;
bool hw_aes;
bool hw_sha;
// SIMD: 256 bits
bool hw_avx;
bool hw_xop;
bool hw_fma3;
bool hw_fma4;
bool hw_avx2;
// SIMD: 512 bits
bool hw_avx512f; // Fundação Avx512
bool hw_avx512cd; // AVX512 Detecção de conflitos
bool hw_avx512pf; // Avx512 Presecch
bool hw_avx512er; // AVX512 recíproco exponencial
bool hw_avx512vl; // AVX512 Extensões de comprimento do vetor
bool hw_avx512bw; // Avx512 Byte Word
bool hw_avx512dq; // AVX512 Quadword duplo
bool hw_avx512ifma; // AVX512 INTEIRO INTEIRO 52 bits multiply-add
bool hw_avx512vbmi; // AVX512 Instruções de manipulação de bytes vetoriais
int info [4];
cpuid (info, 0);
int nids = info [0];
CPUID (info, 0x80000000);
nexids não assinados = info [0];
// Detecte os recursos
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 #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