Repartition decpu load "decoupe de rectangle", et C++ - Algo - Programmation
Marsh Posté le 06-08-2005 à 10:01:08
apperement cest un problem np, la solution parfaite prendrais un peu trop de temps. jai trouve pas mal d algo de partitionement pour les graphs mais la cest une matrice simple.
Marsh Posté le 08-08-2005 à 01:38:04
J'aurais fait des rectangles de 1x1
Ensuite le problème se ramène à sommer toutes les valeurs de la matrice, diviser par le nombre de procs et à tomber le plus près possible juste un peu au-delà de (total/p)
Si j'ai bien lu ton énoncé, y aucune contrainte pour répondre comme cela (ou ta phrase "toutes taches ..." ne respecte aucune règle syntaxique en vigueur dans notre beau pays )
Marsh Posté le 08-08-2005 à 03:18:18
Je connais pas grand chose à ce genre de problème, mais pourquoi pas appliquer "diviser pour régner" ? C'est peut-être simpliste, mais ça donne quand-même la solution optimale pour tous les exemples que tu as donné. Je l'ai testé sur des plus grosses matrices générées aléatoirement, et les résultats semblent pas trop mauvais...
En détail:
Si il y a qu'un seul processeur, c'est trivial
S'il y a deux processeurs, c'est facile: pour un matrice N x M, il n'y a que (N-1)+(M-1) partitionnements possibles, on peut les essayer tous. La meilleur répartition sera celle dont le rapport des charges sera la plus proche de 1.
S'il y a plus de 2 processeurs, on subdivise en deux comme pour le cas précédent, puis on résout chaque sous-problème avec la moitié des processeurs...
Une amélioration: si le nombre de processeur est impair (2n+1), un des sous-problème aura n processeurs et l'autre n+1; on peut donc viser un rapport de (n+1)/n pour le partitionnement au lieu de 1...
[edit]
petite correction, ça ne donne pas la solution optimale pour l'exemple 4, ça me donne 122, alors qu'il y a moyen de faire 120.
Marsh Posté le 09-08-2005 à 05:53:34
jai implementer le brute force pour 2 cpu, ca marche maintenant faut que jessaye le deivide and conqueer.
je trouve moncode un peu lourd quand meme, quelques critique ?
Code :
|
Marsh Posté le 09-08-2005 à 15:00:51
je pense avoir reussi a implementer divide and conquer pour un nombre pair de cpu , a lexemple 4 ma de coupe se fait de :
top row, left col, down row, right col
0 0 4 0
0 1 4 1
0 2 3 4
4 2 4 4
ton Algo trouve la meme chose ?
max load de 122
ca mas pris 200 lignes de code
Marsh Posté le 09-08-2005 à 21:13:09
La solution précise trouvée dépend sûrement de petits détails d'implémentation, mais la qualité de cette solution devrait rester la même en moyenne...
Pour l'exemple 4 j'obtiens ceci (j'ai numéroté les lignes/colonnes en partant de 1):
1 1 2 5 load: 10
3 1 4 5 load: 10
5 1 5 2 load: 2
5 3 5 5 load: 122
J'ai implémenté l'algo en python; le C j'en fais plus que si je suis obligé
Code :
|
66 lignes, moins si je n'avais pas fait qqes optimisations. J'ai malheureusement écrasé la version non optimisée, mais les optimisations ont surtout pour but d'appeler moins souvent sum_rect; tu peux remplacer les calculs de sum1 et sum2 dans les boucles for de la fonction partition par sum1=sum_rect(r1) et sum2=sum_rect(r2) pour comprendre comment ça marche sans te laisser distraire par les optimisations. Je suis pas certain à 100% que c'est "bug free", mais j'ai quand-même prévu le cas où il essayerait de partager une tâche entre plusieurs processeurs.
Moins de 20 secondes pour une matrice de 1000x1000 et 10000 processeurs, mais qui a autant de processeurs à disposition ?
Je n'ai pas lu ton code C (pardon, C++, mais ça ressemble à du C ), mais à priori tu aurais intérêt à modulariser un peu en découpant l'algo en plusieurs fonctions...
Les tests:
Code :
|
Marsh Posté le 09-08-2005 à 21:19:39
et l'output des tests (il y a pour chaque CPU, d'abord sa charge puis le rectangle dont il s'occupe)
Example 1 |
Marsh Posté le 10-08-2005 à 10:57:46
convertion c++ reussi =) 200 lignes, vive python.
par contre 22.5 s en python
et 3 a peine en c++ ?!
je comprend pas.
voila le code
Code :
|
Marsh Posté le 10-08-2005 à 21:11:10
xiluoc a écrit : convertion c++ reussi =) 200 lignes, vive python. |
Qu'est-ce que ça a d'étonnant ? Entre un langage dynamiquement typé et essentiellement interprété, et un langage statiquement typé et compilé (et pour lequel les compilateurs ont une certaine maturité), ça me parait tout à fait crédible comme ordre de grandeur...
Marsh Posté le 05-08-2005 à 02:01:12
,
j explique :
On donne un nombre P de processeurs
il y a NxM taches a partager.
Le bute est de minimiser le total des tache que n importe quel pc recevra.
Les contraintes sont :
- Chaque tache ne peus pas etre partage entre les pc.
- Toutes taches alouer a un pc doivent etre un sous rectangle de la matrix
Dans l example 1
le max load est 12 ( 1 + 2 +3 + 1 + 2 +3 ) mais on vois bien que si on avait couper differement
1 2 et 3
1 2 3
1 2 3
on aurait eu 9 taches pour les 2 pc c etait parfait.
Ma question est vers quel algo regarder, je devrais peut etre choisir entre efficacite et reponses optimales.
Comment aborder le problem ? est ce un problem connu en algo ?
merci
Message édité par xiluoc le 10-08-2005 à 00:24:08