2012-05-14 13 views
10

Mam dużą funkcję przetwarzania pikseli, którą obecnie próbuję optymalizować za pomocą funkcji wewnętrznych.Tablica przeglądowa za pomocą SIMD

Będąc nowicjuszem SSE, nie jestem pewien, jak poradzić sobie z częścią kodu, która wymaga tablic przeglądowych.

Zasadniczo próbuję wektorować następujące waniliowy kodu C++:

//outside loop 
const float LUT_RATIO = 1000.0F; 

//in loop 
float v = ... //input value 
v = myLookupTable[static_cast<int>(v * LUT_RATIO)]; 

Próbuję:

//outside loop 
const __m128 LUT_RATIO = _mm_set1_ps(1000.0F); 

//in loop 
__m128 v = _mm_set_ps(v1, v2, v3, v4); //input values 
__m128i vI = _mm_cvtps_epi32(_mm_mul_ps(v, LUT_RATIO)); //multiply and convert to integers 
v = ??? // how to get vI indices of myLookupTable? 

edit: Ildjarn sprawia, że ​​punkt, który wymaga wyjaśnienia z mojej strony. Nie próbuję osiągnąć przyspieszenia w odniesieniu do kodu tabeli odnośników, staram się jedynie uniknąć konieczności przechowywania rejestrów z powrotem do floats specjalnie do wyszukiwania, ponieważ ta część jest umieszczona pomiędzy 2 innymi częściami, które teoretycznie mogłyby skorzystać z SSE.

+0

Kto jest przekonany, że można poprawić na 'myLookupTable [static_cast (v) * LUT_RATIO]'? Nie ma tutaj żadnych obliczeń, dlaczego SSE miałoby zastosowanie? – ildjarn

+2

@ildjarn Jestem prawie pewien, że nie mogę poprawić tej części per se, ale mam nadzieję poprawić inne części tej funkcji i uniknąć kary przesuwania się pomiędzy '__m128' i' float [4] ' Muszę też wektoryzować ten kod. – Rotem

Odpowiedz

12

Jeśli możesz poczekać do przyszłego roku, procesory Intel Haswell będą miały AVX2, który zawiera instrukcje dla zebranych ładunków. Umożliwia to np. 8 równoległych wyszukiwań LUT w jednej instrukcji (patrz np. VGATHERDPS). Poza tym masz pecha, chyba że twoje LUT są dość małe (na przykład 16 elementów), w takim przypadku możesz użyć PSHUFB.

+0

Niestety moje LUTs mają 10000 elementów dużych. Nawet jeśli miałbym czekać na nowy procesor, miną lata, zanim uzasadnione byłoby określenie Haswell jako minimalnego procesora. :) Dzięki za informację. – Rotem

+1

OK - jeśli możesz zbliżyć swoje LUT, np. z wielomianem, możesz nadal wygrać z SSE, w przeciwnym razie obawiam się, że utknąłeś za pomocą kodu skalarnego. –

+3

Kod Scalar to wtedy. To dobra wiadomość w pewnym sensie, mogę przestać martwić się o tę część i pracować nad częściami, które mogą okazać się bardziej optymalne. – Rotem