bonjour a tous, je lance un post qui fait plus ou moins suite a celui ci :http://www.developpez.net/forums/sho...d.php?t=185928 , mais je vais rappeler les faits..
je programme un petit logiciel scientifique assez violent en temps de calcul. or, on vient de me proposer dans un premier temps de le faire tourner sur un ordi bi-processeur specialisé (dans un deuxieme temps, on passera peut etre sur un cluster avec un truc du genre openmosix, mais c'est une autre histoire)
donc premiere question naive : pour beneficier des 2 processeurs, mon programme doit il forcement etre en multithread ? je suppose que oui, m'enfin ca coute rien..
donc en supposant que oui, la question est : quelle est la meilleure facon de gerer ca, sachant que l'algo est iteratif mais recursif :-) en fait, l'ideal serait de fixer un nombre de thread, et de se debrouiller pour le maintenir. si un thread fini sa tache, il faudrait qu'il aille piquer du boulot a un autre. voici un pseudo code aussi clair que possible de l'algorithme en question :
comme vous le voyez, l'algo est iteratif car il repose sur un while, mais l'esprit est recursif.. donc je cherche a multithreader tout ca, et je ne vois pas bien la demarche. je connais le principe de base des threads, meme si je n'en ai encore jamais programmé, mais ici a la fois on voit clairement que chaque traitement est independant, a la fois je ne vois pas trop comment les dissocier clairement, et surtout commet redistribuer dynamiquement le travail...
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 soit P une pile Soit A l'objet de depart Soit R le resultat courant, vide au depart on empile A dans P tant que P n'est pas vide objet_courant <- depiler P si objet_courant est deja dans R, on zappe ( pas la peine de faire les calculs) sinon, on traite l'objet_courant, puis on fait un test. si le test est positif, on fusionne R et objet_courant si le test est negatif, on rejette objet_courant et on passe au suivant si le test ne permet pas de conclure : on coupe objet_courant en 2 partie O1 et O2 on empile O1 et O2 dans P fin si fin tant que
en fait, le plus simple serait peut etre de ne gerer qu'une pile de recursion pour tous les threads, comme ca pas de probleme de repartition du travail..
un grand merci aux ames charitables qui passeront par la !
Partager