SSE2 a wielkie liczby

0

Cześć. Ostatnio przy okazji pisania pewnego programu natknąłem się na problem - jak obsługiwać wielkie liczby korzystając z SSE2?
Przykładowo, kod:

#include <stdio.h>
#include <emmintrin.h>
int main( ) {
	__m128i i, j, x;
	int r;
	i = _mm_set1_epi16( 5 );
	j = _mm_set1_epi16( 10 );
	x = _mm_add_epi16( i, j );
	r = _mm_extract_epi16( x, 0 );
	printf( "%i\n", r );
}

Daje spodziewany wynik - 15. Wszystko pięknie jeśli zostajemy przy zwykłym int.
Co jednak zrobić aby móc stosować wielkie liczby (powiedzmy: unsigned long long)?
Normalnie podstawiając dużą liczbę kompilator stwierdzi że tak się nie da, wypluwając "warning #69: integer conversion resulted in truncation".

"Podzielenie" wielkiej liczby na 4 części nie wchodzi w grę, _mm_set1 używam tylko jako przykład - docelowo oczywiście chcę robić działania na czterech liczbach jednocześnie.

Swoją drogą, dziwi mnie że w SSE2 istnieją mm*_epi32, ale _mm_extract_epi32 pojawia się dopiero przy SSE4... jest na to jakieś wyjaśnienie? Niestety nawet nie mogę przetestować epi32 bo mam w procesorze obsługę tylko SSE2 ...

0
i44 napisał(a)

Co jednak zrobić aby móc stosować wielkie liczby (powiedzmy: unsigned long long)?
Normalnie podstawiając dużą liczbę kompilator stwierdzi że tak się nie da, wypluwając "warning #69: integer conversion resulted in truncation".
_mm_set_epi64, _mm_add_epi64 etc.

i44 napisał(a)

Swoją drogą, dziwi mnie że w SSE2 istnieją mm*_epi32, ale _mm_extract_epi32 pojawia się dopiero przy SSE4... jest na to jakieś wyjaśnienie? Niestety nawet nie mogę przetestować epi32 bo mam w procesorze obsługę tylko SSE2 ...
To powinno pomóc: http://sseplus.sourceforge.net/group__emulated___s_s_e2.html

0

O, ten SSEplus wygląda bardzo ciekawie, jutro go dokładnie przetestuję, zdaje się że tego właśnie mi było trzeba. Dzięki [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1