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

Framework .NET Discussion :

threadpool multi-coeurs, une utopie ?


Sujet :

Framework .NET

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut threadpool multi-coeurs, une utopie ?
    Bonsoir,


    Ma question est très simple... quelles sont les contraintes dans la création d'un threadpool afin que les threads soient "automatiquement répartis" sur les différents coeurs ?

    j'ai commencé un prototype où j'ai banni toutes écritures concurrentes et toutes sections critiques... mais à part impossible d'avoir une répartition correcte sur les quatre coeurs du serveur (muni d'un Intel Core i7 960 si mes souvenirs sont bons, mais ce n'est pas encore le problème )

    le fait de limiter le nombre de threads en fonctionnement grâce à une sémaphore implique de rester dans le même espace mémoire... est-ce le point bloquant ?


    sinon, il me reste la possibilité de créer N processus, et d'envoyer explicitement les threads s'exécuter sur un coeur, mais j'aimerais éviter si possible de refaire le boulot de l'OS
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Tu as les Parallel Extensions dans le Framework 4.

    j'avais vu mais je tourne sur du 3.5 (et encore, je compte bien me limiter au 2 sur la plupart du code)




    edit : au passage, le lien pour télécharger parallel pour le framework 3.5 ne marche plus, il faudrait mettre à jour
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    C'est parceque ça n'existe plus

    C'est seulement dispo pour le 4.0...
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    C'est parceque ça n'existe plus

    C'est seulement dispo pour le 4.0...
    j'ai remarqué... mais disons que Parallel a également quelques problèmes pour l'usage que je souhaite en faire (je ne serais sûrement pas le seul à utiliser la machine à un instant donné, et je ne saurais pas forcemment quand j'aurais droit de tout utiliser... un seul serveur de calcul réellement puissant pour un labo constituée de multiples équipes. et la communication n'est pas notre point fort ^^)
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    le problème vient de l'utilisation d'une sémaphore pour limiter le nombre de threads en fonctionnement, et ainsi espérer avoir une consommation mémoire un peu raisonnable... dès qu'on s'affranchit de cela (ie qu'on refait du truc bourrin à la Parallel.For ), on n'a plus le problème
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Une bonne solution serait de créer une file de threads globale de taille N (n étant le nombre de cpu), et une file de threads pour chaque cpu.

    Puis d'écrire un algo pour s'assurer que les threads soient le plus équitablement dans les piles.
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Question con: Le threadpool intégré à .Net ne prend pas déjà ce genre de problématique en charge?

  9. #9
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Dans dotnet 3.5 ce sont des threads au sens Win32 du terme, le problème étant que le threadpool en soit ne fournit pas de mécanisme de partitionnement.

    Un bout de code la dessus :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
            public static void ParallelForEach<T>(IEnumerable<T> source, Action<T> action)
            {
                // Get the number of processors, initialize the number of remaining
                // threads, and set the starting point for the iteration.
                int numProcs = Environment.ProcessorCount;
                int remainingWorkItems = numProcs;
                int nextIteration = 0;
                int exclusiveUpperBound = source.Count();
                const int batchSize = 3;
                using (ManualResetEvent mre = new ManualResetEvent(false))
                {
                    // Create each of the work items.
                    for (int p = 0; p < numProcs; p++)
                    {
                        ThreadPool.QueueUserWorkItem(delegate
                        {
                            int index;
                            while ((index = Interlocked.Add(ref nextIteration, batchSize) - batchSize) < exclusiveUpperBound)
                            {
                                // In a real implementation, we’d need to handle
                                // overflow on this arithmetic.
                                int end = index + batchSize;
                                if (end > 0)
                                {
                                    if (end >= exclusiveUpperBound)
                                    {
                                        end = exclusiveUpperBound;
                                    }
                                    for (int i = index; i < end; i++)
                                    {
                                        action(source.ElementAt(i));
                                    }
                                }
                            }
                            if (Interlocked.Decrement(ref remainingWorkItems) == 0)
                                mre.Set();
                        });
                    }
                    // Wait for all threads to complete
                    mre.WaitOne();
                }
                // return
            }
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Il y a un exemple de partitionnement CPU dans les samples de la TPL:

    http://blogs.msdn.com/pfxteam/archiv...9/9934811.aspx

  11. #11
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par zoubidaman Voir le message
    Question con: Le threadpool intégré à .Net ne prend pas déjà ce genre de problématique en charge?
    ben non... c'était moins bon que ma première version avec semaphore pour limiter le nombre de threads
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par zoubidaman Voir le message
    Il y a un exemple de partitionnement CPU dans les samples de la TPL:

    http://blogs.msdn.com/pfxteam/archiv...9/9934811.aspx
    ça revient à utiliser Parallel... comme dit plus haut
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/10/2008, 01h23
  2. Text SWT.MULTI dans une table
    Par soft-war dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 29/04/2008, 15h41
  3. Réponses: 4
    Dernier message: 21/04/2008, 09h50
  4. [Dua Core et Vista] Affecter 2 coeurs à une application
    Par |DUCATI| DesMo dans le forum Windows Vista
    Réponses: 3
    Dernier message: 31/07/2007, 14h25
  5. Multi coeur et PBOs
    Par NiamorH dans le forum OpenGL
    Réponses: 11
    Dernier message: 23/04/2007, 16h59

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