Compartir a través de


__check_isa_support, __check_arch_support

Específicos de Microsoft

__check_isa_support : detecta si el procesador admite la característica ISA especificada y la versión avX10 en tiempo de ejecución. __check_arch_support : detecta si la marca arch (ver /arch (x86), /arch (x64)) admite la característica ISA y la versión de AVX10 especificadas en tiempo de compilación.

Sintaxis

_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
);

Parámetros

feature
[in] Característica ISA que se va a comprobar.

avx10_version
[in] Versión de AVX10 que se va a comprobar. 0 si no se requiere la comprobación de versiones de AVX10.

Valor devuelto

__check_isa_support devuelve true si el procesador admite feature y avx10_version en tiempo de ejecución; de lo contrario, false . __check_arch_support devuelve true si la /arch marca admite feature y avx10_version en tiempo de compilación; de lo contrario, false .

Requisitos

Intrinsic Arquitectura
__check_isa_support x86, x64
__check_arch_support x86, x64

Archivo de encabezado <immintrin.h>

Comentarios

El __check_isa_support intrínseco proporciona una alternativa más rápida a la __cpuid intrínseca para comprobar dinámicamente las características de CPU usadas con más frecuencia. El __check_arch_support intrínseco proporciona una alternativa a para la predefined macros selección de código en tiempo de compilación en función de las extensiones ISA.

Los siguientes valores de característica se pueden usar en estos intrínsecos. Estos valores se definen en isa_availability.h.

Nombre del valor de la característica Descripción
__IA_SUPPORT_VECTOR128 Instrucciones vectoriales con longitudes de hasta 128 bits. Esta característica está habilitada para las extensiones SSE2 o posteriores.
__IA_SUPPORT_VECTOR256 Instrucciones vectoriales con longitudes de hasta 256 bits. Esta característica está habilitada para extensiones AVX2 o posteriores.
__IA_SUPPORT_VECTOR512 Instrucciones vectoriales con longitudes de hasta 512 bits. Esta característica está habilitada para extensiones AVX-512 o posteriores.
__IA_SUPPORT_AVX10 Compatibilidad con AVX10. Esta característica está habilitada para las extensiones AVX10.1 o posteriores.
__IA_SUPPORT_SSE42 Compatibilidad con SSE4.2
__IA_SUPPORT_SV128X Instrucciones de AVX-512 para escalares de 128 bits. Se puede usar para indicar que ciertas instrucciones ÚTILES de AVX-512, como las conversiones, se pueden usar en código escalar.
__IA_SUPPORT_AVX10_2 Compatibilidad con AVX10.2
__IA_SUPPORT_APX Compatibilidad con APX
__IA_SUPPORT_FP16 Compatibilidad con instrucciones de punto flotante de precisión media

Se pueden combinar varios valores de característica mediante el operador OR(|).

El __check_arch_support intrínseco siempre se puede evaluar en tiempo de compilación, por lo que su uso en código optimizado no agrega instrucciones adicionales para ejecutarse. Se ha agregado compatibilidad con estos intrínsecos en Visual Studio 2022, versión 17.10.

Ejemplo

En este ejemplo se usan instrucciones de AVX-512 de 256 bits para vectorizar la conversión de valores de precisión doble a valores enteros con signo de 64 bits. El bucle de cola para convertir los valores de origen no controlados por el código vectorial también se usa en caso de que no se pueda ejecutar el código vectorial. La compatibilidad en tiempo de compilación se comprueba antes de que se admita en tiempo de ejecución para que se pueda evitar una comprobación en tiempo de ejecución si es posible.

// 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

FIN de Específicos de Microsoft

Consulte también

Intrínsecos del compilador