2016-10-28 17 views
0

Начиная с visual studio 2012 параметры компиляции SSE2 включаются по умолчанию.
также для меня пришло время идти вперед и использовать эту функцию - и больше не отключать этот флаг для моих проектов вручную.Состояние установки MSI для проверки функции SSE2 процессора?

Однако, я видел много случаев, когда такая программа просто выдает при получении на более старом процессоре, который не поддерживает SSE2.
например, см: Visual C++ 2012 cout crashes during run time

Так что я хотел бы сделать эту функцию CPU предпосылку и автор некоторых окон установки InstallCondition в WIX.
Установка должна быть отменена и не позволит пользователю пройти всю процедуру установки, чтобы позже узнать, что программа выйдет из строя и несовместима с его системой.

Есть ли какие-либо указания относительно того, как реализовать такое InstallCondition?

+0

Я могу порекомендовать вам лучшее решение: Intel Compiler поддерживает создание двух кодов кода. Таким образом, вы можете получить выгоду как от производительности, так и от совместимости (в плане размера кода [и цены лицензии компилятора]). – Rotem

+0

64-разрядные двоичные файлы не нуждаются в проверке поддержки SSE2; это базовая линия для архитектуры.Вы правы, что еще есть компьютеры, достаточно старые для того, чтобы кто-то, по-видимому, все еще использовал их, но не поддерживал SSE2 (AMD Athlon XP - это самый последний процессор без SSE2. На Intel это Pentium III). –

+0

Выполнение этой проверки во время установки может быть неоптимальным. Если кто-то установит на старом компьютере, то использует ту же самую установку на более новом процессоре, который вам не хватает. SSE2 обычно является базовой линией, ниже которой вы сдаетесь и возвращаетесь к скаляру C вместо векторизации, поэтому вы так сильно проигрываете. OTOH, это отстой, чтобы добавить накладные расходы для проверки во время выполнения. К счастью, ваши двоичные файлы x86-64 не имеют этой проблемы. –

ответ

0

Я не хочу «красть» answer by 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

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» Проверка свойств в условиях запуска.