Определить поддержку процессора 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;
}

Это работало бы? Я не действительно уверен, как протестировать, так как мой ЦП поддерживает его, таким образом, я не получаю ложь от вызова функции.

Как я определяю поддержку процессора SSE2?

14
задан jww 19 August 2015 в 04:48
поделиться

4 ответа

Вызовите CPUID с eax = 1, чтобы загрузить флаги функций в edx. Бит 26 устанавливается, если доступен SSE2. Некоторый код для демонстрационных целей с использованием встроенной сборки MSVC ++ (только для 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;
11
ответ дан 1 December 2019 в 06:31
поделиться

Самый простой способ проверки поддержки SSE2 - это использование инструкции CPUID (на платформах, где она доступна). Либо с помощью встроенного ассемблера, либо с помощью интринсиков компилятора.

10
ответ дан 1 December 2019 в 06:31
поделиться

Вы можете использовать функцию _cpuid. Все объясняется в MSDN .

8
ответ дан 1 December 2019 в 06:31
поделиться

Это я нашел случайно в MSDN:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

Только для Windows, но если вас не интересует ничего кроссплатформенного, очень просто.

17
ответ дан 1 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: