Поделиться через


__check_isa_support, __check_arch_support

Блок, относящийся только к системам Майкрософт

__check_isa_support — определяет, поддерживает ли процессор указанную функцию ISA и версию AVX10 во время выполнения. __check_arch_support— обнаруживает, поддерживает ли флаг арки (см /arch . x86), /arch (x64)) указанную функцию ISA и версию AVX10 во время компиляции.

Синтаксис

_Bool __check_isa_support(
   unsigned feature,
   unsigned avx10_version
);

_Bool __check_arch_support(
   unsigned feature,
   unsigned avx10_version
);
bool __check_isa_support(
   unsigned feature,
   unsigned avx10_version
);

bool __check_arch_support(
   unsigned feature,
   unsigned avx10_version
);

Параметры

feature
[in] Функция ISA для проверки.

avx10_version
[in] Версия AVX10 для проверки. Значение 0, если проверка версии AVX10 не требуется.

Возвращаемое значение

__check_isa_support возвращает значение true , если процессор поддерживает feature и avx10_version во время выполнения, false в противном случае. __check_arch_support Возвращает значение true , /arch если флаг поддерживает feature и avx10_version во время компиляции, false в противном случае.

Требования

Intrinsic Архитектура
__check_isa_support x86, x64
__check_arch_support x86, x64

Файл заголовка <immintrin.h>

Замечания

Встроенная __check_isa_support функция обеспечивает более быструю альтернативу __cpuid встроенной функции динамического проверки наиболее часто используемых функций ЦП. Встроенная __check_arch_support функция предоставляет альтернативу predefined macros выбору кода времени компиляции на основе расширений ISA.

Следующие значения признаков можно использовать в этих встроенных компонентах. Эти значения определены в isa_availability.h.

Имя значения компонента Description
__IA_SUPPORT_VECTOR128 Векторные инструкции с длиной до 128 бит. Эта функция включена для расширений SSE2 или более поздних версий.
__IA_SUPPORT_VECTOR256 Векторные инструкции с длиной до 256 бит. Эта функция включена для расширений AVX2 или более поздних версий.
__IA_SUPPORT_VECTOR512 Векторные инструкции с длиной до 512 бит. Эта функция включена для расширений AVX-512 или более поздних версий.
__IA_SUPPORT_AVX10 Поддержка AVX10. Эта функция включена для расширений AVX10.1 или более поздних версий.
__IA_SUPPORT_SSE42 Поддержка SSE4.2
__IA_SUPPORT_SV128X Инструкции AVX-512 для скалярных 128 бит. Можно использовать для сигнала о том, что некоторые полезные инструкции AVX-512, такие как преобразования, можно использовать в скалярном коде.
__IA_SUPPORT_AVX10_2 Поддержка AVX10.2
__IA_SUPPORT_APX Поддержка APX
__IA_SUPPORT_FP16 Поддержка инструкций с плавающей запятой половины точности

Несколько значений признаков можно объединить с помощью оператора OR(|).

Встроенная __check_arch_support функция всегда может быть оценена во время компиляции, поэтому использование его в оптимизированном коде не добавляет дополнительных инструкций для выполнения. Поддержка этих встроенных функций была добавлена в Visual Studio 2022 версии 17.10.

Пример

В этом примере используются 256-разрядные инструкции AVX-512 для векторизации преобразования значений двойной точности в 64-разрядные целочисленные значения со знаком. Цикл хвоста для преобразования любых исходных значений, не обрабатываемых векторным кодом, также используется в случае, если код вектора не может быть выполнен. Поддержка во время компиляции проверяется до поддержки среды выполнения, чтобы при возможности избежать проверки среды выполнения.

// Compile this test with: /EHsc /O2
#include <iostream>
#include <vector>
#include <immintrin.h>
#include <isa_availability.h>
using namespace std;

#define CHECK_INSTRUCTION_SUPPORT(a,v) \
        (__check_arch_support((a),(v)) || __check_isa_support((a),(v)))

int main()
{
    vector<double> input = {0.3, 1.4, 2.5, 3.6, 4.7, 5.8, 6.9, 8.0, 9.1, 11.14};
    vector<__int64> output(10, 0);
    int i = 0;

    if (CHECK_INSTRUCTION_SUPPORT(__IA_SUPPORT_SV128X | __IA_SUPPORT_VECTOR256, 0))
    {
        for (; i < input.size() - 4; i += 4)
        {
            __m256i values = _mm256_cvttpd_epi64(_mm256_load_pd(&input[i]));
            _mm256_storeu_epi64((void*)&output[i], values);
        }
    }
    for (; i < input.size(); i++)
    {
        output[i] = input[i];
    }

    for (i = 0; i < output.size(); i++) {
        cout << "output[" << i << "] = " << output[i] << endl;
    }
}
output[0] = 0
output[1] = 1
output[2] = 2
output[3] = 3
output[4] = 4
output[5] = 5
output[6] = 6
output[7] = 8
output[8] = 9
output[9] = 11

Завершение блока, относящегося только к системам Майкрософт

См. также

Встроенные компоненты компилятора