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

C# Discussion :

multithread pour calcul nombre premier.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut multithread pour calcul nombre premier.
    Bonjour,

    J'ai fais une fonction permettant de savoir si un nombre est premier ou non. Comme je calcul des très grand nombre je voudrais trouver un moyen de calculer plus rapidement.

    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
    static bool isprem(BigInteger a)
            {
                BigInteger b ;
     
                if(a%2==0) return false;
     
                for(b=3;b*b<=a;b=b+2)
                {
     
                    if(a%b==0) return false ;
     
                }
     
                return true ;
            }
    Je voudrais savoir si en utilisant les threads il serait possible d'améliorer les performances de ma fonction, par exemple en fesant traiter la moitié des calculs par un thread et l'autre moitié par un autre ?

    Merci.

    PS : Je n'ai jamais utilisé de thread.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Tout à fait! C'est vraiment un bon chemin à prendre.

    Tu peux même en lancer plus que 2. Il faut faire des tests de performance pour trouver le nombre optimal.

    Pour commencer regarde dans la FAQ, ça va te permettre de bien démarrer.

  3. #3
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour. Si ton but est vraiment la vitesse, alors c'est d'abord l'algorithme qu'il faut changer, par exemple pour ECPP ou AKS si tu as besoin d'un algorithme déterministe.

    Cela étant dit, voici comment on pourrait le paralléliser :
    Code c# : 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
    45
    46
    47
    48
    49
    50
    51
    static volatile bool MayBePrime;
    static readonly object NextDividerLock = new object();
    static BigInteger NextDivider;
    const int NextDividerIncrement = 32;
     
    public static bool IsPrime(BigInteger a)
    {
                if(a%2==0) return false;
     
                NextDivider= 3;
                MayBePrime= true;
                RunPrimalityTestingTasks(a);
                return MayBePrime;
    }
     
    static void RunPrimalityTestingTasks(BigInteger a)
    {
                int cores = Environment.ProcessorCount;
                Task[] tasks = new Task[cores];
                for (int i = 0; i < cores; ++i) tasks[i] = Task.Run(() => PrimalityTestingWorker(a));
                Task.WaitAll(tasks);
    }
     
    static void PrimalityTestingWorker(BigInteger a)
    {
         while(MayBePrime)
         {
               BigInteger start, exclusiveEnd;
               GetDividerRange(out start, out exclusiveEnd);
     
               for (b = start; b < exclusiveEnd; b += 2);
               {
                    if (b * b >= a) return;
                    if (a % b == 0) 
                    {
                          MayBePrime = false;
                          return;
                     }
               }
         }
    }
     
    static void GetDividerRange(out BigInteger start, out BigInteger exclusiveEnd)
    {
          lock(NextDividerLock)
          {
               start = NextDivider;
               end = start + NextDividerIncrement 
               NextDivider = exclusiveEnd;
          }
    }


    Code non-testé.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut
    Merci pour vos réponses, DonQuiche je vais essayer de comprendre ton code et le tester.

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Dans le cas de pur calculs, le nombre optimum de threads correspond au nombre de coeurs (x2 en cas de multi-threading) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int NbThreads = Environment.ProcessorCount ;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut
    Juste pour information, j'ai réécris mon code en utilisant le multithread sur un processeur multicoeur et effectivement la vitesse d'exécution est multipliée par le nombre de threads utilisés.
    Merci pour votre aide et vos informations.

Discussions similaires

  1. Demande outil pour calcul nombre d'occurence
    Par abidamoura dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 20/03/2014, 17h44
  2. Calcul nombre premier
    Par l4r3nZu dans le forum PL/SQL
    Réponses: 7
    Dernier message: 01/06/2011, 13h51
  3. [MASM32] Calcul nombres premiers : l'assemblage ne s'achève pas
    Par Voldemort09 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 25/09/2008, 22h49
  4. Réponses: 9
    Dernier message: 12/10/2006, 00h36
  5. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    Réponses: 12
    Dernier message: 18/09/2004, 14h57

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