दिलचस्प पोस्ट
कैसे UIImagepickercontroller में स्थिति पट्टी को छिपाने के लिए? एक स्ट्रिंग को ग्रेगोरियन कैलेंण्डर में कनवर्ट करें एएसपी.नेट एमवीसी 3 में किसी विशिष्ट प्रारूप में डेटटाइम कैसे रेंडर करना है? सी ++ में, आभासी आधार वर्ग क्या है? पीआईपी स्थापित: कृपया उस निर्देशिका की अनुमतियों और मालिक की जांच करें वैज्ञानिक संकेतन के बिना स्ट्रिंग रूपांतरण के लिए डबल पैकेज के लिए ज़िप किए गए फ़ाइलों को डाउनलोड करने और रखने के लिए अजगर के पीप का उपयोग कैसे करें? स्विफ्ट में कस्टम क्लास क्लस्टर एक बाश हेरेड के अंदर चर का उपयोग करना सीएसएस एक-दूसरे के बगल में दो डिवाईज वेरिएबल बनाने का तेज़ तरीका जो आईडी द्वारा एक कॉलम जोड़ता है चार ए स्ट्रिंग के बीच अंतर क्या है ?; और चार * p =? स्ट्रिंग?;? किसी ऐप से एक छवि का अनुरोध करते समय मेरे ऐप को क्या चयनकर्ता में प्रकट करना चाहिए? कैसे केवल एकल उद्धरणों से बचने के लिए? अतिप्रवाह क्यों होता है: छुपा एक <td> में काम नहीं करता?

कैसे जांचने के लिए कि कोई CPU SSE3 निर्देश सेट का समर्थन करता है?

क्या यह जांचने के लिए निम्नलिखित कोड वैध है कि कोई CPU SSE3 निर्देश सेट का समर्थन करता है?

IsProcessorFeaturePresent() फ़ंक्शन का उपयोग करना जाहिरा तौर पर Windows XP पर काम नहीं करता है ( http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx देखें)।

 bool CheckSSE3() { int CPUInfo[4] = {-1}; //-- Get number of valid info ids __cpuid(CPUInfo, 0); int nIds = CPUInfo[0]; //-- Get info for id "1" if (nIds >= 1) { __cpuid(CPUInfo, 1); bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false; return bSSE3NewInstructions; } return false; } 

Solutions Collecting From Web of "कैसे जांचने के लिए कि कोई CPU SSE3 निर्देश सेट का समर्थन करता है?"

मैंने एक GitHub repro बनाया है जो सभी प्रमुख x86 ISA एक्सटेंशन के लिए CPU और OS समर्थन का पता लगाएगा: https://github.com/Mysticial/FeatureDetector

यहां एक छोटा संस्करण है:


पहले आपको CPUID अनुदेश तक पहुंच की आवश्यकता है:

 #ifdef _WIN32 // Windows #define cpuid(info, x) __cpuidex(info, x, 0) #else // GCC Intrinsics #include <cpuid.h> 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 << 23)) != 0; HW_SSE = (info[3] & ((int)1 << 25)) != 0; HW_SSE2 = (info[3] & ((int)1 << 26)) != 0; HW_SSE3 = (info[2] & ((int)1 << 0)) != 0; HW_SSSE3 = (info[2] & ((int)1 << 9)) != 0; HW_SSE41 = (info[2] & ((int)1 << 19)) != 0; HW_SSE42 = (info[2] & ((int)1 << 20)) != 0; HW_AES = (info[2] & ((int)1 << 25)) != 0; HW_AVX = (info[2] & ((int)1 << 28)) != 0; HW_FMA3 = (info[2] & ((int)1 << 12)) != 0; HW_RDRAND = (info[2] & ((int)1 << 30)) != 0; } if (nIds >= 0x00000007){ cpuid(info,0x00000007); HW_AVX2 = (info[1] & ((int)1 << 5)) != 0; HW_BMI1 = (info[1] & ((int)1 << 3)) != 0; HW_BMI2 = (info[1] & ((int)1 << 8)) != 0; HW_ADX = (info[1] & ((int)1 << 19)) != 0; HW_SHA = (info[1] & ((int)1 << 29)) != 0; HW_PREFETCHWT1 = (info[2] & ((int)1 << 0)) != 0; HW_AVX512F = (info[1] & ((int)1 << 16)) != 0; HW_AVX512CD = (info[1] & ((int)1 << 28)) != 0; HW_AVX512PF = (info[1] & ((int)1 << 26)) != 0; HW_AVX512ER = (info[1] & ((int)1 << 27)) != 0; HW_AVX512VL = (info[1] & ((int)1 << 31)) != 0; HW_AVX512BW = (info[1] & ((int)1 << 30)) != 0; HW_AVX512DQ = (info[1] & ((int)1 << 17)) != 0; HW_AVX512IFMA = (info[1] & ((int)1 << 21)) != 0; HW_AVX512VBMI = (info[2] & ((int)1 << 1)) != 0; } if (nExIds >= 0x80000001){ cpuid(info,0x80000001); HW_x64 = (info[3] & ((int)1 << 29)) != 0; HW_ABM = (info[2] & ((int)1 << 5)) != 0; HW_SSE4a = (info[2] & ((int)1 << 6)) != 0; HW_FMA4 = (info[2] & ((int)1 << 16)) != 0; HW_XOP = (info[2] & ((int)1 << 11)) != 0; } 

ध्यान दें कि यह केवल पता लगाता है कि क्या CPU निर्देशों का समर्थन करता है। वास्तव में उन्हें चलाने के लिए, आपको ऑपरेटिंग सिस्टम समर्थन भी होना चाहिए।

विशेष रूप से, ऑपरेटिंग सिस्टम का समर्थन निम्न के लिए आवश्यक है:

  • x64 निर्देश (आपको एक 64-बिट OS की आवश्यकता है।)
  • निर्देश (AVX) 256-बिट ymm रजिस्टरों का उपयोग करने वाले निर्देश यह कैसे पता लगाने के लिए एंडी लुटोमिरस्की का जवाब देखें
  • निर्देश (AVX512) 512-बिट zmm और मुखौटा रजिस्टरों का उपयोग करते हैं। AVX512 के लिए ओएस समर्थन का पता लगाने AVX के समान है, लेकिन 0x6 स्थान पर ध्वज 0xe6 का उपयोग करना

मिस्टिकिक का जवाब थोड़ा खतरनाक है – यह बताता है कि कैसे सीपीयू का समर्थन पता है लेकिन ओएस समर्थन नहीं है ओएस ने आवश्यक सीपीयू विस्तारित राज्य को सक्षम किया है या नहीं यह जांचने के लिए आपको _xgetbv का उपयोग करना होगा। यहां एक और स्रोत के लिए देखें। यहां तक ​​कि जीसीसी ने एक ही गलती की है कोड का मांस है:

 bool avxSupported = false; int cpuInfo[4]; __cpuid(cpuInfo, 1); bool osUsesXSAVE_XRSTORE = cpuInfo[2] & (1 << 27) || false; bool cpuAVXSuport = cpuInfo[2] & (1 << 28) || false; if (osUsesXSAVE_XRSTORE && cpuAVXSuport) { unsigned long long xcrFeatureMask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK); avxSupported = (xcrFeatureMask & 0x6) == 0x6; } 

Googling के काफी बाद, मुझे इंटेल के समाधान भी मिले:

लिंक: https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the–4th-generation-intel-core-processor-family

  void cpuid(uint32_t eax, uint32_t ecx, uint32_t* abcd) { #if defined(_MSC_VER) __cpuidex((int*)abcd, eax, ecx); #else uint32_t ebx, edx; # if defined( __i386__ ) && defined ( __PIC__ ) /* in case of PIC under 32-bit EBX cannot be clobbered */ __asm__("movl %%ebx, %%edi \n\t cpuid \n\t xchgl %%ebx, %%edi" : "=D" (ebx), # else __asm__("cpuid" : "+b" (ebx), # endif "+a" (eax), "+c" (ecx), "=d" (edx)); abcd[0] = eax; abcd[1] = ebx; abcd[2] = ecx; abcd[3] = edx; #endif } int check_xcr0_ymm() { uint32_t xcr0; #if defined(_MSC_VER) xcr0 = (uint32_t)_xgetbv(0); /* min VS2010 SP1 compiler is required */ #else __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); #endif return ((xcr0 & 6) == 6); /* checking if xmm and ymm state are enabled in XCR0 */ } 

यह भी ध्यान रखें कि जीसीसी के कुछ विशेष इंट्रिरंस हैं जो आप उपयोग कर सकते हैं (देखें: http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html ):

  if (__builtin_cpu_supports("avx2")) // ... 

यदि आप ऊपर दी गई जानकारी के साथ इसे जोड़ते हैं, तो यह सब ठीक हो जाएगा।