__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_support
gibt 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.h
definiert.
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