SSE2 _mm_slli_si128 décalage non effectué [Résolu]

Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
- - Dernière réponse : Pistol_Pete
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
- 6 mai 2011 à 08:44
Bonjour à tous,

J'ai un soucis concernant l'instruction SSE2 suivante :_mm_slli_si128
Pourquoi, quand j'exécute les deux instructions suivantes, tout ce passe bien
edge = _mm_set1_epi8 (255);
edge = _mm_slli_si128 (edge , 3); //OK

et quand je fais ceci, le décalage n'est pas fait?
int dec = 3;
edge = _mm_set1_epi8 (255);
edge = _mm_slli_si128 (edge , dec ); //KO


Je travail sur des pixels 8 bits.
Merci!

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
3
Merci
salut,

L'instruction nécessite une valeure constante. Cette valeure est indiquée directement dans le code de l'instruction.

D'autres instructions SSE permettent de faire un décalage avec une valeure non immédiate.

@++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cs_patatalo
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
0
Merci
Merci!
Je ne comprenais pas la signification d'une "valeur immédiate"...
Maintenant c'est fait
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
0
Merci
Je viens de multithreader un opérateur qui n'utilise QUE des opérations élémentaires à base de SIMD pour des traitements sur des grosses images. Je n'ai malheureusement pas le gain en performance escompté. Les temps d'exécutions sont sensiblement les mêmes voir même en défaveur de la version multithreading...

Pourtant chaque coeur à ses propres registres SIMD non? Il doit être possible d'avoir une accélération de 2 sur un dual core non?

A+
____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Un thread possède ses registres et sa pile, pas de problème sur cela.

La création d'un thread consomme du CPU, pour escompter un benef if faut donc que le traitement en vaille la peine.

Attention aussi à la synchro, une bonne gestion de celle ci fait sérieusement varier les temps.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
0
Merci
Les threads sont tous créés en amont et ils passent leur temps à attendre que le thread principal leur envoie un message (PostThreadMessage) pour leur indiquer le traitement à faire + les lignes de l'image à traiter...
La synchro est fait par le thread principal qui attend que tous les threads aient fini leur travail.

Donc on skip la création des threads et la synchro me semble correct (Dite moi si cette stratégie ne vous semble pas optimale).

Un petit exemple : pour une image 20MPixels, 1 thread 200ms, 2 thread 200ms alors que les deux processeurs travaillent à 100%...
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Comment les thread font pour attendre message ?

Si 2 CPUs à 100% et que meme temps final, la méthode de synchro est à revoir.

Essaie autre chose que PostThreadMessage:
Un eventParent et un eventThrd.
eventParent dit azu thread de se lancer dans traitement, eventThrd informe parent que traitement fini et que thread en position attente. Ainsi thread 0 CPU quand attend.

Sur processus de compression archivage (sur des Go), en procédant ainsi j'ai quasi coupé les temps en 2.
Faudrait se libérer une journée en meme temps pour mise au point, prévoir un samedi ou dimanche.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
0
Merci
Salut

Tout d'abord, merci beaucoup Brunews pour ton aide!

Voici une partie de la fonction d'attente de mes threads:
DWORD WINAPI WaitFunction(LPVOID lParam)
{
        MSG msg;
HANDLE *hEvent = (HANDLE*)lParam;				//To alert the main thread the end of the process
PeekMessage(&msg,0,0,0,PM_NOREMOVE);		//To create the message queue
SetEvent(*hEvent);

while (GetMessage(&msg, NULL, 0, 0))		//Wait for message
{	
int type  = HIWORD(msg.wParam);
int which = LOWORD(msg.wParam);
switch(which)
{

case MT_STRETCH_HIST:
if(type==dtUINT8) {Intensity::_StretchHistogramMT  ((LPVOID)msg.lParam);break;}
if(type==dtUINT16){Intensity::_StretchHistogramMT((LPVOID)msg.lParam);break;}
...
...


et voici comment le thread principal communique avec les autres threads:
bool MultiThreading::Start(int which,const char *szType,int nbThread)
{
unsigned int type=100;
if(strcmp(szType,"unsigned char")==0) type=dtUINT8;
if(strcmp(szType,"unsigned short int")==0) type=dtUINT16;
if(strcmp(szType,"unsigned int")==0) type=dtUINT32;
if(strcmp(szType,"int")==0) type=dtINT32;
if(strcmp(szType,"float")==0) type=dtFLOAT;
if(strcmp(szType,"double")==0) type=dtDOUBLE;
if(strcmp(szType,"unsigned char float")==0) type=dtDOUBLE+1;
if(strcmp(szType,"unsigned char double")==0) type=dtDOUBLE+2;
if(type==100)return 0;


for(int i=0;i<nbThread;i++)				PostThreadMessage(idThread[i],0,MAKELONG(which,type),(LPARAM)Param);
   
        WaitForMultipleObjects(nbThread,hEvents,1,INFINITE);
        return 1;
}


Il faut que j'essaye un eventParent à la place du PostThreadMessage...
Si tu veux l'ensemble du code, dis le moi, je te l'enverrai.
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.