나는 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
더 나은 솔루션을 추천 해드립니다. 인텔 컴파일러는 두 가지 코드 경로 생성을 지원합니다. 그렇게하면 성능 및 호환성 (코드 크기와 컴파일러 라이센스 가격의 확대) 모두에서 이익을 얻을 수 있습니다. – Rotem
64 비트 바이너리는 SSE2 지원을 확인할 필요가 없습니다. 아키텍처의 기준이됩니다.SSE2를 지원하지 않는 사람이 아직까지는 컴퓨터를 사용할 수있을만큼 오래된 컴퓨터가 있다는 것은 당연한 일입니다. (AMD Athlon XP는 가장 최근의 비 SSE2 CPU이며, Intel에서는 Pentium III입니다.) –
설치시이 확인을 수행하는 것이 차선책이 될 수 있습니다. 누군가가 고대 컴퓨터에 설치 한 다음 최신 CPU에서 동일한 설치를 사용하면 놓치게됩니다. SSE2는 보통 hand-vectorized 대신에 포기하고 스칼라 C로 돌아가는 기준선이기 때문에 이렇게 많은 것을 잃어 버릴 수 있습니다. OTOH, 그것은 런타임에 점검을위한 오버 헤드를 추가하는 것을 싫어합니다. 다행히도 x86-64 바이너리에는이 문제가 없습니다. –