2010-12-19 22 views
11

Załóżmy, że ma szereg:indeksowanie do tablicy z wiatru

uint8_t arr[256]; 

i element

__m128i x 

zawiera 16 bajty

x_1, x_2, ... x_16 

ja jak skutecznie wypełnić nowy __m128i element

__m128i y 

z wartościami z arr zależności od wartości w x, tak że:

y_1 = arr[x_1] 
y_2 = arr[x_2] 
    . 
    . 
    . 
y_16 = arr[x_16] 

komenda do osiągnięcia tego celu będzie zasadniczo być ładuje rejestr z nie-zwarty zbiór miejsc pamięci. Mam boleśnie mgliste wspomnienie, że widziałem dokumentację takiego polecenia, ale nie mogę go teraz znaleźć. Czy to istnieje? Z góry dziękuje za twoją pomoc.

+0

Naprawiono formatowanie kodu; w przyszłości pamiętaj, że jeśli chcesz sformatować blok tekstu jako kod, musisz wprowadzić 4 spacje i pozostawić pustą linię (lub po prostu zaznaczyć i nacisnąć przycisk '0101'). –

+1

@Matteo: To już nie jest "101010". Zmieniło się na '{}' ... – thkala

+0

@thkala: uh, nie zauważyłem, generalnie po prostu wykonuję CTRL-K lub kopiuj-wklej z mojego edytora, gdzie mogę dodać 4 spacje naciskając klawisz TAB (i mogę korzyści z podświetlania składni). –

Odpowiedz

6

Ten rodzaj możliwości w architekturze SIMD jest znany jako load/store scatter/gather. Niestety SSE go nie ma. Przyszłe architektury SIMD firmy Intel mogą to mieć - niefortunny procesor Larrabee był jednym z przykładów. Na razie jednak wystarczy zaprojektować struktury danych w taki sposób, aby tego rodzaju funkcjonalność nie była potrzebna.

Pamiętaj, że możesz osiągnąć równoważny efekt, np. _mm_set_epi8:

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]); 

chociaż oczywiście po prostu wygeneruje pęk skalarnego kodu do załadowania twojego wektora y. Jest to w porządku, jeśli wykonujesz tego rodzaju operacje poza pętlami krytycznymi dla wydajności, np. jako część inicjalizacji przed zapętleniem, ale wewnątrz pętli prawdopodobnie będzie to zabójca wydajności.

+0

Dzięki za odpowiedź. "Gather/Scatter" jest wyraźnie terminem, którego szukałem. Po krótkiej inspekcji wygląda na to, że taka funkcjonalność jest dostępna na GPU. Jakakolwiek rada w tych kwestiach? – Travis

+0

Nawet na procesorach graficznych może to być nieefektywne, ponieważ ładowanie/zapisywanie do/z różnych adresów pamięci nieuchronnie oznacza więcej cykli autobusów. –

Powiązane problemy