MSI 安装条件检查 CPU 的 SSE2 功能?

MSI install condition to check for CPU's SSE2 feature?

从 visual studio 2012 开始,根据 "default".
启用 SSE2 编译选项 同样对我来说,是时候继续使用该功能了——不再为我的项目手动禁用该标志。

但是,我见过很多这样的程序在不支持 SSE2 的旧处理器上执行时 崩溃
例如参见:Visual C++ 2012 cout crashes during run time

所以我想将此 CPU 功能作为先决条件,并在 WIX 中编写一些 windows 安装程序 InstallCondition
安装应该取消并防止用户在完成所有安装过程后才发现程序崩溃并且与他的系统不兼容。

是否有关于如何实施此类 InstallCondition 的指南?

2016年,你几乎找不到不支持SSE2的电脑。所以我会同意其他人的意见,并建议你忘记它。但是,如果您坚持这样做(很可能)过早优化,您可以创建一个自定义操作来检查它。代码解释here:

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

    return 0;
}

然后您可以将此自定义操作安排在 运行 启动条件之前,并包括 "SSE2" 属性 检查启动条件。​​

我不想 "steal" ,但我想 "extend" 它。

所以尼古拉提到 some other answer the solution is to call 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) from: https://github.com/Mysticial/FeatureDetector
中找到 它从 <intrin.h> 调用 __cpuid / __cpuidex

有关更多详细信息,请参阅:https://msdn.microsoft.com/en-us/library/hskdteyh.aspx

因此,有了这个 FeatureDetector(由 Mysticial 提供),我现在可以通过添加以下内容来实现所需的 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");
}

--

另见: