Instabiles SIMD-Modul
Dieses Modul bietet Hilfsfunktionalität zum Erstellen von Code mit SIMD-Instruktionen. Verfügbar seit 0.42.0.
Hinweis: Dieses Modul ist instabil. Es wird nur als Technologievorschau bereitgestellt. Seine API kann sich zwischen den Versionen beliebig ändern oder es könnte ganz aus Meson entfernt werden.
Verwendung
Dieses Modul ist für den Anwendungsfall konzipiert, bei dem Sie einen Algorithmus mit einer oder mehreren SIMD-Implementierungen haben und zur Laufzeit auswählen, welche Sie verwenden möchten.
Das Modul bietet eine Methode, check, die wie folgt verwendet wird
rval = simd.check('mysimds',
mmx : 'simd_mmx.c',
sse : 'simd_sse.c',
sse2 : 'simd_sse2.c',
sse3 : 'simd_sse3.c',
ssse3 : 'simd_ssse3.c',
sse41 : 'simd_sse41.c',
sse42 : 'simd_sse42.c',
avx : 'simd_avx.c',
avx2 : 'simd_avx2.c',
neon : 'simd_neon.c',
compiler : cc)
Hier enthalten die einzelnen Dateien die beschleunigten Versionen der fraglichen Funktionen. Das Schlüsselwortargument compiler nimmt den Compiler entgegen, den Sie zum Kompilieren verwenden werden. Die Funktion gibt ein Array mit zwei Werten zurück. Der erste Wert ist eine Reihe von Bibliotheken, die den kompilierten Code enthalten. Jeglicher SIMD-Code, den der Compiler nicht kompilieren kann (z. B. Neon-Instruktionen auf einer x86-Maschine), wird ignoriert. Sie sollten diesen Wert mit link_with an das gewünschte Ziel übergeben. Der zweite Wert ist ein configuration_data-Objekt, das für alle unterstützten Werte den Wert 1 enthält. Wenn der Compiler beispielsweise SSE2-Instruktionen unterstützte, hätte das Objekt HAVE_SSE2 auf 1 gesetzt.
Die Generierung von Code zur Laufzeitdetektion des entsprechenden Befehlssatzes ist unkompliziert. Zuerst erstellen Sie eine Header-Datei mit dem Konfigurationsobjekt und dann eine Auswahfunktion, die wie folgt aussieht
void (*fptr)(type_of_function_here) = NULL;
#if HAVE_NEON
if(fptr == NULL && neon_available()) {
fptr = neon_accelerated_function;
}
#endif
#if HAVE_AVX2
if(fptr == NULL && avx2_available()) {
fptr = avx_accelerated_function;
}
#endif
...
if(fptr == NULL) {
fptr = default_function;
}
Jede Quelldatei stellt zwei Funktionen bereit: die Funktion xxx_available zur Abfrage, ob die aktuell verwendete CPU den Befehlssatz unterstützt, und xxx_accelerated_function, die die entsprechende beschleunigte Implementierung ist.
Am Ende dieser Funktion zeigt der Funktionszeiger auf die schnellste verfügbare Implementierung und kann aufgerufen werden, um die Berechnung durchzuführen.
Die Ergebnisse der Suche sind