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

Posted

技术标签:

【中文标题】MSI 安装条件以检查 CPU 的 SSE2 功能?【英文标题】:MSI install condition to check for CPU's SSE2 feature? 【发布时间】:2016-10-28 19:31:08 【问题描述】:

从 Visual Studio 2012 开始,SSE2 编译选项按“默认”启用。 对我来说,也是时候继续使用该功能了——不再为我的项目手动禁用该标志。

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

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

有没有指导如何实现这样的InstallCondition?

【问题讨论】:

我可以向您推荐一个更好的解决方案:英特尔编译器支持生成两个代码路径。这样,您可以获得性能和兼容性(在代码大小 [和编译器许可证价格] 方面)的好处。 64 位二进制文​​件不需要检查 SSE2 支持;它是架构的基线。你是对的,仍然有足够老的计算机可以想象仍然在使用它们,但不支持 SSE2(AMD Athlon XP 是最新的非 SSE2 CPU。在 Intel 上,它是 Pentium III)。 在安装时执行此检查可能不是最佳选择。如果有人在旧计算机上安装,然后在较新的 CPU 上使用相同的安装,那么您就错过了。 SSE2 通常是您放弃并退回到标量 C 而不是手动矢量化的基线,因此您以这种方式失去了很多。 OTOH,增加运行时检查的开销很糟糕。幸运的是,您的 x86-64 二进制文件没有这个问题。 【参考方案1】:

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

UINT __stdcall CheckSSE2(MSIHANDLE hInstall)

    if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))  // SSE2
        MsiSetProperty(hInstall, L"SSE2", L"1");

    return 0;

然后您可以安排此自定义操作在启动条件之前运行,并在启动条件中包含“SSE2”属性检查。

【讨论】:

【参考方案2】:

我不想“窃取”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 它从<intrin.h> 调用__cpuid / __cpuidex

更多详情请见:https://msdn.microsoft.com/en-us/library/hskdteyh.aspx

所以有了这个 FeatureDetector (by 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://***.com/a/7495023

【讨论】:

以上是关于MSI 安装条件以检查 CPU 的 SSE2 功能?的主要内容,如果未能解决你的问题,请参考以下文章

非 SSE2 CPU 上 SSE2 movq 指令的快速解决方法

有条件地停止/开始服务

Visual Studio 中的强制 CPU 体系结构

我可以在linux中获取msi文件的源代码并添加一些条件吗?

从 Wix Bootstrapper Bundle 检查文件版本

如何设置 C/C++ 编译器选项以对使用中的 CPU 进行最佳优化? [关闭]