__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
Завершение блока, относящегося только к системам Майкрософт