2013-10-24 7 views
5

Angenommen, ich habe SSE SSE4.1- aber nicht AVX (2), was ist der schnellste Weg, um eine gepackte Speicherlayout wie diese zu laden (alle 32-Bit-Integer):Was ist der schnellste Weg, um eine SIMD-Sammlung ohne AVX (2) zu machen?

a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3 

in vier Vektoren a, b, c, d ?

a: {a0, a1, a2, a3} 
b: {b0, b1, b2, b3} 
c: {c0, c1, c2, c3} 
d: {d0, d1, d2, d3} 

Ich bin nicht sicher, ob dies relevant ist oder nicht, aber in meiner eigentlichen Anwendung habe ich 16 Vektoren und als solche a0 und a1 sind 16 * 4 Bytes auseinander im Speicher.

Antwort

9

Was müssen Sie hier 4 Lasten von einem 4x4 transponieren gefolgt:

#include "emmintrin.h"      // SSE2 

v0 = _mm_load_si128((__m128i *)&a[0]);  // v0 = a0 b0 c0 d0 
v1 = _mm_load_si128((__m128i *)&a[16]);  // v1 = a1 b1 c1 d1 
v2 = _mm_load_si128((__m128i *)&a[32]);  // v2 = a2 b2 c2 d2 
v3 = _mm_load_si128((__m128i *)&a[48]);  // v3 = a3 b3 c3 d3 

// 4x4 transpose 

w0 = _mm_unpacklo_epi32(v0, v1);    // w0 = a0 a1 b0 b1 
w1 = _mm_unpackhi_epi32(v0, v1);    // w1 = c0 c1 d0 d1 
w2 = _mm_unpacklo_epi32(v2, v3);    // w2 = a2 a3 b2 b3 
w3 = _mm_unpackhi_epi32(v2, v3);    // w3 = c2 c3 d2 d3 
v0 = _mm_unpacklo_epi64(w0, w2);    // v0 = a0 a1 a2 a3 
v1 = _mm_unpackhi_epi64(w0, w2);    // v1 = b0 b1 b2 b3 
v2 = _mm_unpacklo_epi64(w1, w3);    // v2 = c0 c1 c2 c3 
v3 = _mm_unpackhi_epi64(w1, w3);    // v3 = d0 d1 d2 d3 

Hinweis: Dies ist wahrscheinlich effizienter als die Verwendung von AVX2 Lasten gesammelt, da sie einen Lesezyklus pro Element erzeugen, was sie wirklich macht nur nützlich, wenn das Zugriffsmuster unbekannt oder schwer zu bearbeiten ist.

+0

Sie haben möglicherweise den Satz in meiner Frage über 16 Vektoren anstelle von 4 verpasst. Sollte ich wie 4 Transpositionen verwenden? – orlp

+1

In der Tat - ohne zu wissen, was Sie mit all diesen Vektoren tun wollen, ist es schwierig, eine vollständige Lösung zu finden, aber ja, Sie können einfach die obigen Schritte für die restlichen 12 Vektoren in Gruppen von 4 wiederholen. –

Verwandte Themen