Bonjour,
Je suis en train de tester plusieurs instructions sse2, je me base sur la documentation MSDN (http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx).
J'utilise VS2008 et mon programme est une application win32.
J'essaie de multipli� un vecteur d'octet par un scalaire (un tableau de char par un int), j'ai d� faire d'autre manip auparavant (unpacke et package) dans le but de transform� mes octets(char) en short qui va me permettre de faire la multiplication (en fait je dois faire une addition avec un double que je transforme en short en le multipliant par 64).
Bref, tout compile parfaitement et tout s'�x�cute sans bug, le probl�me est que lorsque j'essaie d'afficher les valeurs du tableau une fois le traitement fait et bien rien ne s'affiche (que du vide).
J'ai test� sans la multiplication et les valeurs du tableau s'affiche, il y a donc un probl�me au niveau de ma multiplication.
Voici mon code (je pense que cela sera beaucoup plus clair avec):
le source:
Le headeur:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 #include "test_sse.h" int main() { int wait=0; char test[16]={24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54}; for(int i=0;i<16;i++) { cout << test[i] << endl; } cout << "==========================" << endl; CalculSSE(test,1,1.2); for(int j=0;j<16;j++) { cout << test[j] << endl; } cin >> wait; return 0; } char* CalculSSE(char* test,int brillance,double contraste) { //cast de l'image et load __m128i* pImg=(__m128i*)test; __m128i PxH; __m128i PxL; PxH= _mm_loadu_si128(pImg); PxL= _mm_loadu_si128(pImg); //Initialisation constante __m128i ZeroReg= _mm_setzero_si128(); __m128i BrillanceReg= _mm_set1_epi16((short)brillance); __m128i ContrasteReg= _mm_set1_epi16((short)(contraste*64)); //UNPACK PxH=_mm_unpackhi_epi8(PxH,ZeroReg); PxL=_mm_unpacklo_epi8(PxL,ZeroReg); //Multiplication brillance PxH=_mm_mulhi_epu16(PxH,BrillanceReg); PxL=_mm_mulhi_epu16(PxL,BrillanceReg); PxH=_mm_packus_epi16(PxL,PxH); _mm_storeu_si128(pImg,PxH); test=(char*)pImg; return test; }
en esp�rant que vous puissiez m'aider,
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 #include <iostream> #include <opencv\cv.h> #include <opencv\highgui.h> #include <xmmintrin.h> using namespace cv; using namespace std; char* CalculSSE(char* test,int brillance,double contraste);
P.S: Vous remarquerez que le but final et de faire un traitement d'image en passant par les registres SSE (qui est normalement cens� �tre plus rapide que le traitement standard).
Cordialement,
sushis
Partager