Freigeben über


__check_isa_support, __check_arch_support

Microsoft-spezifisch

__check_isa_support – erkennt, ob der Prozessor das angegebene ISA-Feature und die AVX10-Version zur Laufzeit unterstützt. __check_arch_support – erkennt, ob das Arch-Flag (siehe /arch (x86), /arch (x64)) das angegebene ISA-Feature und die AVX10-Version zur Kompilierungszeit unterstützt.

Syntax

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

Parameter

feature
[in] ZU überprüfende ISA-Funktion.

avx10_version
[in] AVX10-Version, die überprüft werden soll. 0, wenn die AVX10-Versionsprüfung nicht erforderlich ist.

Rückgabewert

__check_isa_supportgibt zurücktrue, wenn der Prozessor zur Laufzeit false unterstützt feature und avx10_version andernfalls. __check_arch_support gibt zurück true , wenn das /arch Flag die Kompilierungszeit unterstützt feature und avx10_version zur Kompilierungszeit false unterstützt.

Anforderungen

Intrinsic Aufbau
__check_isa_support x86, x64
__check_arch_support x86, x64

Header-Datei <immintrin.h>

Hinweise

Das __check_isa_support systeminterne System bietet eine schnellere Alternative zum __cpuid systeminternen, um dynamisch nach den am häufigsten verwendeten CPU-Features zu suchen. Das __check_arch_support systeminterne System bietet eine Alternative zur predefined macros Kompilierungszeitcodeauswahl basierend auf ISA-Erweiterungen.

Die folgenden Featurewerte können in diesen systeminternen Komponenten verwendet werden. Diese Werte werden in isa_availability.hdefiniert.

Featurewertname Beschreibung
__IA_SUPPORT_VECTOR128 Vektoranweisungen mit Längen bis zu 128 Bit. Dieses Feature ist für SSE2- oder höhere Erweiterungen aktiviert.
__IA_SUPPORT_VECTOR256 Vektoranweisungen mit Längen bis zu 256 Bit. Dieses Feature ist für AVX2- oder höhere Erweiterungen aktiviert.
__IA_SUPPORT_VECTOR512 Vektoranweisungen mit Längen bis zu 512 Bit. Dieses Feature ist für AVX-512- oder höher-Erweiterungen aktiviert.
__IA_SUPPORT_AVX10 AVX10-Unterstützung. Dieses Feature ist für AVX10.1- oder höher-Erweiterungen aktiviert.
__IA_SUPPORT_SSE42 SSE4.2-Unterstützung
__IA_SUPPORT_SV128X AVX-512-Anweisungen für skalare 128 Bit. Kann verwendet werden, um zu signalisieren, dass bestimmte nützliche AVX-512-Anweisung wie Konvertierungen im skalaren Code verwendet werden können.
__IA_SUPPORT_AVX10_2 AVX10.2-Unterstützung
__IA_SUPPORT_APX APX-Unterstützung
__IA_SUPPORT_FP16 Unterstützung für Gleitkomma-Anweisung mit halber Genauigkeit

Mehrere Featurewerte können mit dem OPERATOR OR(|) kombiniert werden.

Das __check_arch_support systeminterne System kann zur Kompilierungszeit immer ausgewertet werden, sodass die Verwendung im optimierten Code keine zusätzlichen Anweisungen zur Ausführung hinzufügt. Unterstützung für diese systeminternen Elemente wurde in Visual Studio 2022, Version 17.10, hinzugefügt.

Beispiel

In diesem Beispiel werden 256-Bit-AVX-512-Anweisungen verwendet, um die Konvertierung von Werten mit doppelter Genauigkeit in 64-Bit-ganzzahlige Werte zu vektorisieren. Die Tailschleife zum Konvertieren von Quellwerten, die nicht vom Vektorcode behandelt werden, wird ebenfalls verwendet, falls der Vektorcode nicht ausgeführt werden kann. Die Kompilierungszeitunterstützung wird vor der Laufzeitunterstützung überprüft, sodass eine Laufzeitüberprüfung möglichst vermieden werden kann.

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

Ende Microsoft-spezifisch

Siehe auch

Intrinsische Compilerfunktionen