Supponiamo che ho un 2 vettore elemento definisce come segue (utilizzando la sintassi GCC per i vettori confezionati)Computing x^y con intrinseche GCC vettore
// 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)
mi piacerebbe sapere se c'è un modo più veloce per farlo i due calcoli di potenza usando le operazioni vettoriali. L'architettura è GCC su x86-64 e il codice specifico della piattaforma è OK.
implementazione di una funzione di potenza generica è difficile come lo è dal momento che potrebbe essere necessario sia 'exp()' e 'log()'. Probabilmente potrebbero esserci troppe ramificazioni per essere in grado di ottenere un utile aumento di velocità tramite la vettorizzazione. Ma sto solo speculando però. – Mysticial
No, il set di istruzioni SIMD non ha alcuna operazione che consenta di aumentare la velocità di pow(). SSE2 ha solo add, sub, mul, div, max, min e sqrt. Non c'è nemmeno un'istruzione non vettorizzata per questo. –
Potrebbe esserci qualche speranza se "y" è limitato a unsigned int anziché double. In effetti, con il classico algoritmo "shift-and-multiply" i due elementi del vettore potrebbero essere valutati in parallelo. Solo la mia ipotesi. –