__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