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.
Ouki, merci pour le conseil.
Maintenant, yapuka ^(^)
Tu devrais peut-etre jeter un coup d'oeil à cette session.
Merci pour le tuyau !
Merci, je viens de la télécharger.
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.
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.
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.
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 ?
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.
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.