2016-10-28 17 views
0

Visual Studio 2012부터는 "기본값"에 따라 SSE2 컴파일 옵션이 활성화됩니다.
나에게도이 기능을 활용하고 더 이상 수동으로 해당 프로젝트의 플래그를 수동으로 비활성화 할 필요가 없습니다.CPU의 SSE2 기능을 확인하기위한 MSI 설치 조건은 무엇입니까?

그러나 SSE2를 지원하지 않는 구형 프로세서에서 실행될 때 이러한 프로그램이 단순히 인 경우이 충돌하는 경우가 많았습니다. 예를 들어
은 다음을 참조하십시오 Visual C++ 2012 cout crashes during run time

그래서 나는이 CPU 기능을 전제 조건을 만들어 WIX에서 일부 창을 설치 InstallCondition를 제작하고 싶습니다.
설치가 취소되어 사용자가 모든 설치 절차를 수행하지 못하게되어 나중에 프로그램이 충돌하고 시스템과 호환되지 않음을 알게됩니다.

이러한 InstallCondition을 구현하는 방법에 대한 지침이 있습니까?

+0

더 나은 솔루션을 추천 해드립니다. 인텔 컴파일러는 두 가지 코드 경로 생성을 지원합니다. 그렇게하면 성능 및 호환성 (코드 크기와 컴파일러 라이센스 가격의 확대) 모두에서 이익을 얻을 수 있습니다. – Rotem

+0

64 비트 바이너리는 SSE2 지원을 확인할 필요가 없습니다. 아키텍처의 기준이됩니다.SSE2를 지원하지 않는 사람이 아직까지는 컴퓨터를 사용할 수있을만큼 오래된 컴퓨터가 있다는 것은 당연한 일입니다. (AMD Athlon XP는 가장 최근의 비 SSE2 CPU이며, Intel에서는 Pentium III입니다.) –

+0

설치시이 확인을 수행하는 것이 차선책이 될 수 있습니다. 누군가가 고대 컴퓨터에 설치 한 다음 최신 CPU에서 동일한 설치를 사용하면 놓치게됩니다. SSE2는 보통 hand-vectorized 대신에 포기하고 스칼라 C로 돌아가는 기준선이기 때문에 이렇게 많은 것을 잃어 버릴 수 있습니다. OTOH, 그것은 런타임에 점검을위한 오버 헤드를 추가하는 것을 싫어합니다. 다행히도 x86-64 바이너리에는이 문제가 없습니다. –

답변

0

나는 answer by Nikolay을 "훔치기"를 원하지 않지만 "확장"하고 싶습니다. 니콜라이 some other answer는 언급 된 바와

정도로 용액 IsProcessorFeaturePresent 전화이다
UINT __stdcall checkCpuFeatureSSE2(MSIHANDLE hInstall) 
{ 
    if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)) // SSE2 
     MsiSetProperty(hInstall, L"CPU_FEATURE_SSE2", L"1"); 

    return 0; 
} 

불행히도이 방법은 SSE2를 확인할 수있다.
later versions SIMD 기능은 SSE42, AVX, AVX2, AVX512에서 다루지 않습니다.

-

은에서 이러한 추가 기능 지금 ( this answer에서 발견) 참조 구현을 사용하고 있는지 확인합니다 : https://github.com/Mysticial/FeatureDetector
<intrin.h>에서 __cpuid/ __cpuidex를 호출합니다. 자세한 내용은

볼 : https://msdn.microsoft.com/en-us/library/hskdteyh.aspx은 (Mysticial에 의해)이 FeatureDetector 너무

지금 추가하여 원하는 LaunchCondition을 구현할 수 있습니다

DLLEXPORT VOID checkCpuFeatureSSE42(MSIHANDLE hMSI) 
{ 
    FeatureDetector::cpu_x86 features; 
    features.detect_host(); 
    if (features.HW_SSE42) 
     MsiSetProperty(hMSI, "CPU_FEATURE_SSE42", "1"); 
} 

DLLEXPORT VOID checkCpuFeatureAVX(MSIHANDLE hMSI) 
{ 
    FeatureDetector::cpu_x86 features; 
    features.detect_host(); 
    if (features.HW_AVX) 
     MsiSetProperty(hMSI, "CPU_FEATURE_AVX", "1"); 
} 

DLLEXPORT VOID checkCpuFeatureAVX2(MSIHANDLE hMSI) 
{ 
    FeatureDetector::cpu_x86 features; 
    features.detect_host(); 
    if (features.HW_AVX2) 
     MsiSetProperty(hMSI, "CPU_FEATURE_AVX2", "1"); 
} 

DLLEXPORT VOID checkCpuFeatureAVX512(MSIHANDLE hMSI) 
{ 
    FeatureDetector::cpu_x86 features; 
    features.detect_host(); 
    if (features.HW_AVX512_F) 
     MsiSetProperty(hMSI, "CPU_FEATURE_AVX512", "1"); 
} 

-

을 참조 : https://stackoverflow.com/a/7495023

3

2016 년에는 SSE2를 지원하지 않는 컴퓨터를 거의 찾을 수 없습니다. 그래서 나는 다른 사람들과 동의하고 그 사실을 잊어 버릴 것을 제안합니다. 그러나 (아마도) 조숙 한 최적화를 주장한다면,이를 확인하는 커스텀 액션을 생성 할 수 있습니다. 코드는 here를 설명 :

UINT __stdcall CheckSSE2(MSIHANDLE hInstall) 
{ 
    if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)) // SSE2 
     MsiSetProperty(hInstall, L"SSE2", L"1"); 

    return 0; 
} 

는 그런 다음 시작 조건 전에 실행하고 시작 조건에서 "SSE2"속성 검사를 포함하려면이 사용자 지정 작업을 예약 할 수 있습니다.