2012-11-16 22 views
6

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.

+0

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

+0

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. –

+2

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. –

risposta

5

Sì, questo dovrebbe essere possibile se non si dispone di casi speciali (numeri negativi, 0, 1, NaN ecc.) In modo che il percorso del codice sia lineare.

Here è il codice generico per la funzione pow per IEEE754 raddoppia, non ha costrutti di ciclo, quindi se si mettono a nudo tutti i casi speciali, la vettorizzazione sembra semplice. Divertiti.

+2

Haha ... Capisco cosa intendi con "divertiti". :) – Mysticial

1

È possibile ciclo sugli elementi direttamente e con il CCG opzioni giuste e ICC si utilizzerà una funzione di vettorializzare pow

#include <math.h> 
typedef double vnd __attribute__((vector_size(sizeof(double)*2))); 

vnd foo(vnd x, vnd y) { 
    #pragma omp simd 
    for(int i=0; i<2; i++) x[i] = pow(x[i], y[i]); 
    return x; 
} 

Con appena -O2 ICC genera semplicemente call __svml_pow2. SVML (Short Vector Math Library) è la libreria matematica vettoriale di Intel. With -Ofast -fopenmp GCC genera semplicemente call _ZGVbN2vv___pow_finite.

Clang non lo vettorizzazione.

https://godbolt.org/g/pjpzFX

Problemi correlati