Możemy permutować wektor w kilku miejscach i potrzebujemy wartości wyróżniającej 0 do użycia z wbudowanym vec_perm
. Nie byliśmy w stanie zlokalizować pliku vec_zero()
lub podobnego, więc chcielibyśmy wiedzieć, jak powinniśmy postępować.Jak uzyskać wartość VSX równą zero?
Kod aktualnie używa dwóch strategii. Pierwsza strategia jest obciążenie wektor:
__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);
Druga strategia jest xor użyciu maski zamierzamy użyć:
__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);
Nie rozpoczęte odniesienia (jeszcze), więc nie zrobić wiedzieć, czy ktoś jest lepszy od drugiego. Pierwsza strategia wykorzystuje obciążenie VMX i może być kosztowna. Druga strategia pozwala uniknąć obciążenia, ale wprowadza zależność od danych.
Jak uzyskać wartość VSX równą zero?
Jeśli tylko zainicjować zmienną wektor do zera w zwykły sposób (zwróć uwagę, że istnieją dwie różne składnie tego, w zależności od tego, jakiego kompilatora używasz), wtedy kompilator zwykle wybierze dowolną metodę, która będzie bardziej wydajna niż zera do wektora. –
Możesz oczywiście użyć bezpośredniej formy vec_splat dla zera i innych małych wartości. –