تحديد دعم المعالج ل SSE2؟
-
18-09-2019 - |
سؤال
أحتاج إلى تحديد دعم المعالج ل 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..