سؤال

أحتاج إلى تحديد دعم المعالج ل SSE2 قبل تثبيت برنامج. من ما أفهمه، لقد توصلت إلى هذا:

bool TestSSE2(char * szErrorMsg)
{
    __try 
    {
        __asm 
        {
              xorpd xmm0, xmm0        // executing SSE2 instruction
        }
    }
        #pragma warning (suppress: 6320)
        __except (EXCEPTION_EXECUTE_HANDLER) 
        {
            if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) 
            {
                _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
                return false;

            }
        _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
        return false;
        }   
    return true;
}

هل هذا العمل؟ لست متأكدا حقا كيفية الاختبار، لأن وحدة المعالجة المركزية الخاصة بي يدعمها، لذلك لا أحصل على خطأ من مكالمة الوظيفة.

كيف يمكنني تحديد دعم المعالج SSE2؟

هل كانت مفيدة؟

المحلول

استدعاء CPUID مع EAX = 1 لتحميل إشارات الميزة إلى EDX. يتم تعيين بت 26 إذا كان SSE2 متاحا. بعض الرمز لأغراض العرض التوضيحي، باستخدام التجميع MSVC ++ Inline (فقط ل X86 وليس المحمولة!):

inline unsigned int get_cpu_feature_flags()
{
    unsigned int features;

    __asm
    {
        // Save registers
        push    eax
        push    ebx
        push    ecx
        push    edx

        // Get the feature flags (eax=1) from edx
        mov     eax, 1
        cpuid
        mov     features, edx

        // Restore registers
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
    }

    return features;
}

// Bit 26 for SSE2 support
static const bool cpu_supports_sse2 = (cpu_feature_flags & 0x04000000)!=0;

نصائح أخرى

لقد وجدت هذا واحد عن طريق الصدفة في MSDN.:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

Windows فقط، ولكن إذا كنت غير مهتم بأي شيء عبر منصة، بسيطة للغاية.

الطريقة الأساسية للتحقق من دعم SSE2 هي باستخدام CPUID التعليمات (على المنصات حيث تتوفر). إما باستخدام التجميع المضمن أو استخدام مترجم جوهري.

يمكنك استخدام وظيفة _CPUID. كل شيء موضح في MSDN..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top