从visual studio 2012开始,每个"默认"启用SSE2编译选项 对我而言,还有时间继续使用该功能 - 而不再为我的项目手动禁用该标志。
但是,我在很多情况下看到这样的程序在不支持SSE2的旧处理器上执行时只会崩溃。
例如,请参阅:Visual C++ 2012 cout crashes during run time
因此,我希望将此CPU功能作为先决条件,并在WIX中创建一些Windows安装程序InstallCondition
。
安装应该取消并阻止用户完成所有安装过程,以便稍后发现程序崩溃并且与他的系统不兼容。
是否有任何指导如何实现此类InstallCondition?
答案 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),我现在可以通过添加:
来实现所需的LaunchConditionDLLEXPORT 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");
}
-