Un exemple d'utilisation de Grand Central Dispatch "pour les nuls"
Bonjour,
Je suis un developper d'utilitaires C++ sous Xcode. Les applications que je développent sont principalement dédiées à du traitement numérique intensif (number crunching, pas d'interface utilisateur) et j'aimerais les paralleliser en utilisant Grand Central Dispatch. J'ai un bon niveau en C++ sans connaitre les API pour les interfaces utilisateurs.
Je cherche un tutoriel qui explique pas à pas comment utiliser le multi threading avec Grand Central Dispatch. Mes questions sont basiques:
1 - Quelle version de XCODE faut il utiiser ?
2 - Quelles sont les librairies à inclure an début du projet et ou ?
3 - Y-a-t-il des options de compilation à prendre en compte ou à spécifier ?
Serait-il possible d'avoir un exemple de programme simple et complet (en incluant les librairies GCD) utilisant GCD ?
Par exemple à quoi devrait ressembler un programme en GCD qui calculerait en parallèle toutes les valeurs de Cos (X) * Sin (Y) pour X et Y variant entre -1 et 1 (avec un pas de 0,1) ?
Il s'agit d'une question très simple d'exemple de mise en oeuvre "pas à pas", du style "ma première application GCD".
Merci pour votre réponse !
Emmanuel.
Je suis un developper d'utilitaires C++ sous Xcode. Les applications que je développent sont principalement dédiées à du traitement numérique intensif (number crunching, pas d'interface utilisateur) et j'aimerais les paralleliser en utilisant Grand Central Dispatch. J'ai un bon niveau en C++ sans connaitre les API pour les interfaces utilisateurs.
Je cherche un tutoriel qui explique pas à pas comment utiliser le multi threading avec Grand Central Dispatch. Mes questions sont basiques:
1 - Quelle version de XCODE faut il utiiser ?
2 - Quelles sont les librairies à inclure an début du projet et ou ?
3 - Y-a-t-il des options de compilation à prendre en compte ou à spécifier ?
Serait-il possible d'avoir un exemple de programme simple et complet (en incluant les librairies GCD) utilisant GCD ?
Par exemple à quoi devrait ressembler un programme en GCD qui calculerait en parallèle toutes les valeurs de Cos (X) * Sin (Y) pour X et Y variant entre -1 et 1 (avec un pas de 0,1) ?
Il s'agit d'une question très simple d'exemple de mise en oeuvre "pas à pas", du style "ma première application GCD".
Merci pour votre réponse !
Emmanuel.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce tutoriel de pommedev peut peut-être déjà t'aider à commencer ?
Certes il n'y a pas beaucoup d'exemples dedans, mais c'est un début pour dégrossir le sujet.
[EDIT] J'ai jamais fait mumuse avec GCD, mais comme ça au feeling (attention code non testé) je ferais un truc comme ça : Et si je dis pas de conneries d'après la page man tu peux ensuite directement utiliser "results" : le code à l'intérieur du bloc dans dispatch_apply est parallélisé, mais à la fin du dispatch_apply toutes les itérations sont forcément finies donc pas de risque
Voilà voilà ... Bon courage !
En fait l'utilisation de GCD semble très simple:
Installer XCODE 3.2
Inclure les librairies indiquées ("dispatch/dispatch.h")
Et faire comme c'est écrit.
Nouveau challenge et question complémentaire:
Je cherche à créer des variables locales dans un block. Les variables locales sont de type int ou object (c++), types déclarés avant le bloc.
Lorsque les variables sont déclarées dans le bloc, le compilateur retourne l'erreur suivante:
"error: 'int genome_population::month' is not a static member of 'class genome_population'"
Pourquoi xcode n'accepte pas la création de variable dans le block ?
Voici pour info un bout du code:
La fonction dans laquelle le parallelisme est utilisé est membre de la classe "Genome Population", classe définie avant dans le programme.
int genome_population::compute_all_fitnesses (security_universe *market, int month_1, int month_2)
{
int
month,
n;
dispatch_queue_t
queue;
if ((month_1 <0)||(month_2 > experiment_configuration->number_months_history)||(month_2 < month_1))
{
printf("genome_population::compute_all_fitnesses error: month_1 %i or month_2 %i out of range\n", month_1, month_2);
return (-1);
}
maximum_fitness = -1/ALMOST_ZERO;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(size_of_population, queue, ^(size_t n)
{
int month;
etc...
Parce que tu as sans doute fait une erreur quelque part, heureusement qu'il est possible de créer des variables locales à un block, sinon on ne pourrait pas aller bien loin...
Accessoirement, XCode n'y est pour rien, c'est le compilateur, donc GCC ou LLVM, qui produit ces erreurs. D'ailleurs, si tu utilises GCC, je te conseille de passer à LLVM qui produit des messages d'erreurs bien plus intelligibles et précis que GCC
Sinon, voici des liens vers des "tutoriels" très complets sur les blocks et GCD (en Anglais):
http://www.mikeash.com/pyblog/friday-qa-2008-12-26.html
http://www.mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html
http://www.mikeash.com/pyblog/friday-qa-2009-09-04-intro-to-grand-central-dispatch-part-ii-multi-core-performance.html
http://www.mikeash.com/pyblog/friday-qa-2009-09-11-intro-to-grand-central-dispatch-part-iii-dispatch-sources.html
http://www.mikeash.com/pyblog/friday-qa-2009-09-18-intro-to-grand-central-dispatch-part-iv-odds-and-ends.html
http://www.mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html
Bon courage et surtout n'hésite pas à a faire un retour sur notre article GCD.