2009-09-07 11 views

Odpowiedz

38

Po pierwsze, nie polecam używania wbudowanych funkcji - nie są one przenośne (przez kompilatory tego samego łuku).

Użyj intrinsics, GCC does a wonderful job do optymalizacji kodu wewnętrznego SSE w jeszcze bardziej zoptymalizowany kod. Zawsze możesz rzucić okiem na zespół i zobaczyć, jak wykorzystać SSE do jego pełnego potencjału.

intrinsics są proste - tak jak normalnych wywołań funkcji:

#include <xmmintrin.h> 

__m128 vector1 = _mm_set1_ps(4, 3, 2, 1); // Little endian, stored in 'reverse' 
__m128 vector2 = _mm_set1_ps(7, 8, 9, 0); 

// Addition 
__m128 result = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2 

// A more advanced function, called shuffle 
vector1 = _mm_shuf_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3)); 
// vector1 is now (1, 2, 3, 4) (above shuffle reversed it) 

Oczywiście istnieje dużo więcej opcji, SSE jest naprawdę mocny i moim zdaniem stosunkowo łatwy do opanowania.

+0

Czy wiesz, że możesz zrobić gorący produkt z dwiema tablicami int32 elementów? – psihodelia

+6

Zadaj pytanie, a ja postaram się pomóc :) – LiraNuna

32

Ponieważ poprosiłeś o zasoby:

A practical guide to using SSE with C++: Dobry koncepcyjne przegląd tego, jak efektywnie korzystać z SSE, z przykładami.

MSDN Listing of Compiler Intrinsics: Kompleksowe odniesienie do wszystkich potrzeb wewnętrznych. To jest MSDN, ale prawie wszystkie wymienione tutaj elementy są obsługiwane również przez GCC i ICC.

Christopher Wright's SSE Page: Krótki przegląd znaczenia kodów SSE. Wydaje mi się, że Instrukcje Intel mogą obsługiwać tę samą funkcję, ale jest to szybsze.

Prawdopodobnie najlepiej jest napisać większość kodu w języku wewnętrznym, ale sprawdź objdump danych wyjściowych kompilatora, aby upewnić się, że tworzy efektywny kod. Generowanie kodu SIMD jest wciąż całkiem nową technologią i bardzo możliwe, że kompilator może w niektórych przypadkach go uszkodzić.