2012-11-16 19 views
6

Załóżmy, że mają dwa element wektora określa się następująco (z wykorzystaniem składni GCC pakowanych wektorów)obliczeniowe x^y z intrinsics wektora GCC

// 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) 

ja informacji, czy jest to szybszy sposób wykonać dwa obliczenia mocy za pomocą operacji wektorowych. Architektura jest GCC na x86-64 i kod specyficzny dla platformy jest OK.

+0

Wdrożenie ogólną funkcję zasilania jest trudne, jak to jest, ponieważ może być konieczne zarówno 'exp()' i 'log()'. Prawdopodobnie istnieje zbyt duża liczba rozgałęzień, aby uzyskać odpowiednie przyspieszenie przez wektoryzację. Ale tylko spekuluję. – Mysticial

+0

Nie, zestaw instrukcji SIMD nie ma żadnych operacji, które umożliwiają przyspieszenie pow(). SSE2 ma tylko dodać, pod, mul, div, max, min i sqrt. Nie ma nawet nie-wektoryzowanej instrukcji do tego. –

+2

Może być trochę nadziei, jeśli "y" jest ograniczone do unsigned int zamiast double. Rzeczywiście, w przypadku klasycznego algorytmu "przesuń i pomnóż", dwa elementy wektora mogą być oceniane równolegle. Tylko moje przypuszczenie. –

Odpowiedz

5

Tak, powinno być to możliwe, jeśli nie masz specjalnych przypadków (liczby ujemne, 0, 1, NaN itd ...), aby ścieżka kodowa była liniowa.

Here to ogólny kod funkcji pow dla dubli IEEE754, nie ma konstrukcji pętli, więc jeśli rozwiążemy wszystkie specjalne przypadki, wektoryzacja wydaje się prosta. Baw się dobrze.

+2

Haha ... Rozumiem, co masz na myśli mówiąc "baw się dobrze". :) – Mysticial

1

Można pętli nad elementami i bezpośrednio z GCC odpowiednie opcje i ICC użyje Vectorized pow funkcja

#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; 
} 

Wystarczy -O2 MTK generuje po prostu call __svml_pow2. SVML (Biblioteka wektorów matematyki krótkiej) to wektoryzowana biblioteka matematyczna Intela. With -Ofast -fopenmp GCC generuje po prostu call _ZGVbN2vv___pow_finite.

Clang nie wektoryzuje.

https://godbolt.org/g/pjpzFX