sse3 명령어 세트에 대한 CPU 지원을 결정하는 방법
질문 :
#ifdef _WIN32 // Windows #define cpuid(info, x) __cpuidex(info, x, 0) #else // GCC Intrinsics #includevoid 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
솔루션 :
다음은 SSE3 및 기타 다양한 명령 세트에 대한 CPU 지원을 감지하는보다 신뢰할 수있는 방법입니다. // Windows #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; // avx512 바이트 단어 bool hw_avx512dq; // AVX512 더블 워드 쿼드 워드 bool hw_avx512ifma; // avx512 정수 52 비트 퓨즈 multiply-add bool hw_avx512vbmi; // AVX512 벡터 바이트 조작 지침 int info [4]; cpuid (정보, 0); int nids = info [0]; CPUID (정보, 0x80000000); 서명되지 않은 넥시드 = 정보 [0]; // 기능 감지 if (nids> = 0x00000001) { CPUID (Info, 0x00000001); hw_mmx = (정보 [3] & (int) 1 = 0x00000007) { CPUID (Info, 0x00000007); hw_avx2 = (정보 [1] & (int) 1 = 0x80000001) { CPUID (정보, 0x80000001); hw_x64 = (info [3] & (int) 1 이 메소드를 사용하여 코드를 실행 한 후 HW_SSE3 부울 변수를 확인하여 CPU가 SSE3 명령을 지원하는지 여부를 결정할 수 있습니다. 실제로 코드에서 이러한 지침을 사용하려면 사용중인 특정 프로그래밍 언어 및 운영 체제를 기반으로 조정해야 할 수도 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3