Transformer un algorithme séquentiel en un parallél

Résolu/Fermé
ra7ma7788 - 18 nov. 2012 à 18:25
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 18 nov. 2012 à 19:10
Bonjour,

je suis une étudiante en sciences informatiques j'ai entrain d'étudier l'algorithmique et architectures parallèles , j'aime bien savoir comment transformer un algorithme séquentiel en un parallél?
exemple: trie à bulle

VARIABLE permut : Booleen;

REPETER
permut = FAUX
POUR i VARIANT DE 1 à N-1 FAIRE
SI a[i] > a[i+1] ALORS
echanger a[i] et a[i+1]
permut = VRAI
FIN SI
FIN POUR
TANT QUE permut = VRAI

A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
18 nov. 2012 à 19:10
Déjà la parallélisation est faite pour gagner du temps sur l'exécution des algorithmes séquentiels, mais il faudrait déjà penser à optimiser ces algorithmes de bases, et le tri à bulles est l'un des plus mauvais algorithmes de tris !

Puisque c'est un exercice très scolaire on va garder ton tri à bulle, de complexité O(n²), et l'exécuter sur '2^k' machines en parallèles.
On peut découper le tableau 'a' en '2^k' morceaux de tailles n/2^k.
Chaque ordinateur exécute le tri à bulles sur son morceau de tableau, soit un temps O(n²/(2^k)²), afin d'obtenir le morceau de tableau trié. Tout ordinateur réunis on aura obtenus 2^k morceaux de tableaux de taille n/2^k triés.

Et là il y a une opération supplémentaire à effectuer c'est fusionner les tableaux triés, ce qui se fait deux par deux. Fusionner deux tableaux de taille 'm' se fait en O(2m).
À la première itération on prend par exemple les ordinateurs "pairs" qui envoient leur morceaux de tableau trié aux ordinateurs "impairs" qui en auront ainsi deux, et peuvent les fusionner. Après un temps O(2.n/2^k) on obtient ainsi 2^(k-1) morceaux triés de tableaux de taille n/2^(k-1).
Il faut bien sûr recommencer la fusion comme ça jusqu'aux deux derniers morceaux de tableaux de taille n/2, qui se fusionnent en un temps O(n).

Au final, la complexité temporelle O(n²) de l'algorithme séquentielle de départ devient une complexité de temporelle de O(n²/(2^k)² + n + n/2 + ... + n/2^(k-1)), ce qui se simplifie en O(n²/4^k + (2^k-1)n/2^(k-1))

Quelques exemples en remplaçant k par sa valeur :
Pour 1 ordinateur  (k=0) : O(n²)
Pour 2 ordinateurs (k=1) : O(n²/4+n)
Pour 4 ordinateurs (k=2) : O(n²/16+3n/2)
Pour 8 ordinateurs (k=3) : O(n²/64+7n/4)

Pour n ordinateurs : O(1+2(2^k-1)(2^k)/2^(k-1)) = O(2n-1)
3