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