Angenommen, ich habe einen 2-Element-Vektor wie folgt definiert (die GCC-Syntax für verpackte Vektoren)Computing x^y mit GCC Vektor intrinsics
// packed vector of 2-elements
typedef double v2d __attribute__((vector_size(sizeof(double)*2)));
v2d x = ...;
double y = ...;
x[0] = pow(x[0], y)
x[1] = pow(x[1], y)
Ich mag gerne wissen, ob es ein schnellerer Weg zu tun sind die zwei Leistungsberechnungen unter Verwendung von Vektoroperationen. Die Architektur ist GCC auf x86-64 und plattformspezifischer Code ist in Ordnung.
eine generische Potenzfunktion Implementierung ist schwierig, da es da Sie ist sowohl benötigen 'exp()' und 'log()'. Es kann wahrscheinlich zu viel Verzweigung geben, um eine lohnende Beschleunigung durch Vektorisierung zu erhalten. Aber ich spekuliere nur. – Mysticial
Nein, der SIMD-Befehlssatz hat keine Operationen, die eine Beschleunigung von pow() ermöglichen. SSE2 hat nur add, sub, mul, div, max, min und sqrt. Es gibt nicht einmal eine nicht vektorisierte Anweisung dafür. –
Es kann etwas Hoffnung geben, wenn "y" auf unsigned Int statt Double beschränkt ist. Tatsächlich konnten mit dem klassischen "Shift-and-Multiply" -Algorithmus die beiden Vektorelemente parallel ausgewertet werden. Nur meine Vermutung. –