Bonjour à tous, je post ici car j'ai un problème d'optimisation avec une librairie matricielle. Je reprend actuellement un code produit par quelqu'un d'autre et l'une des méthode est beaucoup trop lente à s’exécuter, il y a probablement plein d'autre problème d'optimisation qui s'y cache mais comme cette méthode fait énormément de calcul matricielle je préfère rechercher dans cette direction.
La personne ayant écrite le code a utilisé la classe Matrix de la librairie Jama. Cependant, cette structure est unique et prévue pour les matrices dense de double, or nous utilisons des matrices creuses d'int (et encore, dans la majorité des cas nous n'utilisons en faite que des vecteurs, qui seront fait par des matrices n x 1 ).
En ayant regardé rapidement sur le web je suis tombé sur la librairie UJML qui propose des structures permettant de représenter des matrices d'int creuses.En plus j'ai constaté que lorsque que cette methode tourne un seul coeur de mon processeur ne travail, UJML est (d'après le site) optimisé multi coeur. Cependant, je n'ai jamais entendu parler de cette librairie auparavant avant que j'avais déjà beaucoup entendu parler de Jama. Idem, je ne vois personne en parler sur des forums ou autre.
Donc avez vous des retours / avis sur cette librairie ou en avez vous d'autres à me proposer ?
Merci d'avance.
Edit : je précise tout de même les opérations dont j'ai besoins, il s'agit de choses basiques :
+ - *
test d'égalité ( de valeur, pas de référence)
test supérieur à
extraction d'une colonne d'une matrice
insertion par bloc de sous matrices
parcours de tout les éléments ( pour ca, le parcours de tout les éléments non nul de UJML me plait bien )
De plus, je vais prochainement devoir implémenter un calcul de noyau. Donc si je dois changer de librairie autant aller vers une qui propose ce genre de choses.
Edit 2 :
Actuellement, l'opération qui apparaît le plus souvent ( celle qui utilise environ 40% du temps d’exécution de la méthode ) est la suivante :
Matrix m= (Matrix) m0.plus(a.getMatrix(0, a.getRowDimension()-1, i));
Cette ligne fait simplement la chose suivante : m = m0 + ( i-ème colone de a).
Je re précise que les matrices avec lesquels je travail sont creuses et ne contiennent que des entiers. Dans le dernier test que j'ai fait sur des matrices 60 x 1 , cette ligne a été éxécuté environ 500 000. La méthode a pris 10 seconde à s'executer. (6seconde juste sur cette ligne)
Partager