Multiprocessing

fouffouf Membre
22:50 modifié dans API AppKit #1
Comment faut-il faire pouroptimiser son appli pour le multi processing ?

Ce n'est pas pour l'integrer dans un programme, mais cela m'intrigue et la pub d'Apple sur ce sujet ne fait qu'empirer les choses. En effet, dans la plupart des bouquins d'info theorique, il est dit qu'il vaut mieux avoir un seul proc de puissance 2x plutot que 2 proc de puissance x (Apple soutient le contraire).

Comment faire, dans quelles situations, cela a t il un interet ?? Aidez-moi, SVP o:) :why?:

Réponses

  • cbrandtcbrandt Membre
    22:50 modifié #2
    pour tirer parti de plusieurs processeurs, il faut déjà  que le traitement soit découpable en deux (ou plus) parties indépendentes.
    ensuite, techniquement, il suffit de créer un ou des threads supplémentaires (avec NSThread) ou de lancer plusieurs tâches (avec NSTask).
    chaque thread/task s'occupe d'une partie du boulot... et s'il y a plusieurs processeurs, ils sont utilisés.
  • nucleusnucleus Membre
    22:50 modifié #3
    Il faut éviter d'avoir des tâches dépendantes les unes des autres, essayer de décomposer en tâche parallélisables au maximum..

    Par exemple tu as une appli de compression de vidéo, au lieu de compresser un par un chaque vidéo du début à  la fin, tu peux compresser plusieurs vidéo en même temps, en découpant chaque vidéo en parties qui seront indépendement compressées puis assemblées..

    Tu peux aussi paralléliser sur des tâches différentes qui se suivent.. par exemple dans une image animée (ex: un jeu 3D), tu n'es pas obligé d'attendre que l'affichage de l'image courante soit terminée (ex: par le processeur de la carte graphique) pour commencer à  calculer les paramètres de l'image suivante (par un processeur central)..

    La grosse problématique du multiprocessing, parrallélisme c'est la synchronisation de toutes les tâches parallèles, le partage de données sur le même travail..

    Le problème pour le mono-procésseurs, c'est que tu plafonnes plus facilement au niveau puissance et que toute la consommation d'énergie se concentre en un seul point..
  • fouffouf Membre
    22:50 modifié #4
    Le problème pour le mono-procésseurs, c'est que tu plafonnes plus facilement au niveau puissance et que toute la consommation d'énergie se concentre en un seul point..


    On ne peut pas essayer de savoir quel est le nombre de processeurs en utilisant une fonction systeme ?
  • Eddy58Eddy58 Membre
    22:50 modifié #5
    Je ne sais pas s'il existe une fonction système, mais avec la commande system_profiler du CLI, tu peux récupérer toutes les infos que tu veux sur une config, dont le nombre de processeurs présents. Donc en lançant cette commande avec NSTask, tu devrais pouvoir récupérer ce que tu veux... 8)
  • fouffouf Membre
    22:50 modifié #6
    Merci beaucoup pour vos reponses.

    Ptet qu'un jour j'essaierais de les utiliser quand j'aurais une applis usine a gaz (les NSTask c'est pas trop mon truc)

    o:)   o:)
  • cbrandtcbrandt Membre
    22:50 modifié #7
    le multiprocessing est très utile dès qu'un traitement long immobilise l'application: on fait effectuer ce traitement dans un thread séparé, de façon à  ne pas bloquer l'interface utilisateur. on peut alors utiliser une barre de progression, un bouton 'annuler', etc...  facilement.
  • maconnectmaconnect Membre
    22:50 modifié #8
    Dans 99.99% des cas, parser une commande shell n'est pas la bonne solution (en général le résultat est "unsafe", la command peut changer de nom et emplacement, comme c'est le cas de system_profiler entre 10.2 et 10.3)

    Voilà  :

    -(int)CPUCount<br />{<br />    int processors, error, selectors[2] = { CTL_HW, HW_NCPU };<br />    size_t datasize = sizeof(processors);<br />    error = sysctl(selectors,2,&amp;processors,&amp;datasize,0,0);<br />	processors = processors&gt;2 ? 2 :processors;<br />    return processors &lt; 1 ? 1 : processors;<br />}
    
  • Eddy58Eddy58 Membre
    22:50 modifié #9
    Il est certain que quand on sait par où passer, inutile d'aller bidouiller avec des commandes shell....dis-donc maconnect peut-on récupérer autre chose que le nombre de CPUs de cette manière ? Si t'as de la doc sur ce sujet, je suis preneur... :)
  • maconnectmaconnect Membre
    février 2005 modifié #10
    bah, j'ai su comment faire en cherchant, tout simplement :) Sinon j'aurai jamais su...

    oui, on peut avoir d'autres infos (taille cache l1,l2 version darwin et plein de trucs.)

    La doc? ben man sysctl et voilà . Mais n'allez pas exécuter sysctl par nstask et parser le résultat de la commande, hein! Désolé, j'ai développé une allérgie aux nstasks.

    Bon, je suis gentil et je te donne un autre exemple, qui lui donne la version de Darwin
    <br />-(NSString*)darwinVersion<br />{<br />	int			i[]={CTL_KERN, KERN_OSTYPE};<br />	int			j[]={CTL_KERN, KERN_OSRELEASE};<br />	char		c[30], cc[10];<br />	size_t		size=30, t=10;<br />	<br />	sysctl(i, 2, c, &amp;size, nil, 0);<br />	sysctl(j, 2, cc, &amp;t, nil, 0);<br />	<br />	return [NSString stringWithFormat:@&quot;%s %s&quot;, c, cc];<br />}
    

    Enjoy :)

    EDIT: avant que quelqu'un le demande, il faut mettre ceci:
    #import <sys/sysctl.h>
    Comme indiqué dans le man
  • Eddy58Eddy58 Membre
    22:50 modifié #11
    Ok merci maconnect je vais regarder ça. :)
Connectez-vous ou Inscrivez-vous pour répondre.