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

MFC Discussion :

swapping entre processeurs


Sujet :

MFC

  1. #1
    Membre régulier

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 105
    Points
    105
    Par défaut [resolu] swapping entre processeurs
    Bonjour.
    (je sais pas si ce message a sa place ici, mais vu que je développe en VC++6 ça m'a paru approprié).

    Voilà, je développe une appli multithreadée (tri de documents). J'ai sous la main un quadri proc, et lorsque je lance mon appli, je note bien que tous les proc travaillent à 100%. Vers la fin des calculs, il n'y en a plus que 3 puis 2 puis 1 qui travaillent. J'assiste alors à un phénomène de swap entre processeurs, c'est à dire que si par exemple j'ai un proc qui travaille, je vois sur le gestionnaire de taches dans l'historique d'utilisation des UC que la charge de travail passe rétgulièrement d'un proc sur un auter.
    De ce fait je perds à chaque fois tout le cache , ce qui est gènant en termes de performances.
    Existe-t-il une fonction qui permet de "bloquer" une tâche sur un processeur donné, ou bien cela vient-il de l'architecture de la machine?

  2. #2
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Points : 83
    Points
    83
    Par défaut
    Salut,
    Regarde l'URL :

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/prothred_017v.asp

    Les fonctions SetThreadAffinityMask et SetThreadIdealProcessor
    répondent peut-être à ta question ?

  3. #3
    Membre régulier

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 105
    Points
    105
    Par défaut
    Merci beaucoup vraiment.
    Mais (car il y a souvent - toujours? - un mais), ma version de windows ne supporte pas la fonction SetThreadIdealProcessor et je ne me dépatouille pas de la fonction SetThreadAffinityMask, notamment en ce qui concerne ce fameux masque d'affinité.
    Je déclare mes threads 1 à 1 dans un tableau ComputeThread dans une boucle sur i. Après le lancement, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetThreadAffinityMask(ComputeThread[i],XXX);
    J'ai essayé i comme argument de masque, qui me semblait le plus approprié, cependant soit je n'arrive à rien arranger (j'ai toujours le swapping) soit tous les threads sont exécutés sur le même processeur, ce qui est bien mais pas top.

  4. #4
    Membre régulier

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 105
    Points
    105
    Par défaut
    MAIS (cette fois c'est sûr il y en a toujours) je suis un peu plouc cet aprèm.
    En mettant i+1 comme argument cela fonctionne a priori bien.
    Voici le code pour ceux que ça intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for ( i = 0 ; i < nb_threads  ; i++){
     
    	if (   (ComputeThread[i] = CreateThread(NULL,0,genbaseParal,&Arguments[i],0,NULL)   )== NULL ) {
    		MessageBox(NULL,"\n Erreur a la creation des threads\n", "Erreur", MB_ICONSTOP);
    		Au_revoir(false);
    	}
     
    	SetThreadAffinityMask(ComputeThread[i],i+1);
    }
    Merci pour l'aide

  5. #5
    Membre régulier

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 105
    Points
    105
    Par défaut
    mais... (encore un!!)
    je m'aperçois que le dernier processeur n'est pas utilisé. En fait lorsque mon masque (second argument) vaut 1, le processeur 1 travaille, 2 -> processeur 2, 3->processeur3 et 4-> processeur 3.
    Là je planche...

  6. #6
    Membre régulier

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 105
    Points
    105
    Par défaut
    Décidemment, je crois que je suis quasi le suel à être intéressé par ce thread sur le threads.

    Bon, en conclusion : la fonction SetThreadAffinityMask fonctionne très bien (le premier argument est le handle sur le thread, le second un masque binaire autorisant les processeurs, par exemple 1010 autorise le 4è et le 2nd processeur).

    Après quelques benchs sur un calcul de référence, j'obtiens, sur une machine avec 4 processeurs, les temps d'exécution suivants :

    Nb threads | avec masque | sans masque
    1 | 329 | 345
    2 | 174 | 178
    3 | 112 | 122
    4 | 98 | 104
    5 | 99 | 113


    Pourtant quand on voit les graphes d'occupation des processeurs, c'est pire qu'une publicité pour une lessive (avant c'est le bordel monstre, ça arrête pas de swapper, après c'est nickel, les proc concernés sont les seuls sollicités).

    Conclusion : il vaut mieux laisser l'OS gérer lui-même ses ressources...
    (ce qui en soi n'est pas étonnant quelque part windows n'est pas si mal fait que ça)

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

Discussions similaires

  1. partager la swap entre 2 volumes groups
    Par ch4204 dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 13/09/2010, 17h13
  2. [PC portable] Différence de performance entre processeur 2 Ghz et 2,5 GHz
    Par debdev dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 02/11/2009, 12h41
  3. Différences entre processeurs
    Par Jerry Raoul dans le forum Composants
    Réponses: 3
    Dernier message: 04/08/2007, 14h06
  4. Différence entre processeurs
    Par Oberown dans le forum Composants
    Réponses: 5
    Dernier message: 30/01/2006, 10h29
  5. Swap entre deux colonnes pour 2 enregistrements
    Par Erakis dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 15/12/2005, 19h09

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