Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5233 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

Challenge/Partage de connaissances : comment optimisez ce code?

n°1313182
alexIsBack
Posté le 24-02-2006 à 18:18:40  profilanswer
 

Reprise du message précédent :
oui, on peut écrire cela sous la forme que tu propose bien entendu, mais qu'est ce que ca change si on ajoute la variable temporaire value?
 
est ce que value permet de garder cette donnée temporaire plus proche du processeur ou est ce que l'expresiion  

Code :
  1. outputFrame[c] = outputFrame[c] * tau + inputFrame[c] + windowfilter[c] * outputFrame[c-1];


suffit?

mood
Publicité
Posté le 24-02-2006 à 18:18:40  profilanswer
 

n°1313185
Joel F
Real men use unique_ptr
Posté le 24-02-2006 à 18:24:29  profilanswer
 

Pour du filtrage un peu sioux , un peu de pub :
http://forum.hardware.fr/hardwaref [...] 1774-1.htm

n°1313186
Joel F
Real men use unique_ptr
Posté le 24-02-2006 à 18:25:28  profilanswer
 

skelter a écrit :

dans la premiere version il n'y a pas ce probleme
 
essayes aussi avec une bibliothèque de templates pour gérer les matrices et autre (boost::ublas, blitz++ ou celle de joelF)


 
ublas c'est limite trop bas niveau. BLitz++ est pas mal, quadn a EVE mieux vaut attendre la 1.2 >.> qui gere SSE2

n°1313220
++fab
victime du syndrome IH
Posté le 24-02-2006 à 19:43:42  profilanswer
 

Joel F a écrit :

ublas c'est limite trop bas niveau. BLitz++ est pas mal, quadn a EVE mieux vaut attendre la 1.2 >.> qui gere SSE2


ublas bas niveau ? Tu parles bien de Boost.Numeric.Ublas ? ( et non des blas, lapack )

n°1313276
skelter
Posté le 24-02-2006 à 20:46:43  profilanswer
 

alexIsBack a écrit :

oui, on peut écrire cela sous la forme que tu propose bien entendu, mais qu'est ce que ca change si on ajoute la variable temporaire value?
 
est ce que value permet de garder cette donnée temporaire plus proche du processeur ou est ce que l'expresiion  

Code :
  1. outputFrame[c] = outputFrame[c] * tau + inputFrame[c] + windowfilter[c] * outputFrame[c-1];


suffit?


 
attention, ce que j'ai ecris faut voir ca comme du pseudo code mais qu'on pourrait ecrire avec une bibliothèque (genre celles citées dans le précédent message) qui fournit des vector et matrice avec opérations vectorielles (et utilisation des templates c++ pour déroulée les boucles et surtout construire des expressions templates)
 
l'interet d'utiliser ces bibliothèques c'est de construire des expressions sur des ensembles (scalaire, matrice, vecteur) en ayant la certitude que le code générée est optimun
 
tu as compris pourquoi la variable value (ou tout simplement le fait que le calcul d'un pixel sur une ligne est dépendant du précedent) ne permet pas de construire une expression vectorielle pour le traitement de chaque ligne et qu'on est obligé de traiter par colonne ?

n°1313278
++fab
victime du syndrome IH
Posté le 24-02-2006 à 20:49:15  profilanswer
 

skelter a écrit :

l'interet d'utiliser ces bibliothèques c'est de construire des expressions sur des ensembles (scalaire, matrice, vecteur) en ayant la certitude que le code générée est optimun?


Surtout pour éviter la traversée de cache de la mort :) et s'assurer de l'absence d'alias.

n°1313280
skelter
Posté le 24-02-2006 à 20:53:08  profilanswer
 

Joel F a écrit :

ublas c'est limite trop bas niveau. BLitz++ est pas mal, quadn a EVE mieux vaut attendre la 1.2 >.> qui gere SSE2


 
en fait j'ai jamais eu le temps de tester ces bibliothèques, j'ai été voir sur le site blitz++ et d'apres les tests affichés ca à l'air pas mal en effet (concurrence fortran 90+ et son support natif des expressions vectorielles), j'ai vu qu'il y avait aussi une MTL (Matrix Template Library) en fait il y en pas mal dans le domaine du calcul scientifique

n°1313282
skelter
Posté le 24-02-2006 à 20:55:11  profilanswer
 

++fab a écrit :

Surtout pour éviter la traversée de cache de la mort :) et s'assurer de l'absence d'alias.


 
qu'est ce que tu entends par "traversée de cache de la mort" et par "l'absence d'alias" ?

n°1313288
++fab
victime du syndrome IH
Posté le 24-02-2006 à 21:11:19  profilanswer
 

skelter a écrit :

en fait j'ai jamais eu le temps de tester ces bibliothèques, j'ai été voir sur le site blitz++ et d'apres les tests affichés ca à l'air pas mal en effet (concurrence fortran 90+ et son support natif des expressions vectorielles), j'ai vu qu'il y avait aussi une MTL (Matrix Template Library) en fait il y en pas mal dans le domaine du calcul scientifique


 
Pour l'avenir, les SELL et notament "the pivot" pour le calcul scientifique. Gaby aux manettes.

n°1313356
Joel F
Real men use unique_ptr
Posté le 25-02-2006 à 00:11:54  profilanswer
 

++fab a écrit :

ublas bas niveau ? Tu parles bien de Boost.Numeric.Ublas ? ( et non des blas, lapack )


 
m'a trompé ^^  :pt1cable:

mood
Publicité
Posté le 25-02-2006 à 00:11:54  profilanswer
 

n°1313357
Joel F
Real men use unique_ptr
Posté le 25-02-2006 à 00:12:25  profilanswer
 

skelter a écrit :

en fait j'ai jamais eu le temps de tester ces bibliothèques, j'ai été voir sur le site blitz++ et d'apres les tests affichés ca à l'air pas mal en effet (concurrence fortran 90+ et son support natif des expressions vectorielles), j'ai vu qu'il y avait aussi une MTL (Matrix Template Library) en fait il y en pas mal dans le domaine du calcul scientifique


 
Je fais que de ça depuis 3 ans et je peut te dire que les perfs ont VRAIMENT etonnantes.

n°1313438
++fab
victime du syndrome IH
Posté le 25-02-2006 à 12:34:54  profilanswer
 

skelter a écrit :

qu'est ce que tu entends par "traversée de cache de la mort"


 
matrix<double> a, b, c, d;
a = b * c + d;
un compilateur C++ va te générer :
tmp[i][j] = b[i][k] * c[k][j];
 
puis :
tmp2[i][j] = tmp[i][j] + d[i][j];
 
, et enfin :
a[i][j] = tmp2[i][j];
 
on aurait aimé qu'il génère  
tmp[i][j] = b[i][k] * c[k][j] + d[i][j]
a[i][j] = tmp[i][j];
afin de maximiser la localité. Ce que les expressions templates peuvent générer.
Dans le cas contraire, il traverse le cache autant de fois qu'il y a d'opérateurs, ce qui est mortel :)
 

Citation :

et par "l'absence d'alias" ?


Et la, tu te poses la question : pourquoi diable utiliser tmp, et recopier dans a ?
Et bien contrairement à un compilateur Fortran, un compilateur C++ n'est pas autorisé à supposer que a[][] est sans alias.
le les operateurs + et * précédent doivent pouvoir fonctionner si on a les expressions suivantes :
a = b * a + d;  (1)
a = b * c + a;  (2)
 
à l'évidence, a[][] est aliasé par lui même, sans utiliser un temporaire, (1) ne donnera pas le bon résultat.
(2) donnera sans doute le bon, mais un compilateur n'est pas autorisé à supposer que tu fais une addition parce que tu utilises operator+ :)
Et plus fort encore si a[][] possede un pointeur dans sa representation interne, qui pointe vers la meme zone que b[][], même problème. Le compilateur ne pourra pas le savoir, sera pessimiste, et utilisera un temporaire.
 
restrict est la réponse à l'aliasing de C99. Pour C++, valarray, ublas, blitz++ utilise des extensions, genre __restrict généralement proposée, en attendant une meilleure solution.
au bout du compte, on peut arriver à générer ça :
a[i][j] = b[i][k] * c[k][j] + d[i][j];
si on est capable de garantir le non-aliasing -- et accessoirement, proposer une interface la moins unsafe possible.
 
 
 

n°1313448
skelter
Posté le 25-02-2006 à 13:01:11  profilanswer
 

Citation :

matrix<double> a, b, c, d;
a = b * c + d;
un compilateur C++ va te générer :
tmp[i][j] = b[i][k] * c[k][j];
 
puis :
tmp2[i][j] = tmp[i][j] + d[i][j];
 
, et enfin :
a[i][j] = tmp2[i][j];
 
on aurait aimé qu'il génère  
tmp[i][j] = b[i][k] * c[k][j] + d[i][j]
a[i][j] = tmp[i][j];
afin de maximiser la localité. Ce que les expressions templates peuvent générer.
Dans le cas contraire, il traverse le cache autant de fois qu'il y a d'opérateurs, ce qui est mortel :)


 
oui ok, c'est ce que j'entendais par "construire des expression templates", enfin il me semblais que le but était toujours  d'éviter (dans le cas d'expression vectorielle avec plus de 2 opérandes j'imagine) le découpage (comme tu le montre) de l'expression et la création de vecteurs temporaires. les expressions templates permettent de reconstruire une expression vectorielle au niveau scalaire et n'avoir plus que de simple variables scalaires temporaires (qui sont inévitables)
 
je penses que tu aurais du dire
matrix<double> a, b, c, d;
a = b * c + d;  
 
vas générer
tmp1 = b * c;
a = tmp1 + d;
 
et avec les expression templates on aura directement
tmp1[i][j] = b[i][j] * c[i][j];
a[i][j] = tmp1[i][j] + d[i][j];
 
ca serait pas plutot ca ? (en fait je suis pas sur par rapport à ton histoire d'aliasing, faudrais plus de temp)
 
 

Citation :

Et la, tu te poses la question : pourquoi diable utiliser tmp, et recopier dans a ?
Et bien contrairement à un compilateur Fortran, un compilateur C++ n'est pas autorisé à supposer que a[][] est sans alias.
le les operateurs + et * précédent doivent pouvoir fonctionner si on a les expressions suivantes :
a = b * a + d;  (1)
a = b * c + a;  (2)
 
à l'évidence, a[][] est aliasé par lui même, sans utiliser un temporaire, (1) ne donnera pas le bon résultat.
(2) donnera sans doute le bon, mais un compilateur n'est pas autorisé à supposer que tu fais une addition parce que tu utilises operator+ :)
Et plus fort encore si a[][] possede un pointeur dans sa representation interne, qui pointe vers la meme zone que b[][], même problème. Le compilateur ne pourra pas le savoir, sera pessimiste, et utilisera un temporaire.
 
restrict est la réponse à l'aliasing de C99. Pour C++, valarray, ublas, blitz++ utilise des extensions, genre __restrict généralement proposée, en attendant une meilleure solution.
au bout du compte, on peut arriver à générer ça :
a[i][j] = b[i][k] * c[k][j] + d[i][j];
si on est capable de garantir le non-aliasing -- et accessoirement, proposer une interface la moins unsafe possible.


 
ok, en fait j'avais jamais percuter ca, vive le fortrant quoi

n°1313473
++fab
victime du syndrome IH
Posté le 25-02-2006 à 13:41:56  profilanswer
 

skelter a écrit :

les expressions templates permettent de reconstruire une expression vectorielle au niveau scalaire et n'avoir plus que de simple variables scalaires temporaires (qui sont inévitables)


 
Je ne comprends pas.
 

Citation :

je penses que tu aurais du dire
matrix<double> a, b, c, d;
a = b * c + d;  
 
vas générer
tmp1 = b * c;
a = tmp1 + d;


 
Si tu veux.
 

Citation :

et avec les expression templates on aura directement
tmp1[i][j] = b[i][k] * c[k][j];
a[i][j] = tmp1[i][j] + d[i][j];


 
Non. Le but est de traverser le cache une seule fois ( ie boucler sur i et j ), pour toutes les operations. La, tu traverses le cache une fois pour * et une fois pour +.  
De plus, rien ne prouve que a soit sans alias (par d par exemple). Le compilateur n'est pas autorisé à générer la deuxième ligne sans temporaire.
 
 

Citation :

ok, en fait j'avais jamais percuter ca, vive le fortrant quoi


Disons que c'est fait pour.  

n°1313482
skelter
Posté le 25-02-2006 à 14:02:05  profilanswer
 

Citation :

Je ne comprends pas.


 
voir le topic de JoelF -> http://forum.hardware.fr/hardwaref [...] -39989.htm
ce que je dis c'est bien équivalent à ca

Citation :

le but du jeu est d'utiliser les E.T vu ci dessus pour générer du
code arithmétiques sur des classes du types Vecteur ou matrices.
Style :
 

Code :
  1. std::vector<float> a(10),b(10),c(10);
  2. a = 2*a+b*ln(c);

 
 
et généré un code sans recopie ni objets temporaires, stadire :
 

Code :
  1. std::vector<float> a(10),b(10),c(10);
  2. for(int i=0;i<10;++i)
  3. a[i] = 2*a[i]+b[i]*ln(c[i]);

 


 
 

Citation :

Non. Le but est de traverser le cache une seule fois ( ie boucler sur i et j ), pour toutes les operations.


 
tout a fais
 

Citation :

La, tu traverses le cache une fois pour * et une fois pour +.


 
c'est ce que je voulais exprimer par
tmp1 = b * c;
a = tmp1 + d;
 
et quand j'ecris
tmp1[i][j] = b[i][j] * c[i][j];
a[i][j] = tmp1[i][j] + d[i][j];  
ca ve dire qu'on ne parcour qu'une seule fois ces vecteurs
 
pour l'histoire du k et du parcour different de b et c c'est pour calculer le produit matriciel ?
 

n°1313499
++fab
victime du syndrome IH
Posté le 25-02-2006 à 14:33:01  profilanswer
 

skelter a écrit :


 
voir le topic de JoelF -> http://forum.hardware.fr/hardwaref [...] -39989.htm
ce que je dis c'est bien équivalent à ca


 
Moi aussi, tu remplace matrice par vecteur et le compte y est.
 

Citation :

et quand j'ecris
tmp1[i][j] = b[i][j] * c[i][j];
a[i][j] = tmp1[i][j] + d[i][j];  
ca ve dire qu'on ne parcour qu'une seule fois ces vecteurs


 
OK, on avait pas les mêmes notations, j'utilisait la notation d'einstein (des indices répétées) utilisées en mathématiques :
Aij = Bik . Ckj
k n'apparait que d'un coté, il est donc en sommation.
i et j apparaissent des 2 cotés : pour tout i, pour tout j.
 
 

Citation :

pour l'histoire du k et du parcour different de b et c c'est pour calculer le produit matriciel ?


Oui.


Message édité par ++fab le 25-02-2006 à 14:46:06
n°1313527
++fab
victime du syndrome IH
Posté le 25-02-2006 à 16:16:57  profilanswer
 

Citation :

et avec les expression templates on aura directement
tmp1[i][j] = b[i][j] * c[i][j];
a[i][j] = tmp1[i][j] + d[i][j];
 
ca serait pas plutot ca ? (en fait je suis pas sur par rapport à ton histoire d'aliasing, faudrais plus de temp)


 
Je reviens la dessus pour éviter la confusion.

Code :
  1. for( i )
  2. {
  3.     for( j )
  4.     {
  5.         prod = 0;
  6.         for( k )
  7.         {
  8.             prod += b[i][k] * c[k][j];
  9.         }
  10.         a[i][j] = prod + d[i][j];
  11.     }
  12. }


est équivalent à  
 
a[i][j] = b[i][k] * c[k][j] + d[i][j]; (notation des indices répétées)
 
et vu que tu ne peux pas garantir que a[][] est sans alias, c'est faux.


Message édité par ++fab le 25-02-2006 à 17:41:19
n°1313675
Joel F
Real men use unique_ptr
Posté le 25-02-2006 à 23:19:59  profilanswer
 

Dans EVE 2 , j'ai carrement retirer le produti matriciel des operatuers envoyant des expressions :s

n°1314074
alexIsBack
Posté le 27-02-2006 à 10:22:12  profilanswer
 

skelter a écrit :

attention, ce que j'ai ecris faut voir ca comme du pseudo code mais qu'on pourrait ecrire avec une bibliothèque (genre celles citées dans le précédent message) qui fournit des vector et matrice avec opérations vectorielles (et utilisation des templates c++ pour déroulée les boucles et surtout construire des expressions templates)
 
l'interet d'utiliser ces bibliothèques c'est de construire des expressions sur des ensembles (scalaire, matrice, vecteur) en ayant la certitude que le code générée est optimun
 
tu as compris pourquoi la variable value (ou tout simplement le fait que le calcul d'un pixel sur une ligne est dépendant du précedent) ne permet pas de construire une expression vectorielle pour le traitement de chaque ligne et qu'on est obligé de traiter par colonne ?


 
La variable value ou dumoins la dépendance du pixel courantr avec le précédent est CRUCIALE pour ce type de filtrage, donc, je dois le conserver.
 
mais comme dans la discussion beaucoup abordent l'idée de lancer les calculs sous fome matricielle/vectorielle, ca me fais me demander,  
=>peut on réaliser ces calculs sous forme vectorielle :
 
soit remplacer l'expression :
 

Code :
  1. #
  2. // boucle appelée pour toute nouvelle image d'entrée (inputFrame) on retyrouve le code suivant :
  3.   for (IDrow=0; IDrow <_NBrows;  ++IDrow)
  4.   {       
  5.        value=0; // initialize la variable pour chaque nouvelle ligne traitée
  6.          for (IDcolumn=0; IDcolumn<_NBcolumns ; ++IDcolumn)
  7.       {
  8.           value = outputFrame[IDrow][IDcolumn]*tau + inputFrame[IDrow][IDcolumn] +  windowfilter[IDrow][IDcolumn]* value;
  9.           outputFrame[IDrow][IDcolumn] = value;
  10.       }
  11.   }


par quelques chose comme (là, je ne donne pas la bonne syntaxe car je ne la connais pas encore...je veux d'abord savoir si ca peut valoi le coups
 

Code :
  1. //En gros ca reviens à faire sauter la remière boucle de manière à calculer toutes les lignes d'un coups :
  2. déclarer vecteur columnVector_currentVector, inputFrameVector, windowfilterVector, value  de taille =nombre de lignes de l'image
  3. // boucle qui parcour les colonnes et calcule le résultat pour toutes les lignes :
  4. for (IDcolumn=0; IDcolumn<_NBcolumns ; ++IDcolumn)
  5. value=columnVector_currentVectort[IDcolumn]*tau +  inputFrameVector[IDcolumn] + windowfilterVector[IDcolumn]* value
  6. columnVector_currentVector=value;

Message cité 1 fois
Message édité par alexIsBack le 27-02-2006 à 10:32:36
n°1314141
skelter
Posté le 27-02-2006 à 11:11:16  profilanswer
 

alexIsBack a écrit :

La variable value ou dumoins la dépendance du pixel courantr avec le précédent est CRUCIALE pour ce type de filtrage, donc, je dois le conserver.


 
si tu veux vraiment optmiser faut pas ce genre de truc, et c'est possible en faisant le traitement par colonnes (et donc en réorganisant les données), lis bien les reponses qu'on te donnes

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Code asp d'un user controlOu puis-je télécharger le code source d'un portfolio dans ce genre :
Code source GPLcomment appeler du code python dans une page web ?
Impression CODEcode vba pour inserer une ligne dans une macro
communication code php et C via sockets[Résolu]Obtenir le code source.
[C] Partage administratif et droits d'accès[RESOLU] Code couleur sous visual basic
Plus de sujets relatifs à : Challenge/Partage de connaissances : comment optimisez ce code?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)