Partilhar via


__check_isa_support, __check_arch_support

Seção específica da Microsoft

__check_isa_support - detecta se o processador suporta o recurso ISA especificado e a versão AVX10 em tempo de execução. __check_arch_support- detecta se o sinalizador de arquitetura (consulte /arch (x86), /arch (x64)) suporta o recurso ISA especificado e a versão AVX10 em tempo de compilação.

Sintaxe

_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
[em] ISA a ser verificado.

avx10_version
[em] Versão AVX10 para verificar. 0 se a verificação de versão do AVX10 não for necessária.

Valor retornado

__check_isa_support retorna true se o processador der suporte feature e avx10_version em tempo de execução, false caso contrário. __check_arch_support retorna true se o /arch sinalizador der suporte feature e avx10_version em tempo de compilação, false caso contrário.

Requisitos

Intrinsic Arquitetura
__check_isa_support x86, x64
__check_arch_support x86, x64

Arquivo de cabeçalho <immintrin.h>

Comentários

O __check_isa_support intrínseco fornece uma alternativa mais rápida ao __cpuid intrínseco para verificar dinamicamente os recursos de CPU usados com mais frequência. O __check_arch_support intrínseco fornece uma alternativa para a predefined macros seleção de código em tempo de compilação com base em extensões ISA.

Os valores de recurso a seguir podem ser usados nesses intrínsecos. Esses valores são definidos em isa_availability.h.

Nome do valor do recurso Descrição
__IA_SUPPORT_VECTOR128 Instruções vetoriais com comprimentos de até 128 bits. Esse recurso está habilitado para extensões SSE2 ou posteriores
__IA_SUPPORT_VECTOR256 Instruções vetoriais com comprimentos de até 256 bits. Este recurso está habilitado para extensões AVX2 ou posteriores
__IA_SUPPORT_VECTOR512 Instruções vetoriais com comprimentos de até 512 bits. Este recurso está habilitado para extensões AVX-512 ou posteriores
__IA_SUPPORT_AVX10 Suporte AVX10. Este recurso está habilitado para extensões AVX10.1 ou posteriores
__IA_SUPPORT_SSE42 Suporte SSE4.2
__IA_SUPPORT_SV128X Instruções AVX-512 para escalar de 128 bits. Pode ser usado para sinalizar que certas instruções úteis do AVX-512, como conversões, podem ser usadas em código escalar
__IA_SUPPORT_AVX10_2 Suporte AVX10.2
__IA_SUPPORT_APX Suporte a APX
__IA_SUPPORT_FP16 Suporte a instruções de ponto flutuante de meia precisão

Vários valores de feição podem ser combinados usando o operador OR(|).

O __check_arch_support intrínseco sempre pode ser avaliado em tempo de compilação, portanto, usá-lo em código otimizado não adiciona instruções extras a serem executadas. O suporte para esses intrínsecos foi adicionado no Visual Studio 2022 versão 17.10.

Exemplo

Este exemplo usa instruções AVX-512 de 256 bits para vetorizar a conversão de valores de precisão dupla em valores inteiros com sinal de 64 bits. O loop de cauda para converter quaisquer valores de origem não tratados pelo código vetorial também é usado caso o código vetorial não possa ser executado. O suporte em tempo de compilação é verificado antes do suporte em tempo de execução para que uma verificação em tempo de execução possa ser evitada, se possível.

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

Fim da seção específica da Microsoft

Confira também

Intrínsecos do compilador