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



从visual studio 2012开始,SSE2编译选项按"default"启用。
对我来说,现在是时候继续使用这个功能了——不再为我的项目手动禁用这个标志。

然而,我看到过很多这样的程序在不支持SSE2的旧处理器上执行时简单地崩溃的情况。
例如:Visual c++ 2012计算运行时崩溃

所以我想把这个CPU特性作为先决条件,并在WIX中编写一些windows安装程序InstallCondition
安装应该取消,并防止用户经历了所有的安装过程,后来才发现程序崩溃,与他的系统不兼容。

有什么指导如何实现这样的InstallCondition吗?

在2016年,你几乎找不到不支持SSE2的计算机。所以我同意其他人的观点,建议你忘记这些。但是,如果您坚持做这种(很可能)过早的优化,您可以创建一个自定义操作来检查它。代码解释如下:

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

然后你可以安排这个自定义动作在启动条件之前运行,并在启动条件中包含"SSE2"属性检查。

我不想"窃取"Nikolay的答案,但我想"扩展"它。

所以nikolay提到了一些其他的答案解决方案是调用isprocessorfeaturepresentation:

UINT __stdcall checkCpuFeatureSSE2(MSIHANDLE hInstall)
{
    if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))  // SSE2
        MsiSetProperty(hInstall, L"CPU_FEATURE_SSE2", L"1");
    return 0;
}

不幸的是,这个方法只允许检查SSE2。
以后的版本的SIMD功能不包括:SSE42, AVX, AVX2, AVX512。

,

检查这些额外的功能,我现在使用参考实现(如在这个答案中发现)从:https://github.com/Mysticial/FeatureDetector
它从<intrin.h>中调用__cpuid/__cpuidex

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

所以有了这个FeatureDetector(由mystic),我现在可以通过添加

来实现所需的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

最新更新