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


person DogDog    schedule 08.03.2010    source источник
comment
Какая-то конкретная операционная система?   -  person Paul R    schedule 08.03.2010
comment
Ваш код должен работать нормально, насколько я могу судить. Я бы предпочел способ CPUID, потому что он немного более гибкий и дает вам доступ к целому ряду других флагов возможностей ЦП.   -  person Alexander Gessler    schedule 09.03.2010
comment
Вы можете запустить виртуализированную ОС и заставить ее эмулировать процессор без SSE2. Это может быть не быстро, но должно быть точно, не так ли?   -  person Ken    schedule 09.03.2010
comment
Поддержка процессора и поддержка ОС для SSE2 — это две разные вещи. Процессор может поддерживать SSE2, поэтому соответствующий бит устанавливается после CPUID. Однако ОС может не включить его (я думаю, что необходимо включить расширения MMX). Что касается поддержки ЦП, Эшли предоставила ответ. Что касается поддержки ОС под Windows, Тимбо предоставил ответ. Я не видел ответа на поддержку ОС под Linux. Я думаю, что это тесты GCC для поддержки ОС SSE2: исходный файл sse-6.c.   -  person jww    schedule 20.08.2015


Ответы (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;
person AshleysBrain    schedule 08.03.2010
comment
Вам лучше использовать встроенный __cpuid, потому что встроенная сборка больше не поддерживается компилятором Microsoft AMD64. - person Axel Gneiting; 09.03.2010
comment
Есть ли руководство о том, что проверять во время компиляции, чтобы узнать, какие наборы инструкций SSE доступны процессору? SSE3, SSE4, SSE4.1 и т.д... - person Alex; 23.05.2014

Я случайно нашел это в MSDN:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

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

person Timbo    schedule 17.03.2010

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

person Alexander Gessler    schedule 08.03.2010

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

person Patrice Bernassola    schedule 08.03.2010