2017-09-09 2 views
5

Wir permutieren einen Vektor an einigen Stellen, und wir brauchen den ausgezeichneten 0-Wert, der mit der eingebauten vec_perm verwendet wird. Wir konnten vec_zero() oder ähnliches nicht lokalisieren, also würden wir gerne wissen, wie wir mit den Dingen umgehen sollten.Wie erhalten Sie einen VSX-Wert von Null?

Der Code verwendet derzeit zwei Strategien. Die erste Strategie ist eine Vektor-Belastung:

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

Die zweite Strategie ist ein xor unter Verwendung der Maske wir verwenden wollen:

__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

Wir haben noch nicht begonnen Benchmarks (noch) nicht, so dass wir nicht weiß, ob einer besser ist als der andere. Die erste Strategie verwendet eine VMX-Last und könnte teuer sein. Die zweite Strategie vermeidet die Last, führt jedoch eine Datenabhängigkeit ein.

Wie erhalten wir einen VSX-Wert von Null?

+0

Wenn Sie nur die Vektorvariable in der üblichen Weise auf Null initialisiert werden (beachten Sie, dass es Je nachdem, welchen Compiler Sie benutzen, werden zwei verschiedene Syntaxen verwendet. Dann wählt der Compiler in der Regel diejenige Methode, die effizienter ist, um null auf den Vektor zu setzen. –

+0

Sie können natürlich die sofortige Form von vec_splat für Null und andere kleine Werte verwenden. –

Antwort

1

Ich würde vorschlagen, den Compiler für Sie behandeln lassen. Nur Initialisierung auf Null:

const uint8x16_p8 zero = {0}; 

- was wahrscheinlich zu einem xor kompilieren.

Zum Beispiel kann ein einfacher Test:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

Auf meinem Rechner kompiliert dies:

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ... 
Verwandte Themen