GCD ou NSOperation ?

Bonjour à  tous,


 


Je cherche à  paralléliser une routine de calcul particulièrement gourmande (plusieurs milliers d'itérations sur une matrice de 1.000.000 de données).


 


Pour faire simple, mes données sont sous forme d'une matrice à  3 dimensions que je pourrais découper en tranche.


 


A priori, je pensais créer 9 threads, les lancer, attendre les résultats, réconcilier les cellules communes (surfaces mitoyennes des tranches) et relancer les threads pour une nouvelle itération.


 


En cherchant de la doc sur le multithreading, je suis tombé sur GCD.


 


Comme j'ai beaucoup à  lire sur le sujet, j'aimerais vos conseils. Pour ce genre de problèmes, partiriez-vous sur des NSOpérations ou du GCD ?


 


Quelques éléments :


- actuellement, mes matrices sont ansi-c like (matrice[1][2][3]). Il est envisageable de passer les données des surfaces mitoyennes dans un NSArray de NSArray depuis le main thread et les threads secondaires (et inversément)


- l'attente de la fin de tous les threads est nécessaire pour réconcilier les données.


 


D'avance merci,


 


Sethy


Réponses

  • GCD semble suffisant ; il y a des fonctions de synchronisation élémentaires et c'est plus simple à  mettre en oeuvre et plus efficace que NSOperation.


     


    Vu la quantité de calculs à  réaliser, garder des matrices C permettra de meilleures performances que de convertir tout ça en NSArray. 


  • SethySethy Membre

    Ouki, merci pour le conseil.


     


    Maintenant, yapuka ^(^)


  • FKDEVFKDEV Membre
    Ton histoire de matrices, de threads et de zones communes me fait penser à  la session WWDC sur openCL.


    Tu devrais peut-etre jeter un coup d'oeil à  cette session.
  • SethySethy Membre

    Merci pour le tuyau !


  • FKDEVFKDEV Membre

    Merci pour le tuyau !

    C'est la 508.
  • SethySethy Membre

    Merci, je viens de la télécharger.


  • yoannyoann Membre

    Effectivement, si c'est essentiellement du traitement mathématique, go OpenCL, ce sera beaucoup plus performant.


     


    Sinon, GCD est effectivement plus light à  mettre en oe“uvre mais un peu plus complexe à  appréhender.


  • MalaMala Membre, Modérateur

    Je te conseillerais de te limiter au multi-thread dans un premier temps. Les gains d'OpenCL sont à  prendre avec des pincettes. D'une part, les résultats varient énormément en fonction des calculs à  effectuer et d'autre part le support d'OpenCL au niveau Hardware est très relatif chez Apple (beaucoup de machines n'ont de support OpenCL que la version processeur du fait de cartes graphiques non compatibles).


  • Pour que je ne meure pas idiot, lien sur GCD?  merci.


    NSOperation, j'utilise donc pas de problème.


  • AliGatorAliGator Membre, Modérateur
  • jpimbertjpimbert Membre
    juin 2013 modifié #12

    Les Guides sont un excellent point d'entrée dans la Doc Apple.

    Je recommande lorsqu'on aborde un sujet de lire complètement le guide correspondant ; on a une bonne vue globale et il y a les références vers les documentations détaillées si nécessaire.

     

    Pour GCD il faut lire le Concurrency Programming Guide, en particulier le chapitre "Dispatch Queues".


  • Ok, merci. ça me revient, il me semble que l'homme au grand chapeau a fait un article la dessus il y a longtemps.




  • Je te conseillerais de te limiter au multi-thread dans un premier temps. Les gains d'OpenCL sont à  prendre avec des pincettes. D'une part, les résultats varient énormément en fonction des calculs à  effectuer et d'autre part le support d'OpenCL au niveau Hardware est très relatif chez Apple (beaucoup de machines n'ont de support OpenCL que la version processeur du fait de cartes graphiques non compatibles).




     


    Merci pour le conseil. Les simulations que je fais sont à  usage purement personnel.


     


    Parmi les exemples d'Apple, l'un d'entre eux est particulièrement adapté à  mon besoin car il mêle OpenCL et OpenGL. 


     


    Je l'ai compilé et tout me laisse penser que ma carte est compatible, car la performance est au rendez-vous.


     


    La question que je n'ai pas encore pu tranchée est plutôt si OpenCL est adapté à  mon besoin. Je compte sur la vidéo pour m'éclairer.

  • @AliGator


    J'ai vu l'enregistrement CocoaHeads rennes #1. Intéressant. 


    Si la première partie sur les blocs est convaincante, sur GCD, je trouve l'enregistrement moins "fort". Plutôt comme un simple catalogue de possibilité.


    D'autre part, quelles conditions obligent à  envisager l'utilisation de GCD? Ou peut être que sous IOS son usage est courant. D'autre part, comment choisir entre GCD et NSOperationQueu ?


  • AliGatorAliGator Membre, Modérateur
    Aucune condition n'oblige à  encisager l'utilisation de GCD. Tu l'utilises ou tu ne l'utilises pas, c'est au choix.
    Mais le gros avantage que GCD a, c'est qu'il fonctionne avec des "Queue" qui sont gérées par le système. C'est le système qui dispatche les opérations (les blocks de code) sur les queue et donne la main aux queues GCD en fonction des ressources disponibles, etc, et tu n'as pas à  te soucier d'éventuelles pertes de charges ou de prise en compte de l'environnement extérieur pour optimiser ou quoi. Et du coup il est aussi plus performant, et s'occupe de plus de choses.

    NSOperationQueue est un peu plus haut niveau, après il me semble que depuis les dernières versions d'OSX et de iOS il est basé sous le capot sur GCD.

    Après pour + de détails, rien ne vaut la bonne vieille doc Apple qui comme d'habitude donne tous les détails là  dessus, en particulier le Concurrency Programming Guide qui explique les différentes techniques de multithreading et de gestion de tâches concurrentes disponibles dans Cocoa, leurs avantages et inconvénients, et les différences de concepts et de fonctionnement entre chaque techno.
  • AliGatorAliGator Membre, Modérateur
    La session 228 de la WWDC 2013 (dans laquelle Matt Thompson fait une démo ;)), confirme que NSOperation se base sur GCD maintenant.
  • J'en suis encore à  déterminer si OpenCL est bien la solution pour mon besoin spécifique, mais une chose est certaine : pour d'autres utilisations, c'est juste énhaurme.


Connectez-vous ou Inscrivez-vous pour répondre.