Laden von Daten für GCC Vektor-Erweiterungen

8

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?

    
dcoles 16.02.2012, 19:53
quelle

2 Antworten

0

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.

    
fgp 02.10.2012, 20:06
quelle
1

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".)

    
ZachB 21.09.2016 05:59
quelle

Tags und Links