cómo determinar el soporte de CPU para sse3 instrucciones set
pregunta: [&]
es el disipado de código proporcionado en la descripción de la descripción del problema una forma válida de verificar el sse3 establecido soporte?
respuesta:
no, el fragmento de código no es válido para verificar el soporte SSE3 en Windows XP.
Solución:
aquí hay un método más confiable para detectar el soporte de CPU para SSE3 y varias otras instrucciones:
: #ifdef _win32
// Windows
#define cpuid (info, x) __cpuidex (info, x, 0)
#demás
// intrínsecs GCC
#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; // manipulación de bits avanzada
bool hw_rdrand;
bool hw_bmi1;
bool hw_bmi2;
bool hw_adx;
bool hw_prefetchwt1;
// SIMD: 128 bits
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 bits
bool hw_avx;
bool hw_xop;
bool hw_fma3;
bool hw_fma4;
bool hw_avx2;
// SIMD: 512 bits
bool hw_avx512f; // Fundación AVX512
bool hw_avx512cd; // Detección de conflictos AVX512
bool hw_avx512pf; // AVX512 Pre -Fetch
bool hw_avx512er; // AVX512 Recíproco exponencial
bool hw_avx512vl; // extensiones de longitud vectorial AVX512
bool hw_avx512bw; // palabra de byte avx512
bool hw_avx512dq; // AVX512 Doubleword Quadword
bool hw_avx512ifma; // AVX512 Integer Integer 52 bit Fused Multiply-Add
bool hw_avx512vbmi; // instrucciones de manipulación de bytes vectoriales AVX512
into int [4];
cpuid (info, 0);
int nids = info [0];
CPUID (información, 0x80000000);
Nexids unsigned = info [0];
// detectar características
if (nids> = 0x00000001) {
CPUID (información, 0x00000001);
Hw_mmx = (info [3] & ((int) 1 = 0x00000007) {
CPUID (información, 0x00000007);
Hw_avx2 = (info [1] & ((int) 1 = 0x80000001) {
CPUID (información, 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
nota: Tenga en cuenta que la detección de CPU es solo un aspecto. Para utilizar realmente estas instrucciones en su código, es posible que deba realizar ajustes basados en el lenguaje de programación y el sistema operativo que está utilizando.