Die Vektorerweiterungen von GCC bieten eine nette, vernünftige Möglichkeit, auf verschiedene SIMD-Anweisungen zuzugreifen Hardwarearchitekturen, ohne auf hardwarespezifische intrinsics (oder Auto-Vectorization) zurückzugreifen.
Ein echter Anwendungsfall ist die Berechnung einer einfachen additiven Prüfsumme. Die einzige Sache, die nicht klar ist, ist, wie man Daten sicher in einen Vektor lädt.
%Vor%Ein Zeiger auf den Vektor-Typ scheint zu funktionieren, aber ich befürchte, dass dies auf schreckliche Weise explodieren könnte, wenn SIMD-Hardware erwartet, dass die Vektor-Typen korrekt ausgerichtet sind.
Die einzige andere Option, an die ich gedacht habe, ist die Verwendung eines Temp-Vektors und das explizite Laden der Werte (entweder über eine memcpy- oder elementweise Zuweisung), aber beim Testen dieses Gegenstückes haben die meisten von SIMD-Befehlen verwendet. Im Idealfall würde ich mir vorstellen, dass dies etwas wie eine generische __builtin_load()
-Funktion wäre, aber keine scheint zu existieren.
Was ist eine sicherere Methode zum Laden von Daten in einen Vektor, bei der Ausrichtungsprobleme auftreten?
Sie könnten einen Initializer verwenden, um die Werte zu laden, d. h. do
%Vor% und hoffe, dass GCC dies in eine SSE-Ladeanweisung verwandelt. Ich würde das aber mit einem Disassembler überprüfen ;-). Für eine bessere Leistung versuchen Sie außerdem, buf
16-Byte ausgerichtet zu machen und diesen Compiler über ein aligned
-Attribut zu informieren. Wenn Sie sicherstellen können, dass der Eingabepuffer ausgerichtet wird, verarbeiten Sie ihn byteweise, bis Sie eine 16-Byte-Grenze erreicht haben.
Bearbeiten (danke Peter Cordes) Sie können Zeiger werfen:
%Vor% Dies wird zu vmovdqa
zum Laden und vmovups
zum Speichern kompiliert. Wenn die Daten nicht übereinstimmen, setzen Sie aligned (1)
auf vmovdqu
. ( godbolt )
Beachten Sie, dass es auch mehrere spezielle Funktionen zum Laden und Entladen dieser Register gibt ( Edit 2 ):
%Vor% Es scheint notwendig zu sein, -flax-vector-conversions
zu verwenden, um von char
s zu v16qi
mit dieser Funktion zu wechseln.
Siehe auch: C - Wie man Elemente des Vektors unter Verwendung der GCC SSE Vektorerweiterung zugänglich macht
Siehe auch: SSE lädt Ints in __m128
(Tipp: Der beste Ausdruck für Google ist etwas wie "gcc loading __m128i".)
Tags und Links gcc simd checksum vectorization