Определить поддержку процессора для SSE2?
Мне нужно определить поддержку процессора для 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;
}
Будет ли это работать? Я не уверен, как тестировать, так как мой процессор поддерживает его, поэтому я не получаю false из вызова функции.
Как определить поддержку процессора для SSE2?
Ответы
Ответ 1
Вызовите CPUID с eax = 1, чтобы загрузить флаги функций в edx. Бит 26 устанавливается, если доступен SSE2. Некоторый код для демонстрационных целей, с использованием встроенной сборки MSVС++ (только для 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;
Ответ 2
Я нашел это случайно в MSDN:
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );
Только для Windows, но если вы не заинтересованы в кросс-платформенном, очень просто.
Ответ 3
Самый простой способ проверить поддержку SSE2 - это использовать инструкцию CPUID
(на платформах, где она доступна). Либо использовать встроенную сборку, либо использовать встроенные компиляторы.
Ответ 4
Вы можете использовать функцию _cpuid. Все объяснено в MSDN.