14

ソフトウェアをインストールする前に、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;
}

これは機能しますか?私のCPUはそれをサポートしているので、テスト方法がよくわからないので、関数呼び出しから false になりません。

SSE2 のプロセッサ サポートを確認するにはどうすればよいですか?

4

4 に答える 4

17

MSDNで偶然これを見つけました:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

Windows のみですが、クロスプラットフォームに興味がない場合は、非常に簡単です。

于 2010-03-17T15:45:55.147 に答える
11

CPUID を eax = 1 で呼び出して、機能フラグを edx にロードします。SSE2 が使用可能な場合、ビット 26 が設定されます。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;
于 2010-03-08T23:09:00.813 に答える
10

SSE2 サポートを確認する最も基本的な方法は、CPUID命令を使用することです (使用可能なプラットフォームで)。インライン アセンブリを使用するか、コンパイラの組み込み関数を使用します。

于 2010-03-08T18:25:55.083 に答える
8

_cpuid 関数を使用できます。すべてはMSDNで説明されています。

于 2010-03-08T18:28:54.860 に答える