IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Décomposition d'une boucle for en parallele.


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Décomposition d'une boucle for en parallele.
    Bonjour,
    Je voudrais décomposer une boucle-for tres grande, afin de l'exploiter par plusieurs threads...
    Par conséquent, voila comment j'ai vu le probleme : si il y a 2 threads, chacun va executer une instruction sur deux. S'il y en a trois, une instruction sur 3, etc...
    Voila mon bout de code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    /**
     * @brief Fonction de calcul de la somme.
     * On decompose la somme en autant de threads qu'il y a.
     *
     * @param num_thread Le numero du thread executant la fonction.
     * @return NULL.
     */
     
    void *decomposeBoucle (void * num_thread) {
      long long i;
     
      /* Approximation de Pi = 4 * arctan(1) */
      for (i = N - *(int*) num_thread; i > 0; i = i-nb_thread) {
     
        if (i % 2 == 0) {
          /*On rentre en section critique : le thread doit finir de modifier la somme avant de pouvoir etre interrompu. */
          pthread_mutex_lock (&mutex);
          somme -= 4.0 / (2 * (double)i - 1);
          pthread_mutex_unlock (&mutex);
        }
     
        else {
          pthread_mutex_lock (&mutex);
          somme += 4.0 / (2 * (double)i - 1);
          pthread_mutex_unlock (&mutex);
        }
     
      }
     
      return NULL;
    }
    Remarque : N et nb_thread sont des variables globales initialisées dans le main.

    Voila. Donc, ca ne marche pas... De ce que je comprend au debugage, c'est à cause des interruptions entre les differents threads, mais je ne comprend pas pourquoi cela pose probleme théoriquement (si un thread est interrompu par un autre, il reprendra là où il était une fois son tour revenu, nan ?)
    Si vous pouviez m'éclairer...

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Vaudrait mieux calculer des sommes partielles dans chaque thread, puis récupérer les résultats comme valeur de retour des threads pour obtenir la somme "finale", plutôt que d'appeler un mutex à chaque étape. Parce que là, vu ton code, ça serait étonnant que tu gagnes le moindre bout de temps CPU... Les prises de mutex vont te carboniser le temps d'exécution !
    Tout comme tu ne gagneras pas beaucoup de temps en utilisant plus de threads que de cœurs disponibles, d'ailleurs.

    De plus, au lieu de répartir un "un calcul sur deux", ce serait préférable de séparer en "deux moitiés du tableau des valeurs" : cela accélèrera le processus pour chaque thread, car ils travailleront sur des données contigües.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    vu la forme iter(i) = f(iter(i-1))

    il vaudrait mieux avoir la boucle initiale et voir comment la factoriser plutôt que de piocher dans une technique de parallèlisation applicable principalement à des entités indépendantes...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Ok... Merci pour vos réponses, je me disais bien qu'il y avait d'autres facons de faire cela... Je ne valide pas le sujet tout de suite au cas où j'aurais d'autres questions sur ce sujet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  2. : remplir des zones de texte avec une boucle For
    Par Haro_GSD dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 21h23
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo