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

时间:2016-10-28 19:31:09

标签: windows wix windows-installer simd sse2

从visual studio 2012开始,每个"默认"启用SSE2编译选项 对我而言,还有时间继续使用该功能 - 而不再为我的项目手动禁用该标志。

但是,我在很多情况下看到这样的程序在不支持SSE2的旧处理器上执行时只会崩溃
例如,请参阅:Visual C++ 2012 cout crashes during run time

因此,我希望将此CPU功能作为先决条件,并在WIX中创建一些Windows安装程序InstallCondition。 安装应该取消并阻止用户完成所有安装过程,以便稍后发现程序崩溃并且与他的系统不兼容。

是否有任何指导如何实现此类InstallCondition?

2 个答案:

答案 0 :(得分: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"物业检查发射条件。

答案 1 :(得分:1)

我不想"窃取" answer by Nikolay,但我希望"延伸"它。

因此,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)参考实施的那些附加功能。 它从__cpuid调用__cpuidex / <intrin.h>

有关其他详细信息,请参阅: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");
}

-

另见:https://stackoverflow.com/a/7495023