"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 문제 설명에 제공된 코드 스 니펫이 SSE3 명령 세트 지원을 정확하게 확인합니까?

문제 설명에 제공된 코드 스 니펫이 SSE3 명령 세트 지원을 정확하게 확인합니까?

2025-03-22에 게시되었습니다
검색:538

Does the Code Snippet Provided in the Problem Description Accurately Check for SSE3 Instruction Set Support?

sse3 명령어 세트에 대한 CPU 지원을 결정하는 방법

질문 :

#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  

솔루션 :

Does the Code Snippet Provided in the Problem Description Accurately Check for SSE3 Instruction Set Support?

다음은 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