Pour utiliser tous les cœurs d'un processeur quad core, que dois-je changer dans mon code, est-il d'ajouter le support de multi threading ou est-ce que cela est pris en charge par OS? J'ai FreeBSD et le langage que j'utilise est C++. Je veux donner des cycles de processeur complets à mon application au moins 90%.comment utiliser le CPU quad core dans l'application
Répondre
Pour les applications multithread en C++, je suggère Boost.Thread qui devrait vous aider à accéder au plein potentiel de votre machine quad-core. En ce qui concerne le changement de code, vous pouvez envisager de rendre les choses aussi immuables que possible. Les transitions d'état entre les threads sont beaucoup plus difficiles à déboguer. Il y a une pléthore de choses qui pourraient potentiellement arriver de façon inattendue. Voir this SO thread.
Je pense que votre seule option est d'exécuter plusieurs threads. Si votre application est mono-thread, alors elle ne fonctionnera que sur l'un des cœurs (à la fois), mais si vous avez plus de threads, ils peuvent s'exécuter simultanément.
Une autre option est, comme mentionné, exécuter plusieurs copies du même programme. Selon la nature du problème, cela peut ou peut ne pas être facile (voir http://en.wikipedia.org/wiki/Embarrassingly_parallel). – KeithB
Vous devez ajouter du support à votre application pour le parallélisme grâce à l'utilisation de Threading. Une fois que vous avez le support du parallélisme, c'est au système d'exploitation d'assigner vos threads aux cœurs du processeur.
Une autre option non mentionnée ici, à côté, est l'utilisation d'OpenMP disponible via la bibliothèque -fopenmp
et la bibliothèque libgomp
, que j'ai installées sur mon système FreeBSD 8.
Ceci vous donne #pragma
directives pour paralléliser certaines boucles, tandis que les instructions, etc., sont les bits que vous pouvez paralléliser. Il s'occupe du threading et de l'association de CPU pour vous. Notez qu'il s'agit d'une solution générale et que, par conséquent, ce n'est peut-être pas la meilleure façon de paralléliser, mais cela vous permettra de paralléliser certaines routines.
Jetez un oeil à ceci: https://computing.llnl.gov/tutorials/openMP/
En ce qui concerne l'utilisation de threads/processus eux-mêmes, certaines routines et méthodes de travail s'y prêtent. Pouvez-vous répartir les tâches de cette manière? Est-ce que cela a du sens de fourrer() votre processus ou de créer un fil de discussion? Si c'est le cas, faites-le, mais si ce n'est pas le cas, n'essayez pas de forcer votre application à être multi-thread juste parce que. Un exemple que je donne habituellement est le plus grand algorithme diviseur commun - il repose sur l'étape avant tout le temps dans la mise en œuvre traditionnelle est donc difficile à faire parallèle. Notez également qu'il est bien connu que pour certains algorithmes, la parallélisation est réellement plus lente pour les petites valeurs de ce que vous faites en parallèle, car même si les tâches se terminent plus rapidement, le coût en temps associé du forking et de la jointure ou processus) pousse réellement le temps au-dessus de celui d'une implémentation en série.
Vous avez need une certaine forme de parallélisme. Multi-threading ou multi-traitement serait bien.
Habituellement, plusieurs fils sont plus facile à manipuler (car ils peuvent accéder aux données partagées) que plusieurs processus. Cependant, en général, plusieurs threads sont plus difficile pour gérer (car ils accèdent aux données partagées) que plusieurs processus. Et, oui, j'ai écrit cela délibérément.
Si vous avez un scénario SIMD, Ninefingers' suggestion pour regarder OpenMP est également très bon. (Si vous ne savez pas ce que SIMD signifie, voir le commentaire utile de Ninefingers ci-dessous.)
L'auto-contradiction était-elle délibérée? Je suis d'accord, il y a des avantages/désavantages à fork() et à threading. –
Je le pensais. +1 –
+1 pour l'auto-contradiction :-) – Sebastian
La première chose que je pense que vous devriez regarder est si votre application et ses algorithmes sont adaptés pour être exécutés en parallèle (ou éventuellement un ensemble de tâches en série pouvant être traitées indépendamment). Si ce n'est pas le cas, il sera difficile de le multithreader ou de le décomposer en processus parallèles, et vous devrez peut-être modifier la façon dont cela fonctionne. Une fois que vous avez établi que vous pourrez bénéficier du traitement parallèle, vous avez la possibilité d'utiliser plusieurs processus ou threads. Le choix dépend beaucoup de la nature de votre application et de l'indépendance des processus parallèles. Il est plus facile de coordonner et de partager les données entre les threads car ils sont dans le même processus, mais aussi un peu plus difficile à développer et à déboguer. Boost.Thread est une bonne bibliothèque si vous décidez de descendre la route multithread.
Je veux donner des cycles CPU complets à mon application au moins 90%.
Pourquoi? Votre puce n'est pas assez chaude?
Sérieusement, il faut des experts du monde des dizaines, voire des centaines d'heures à paralléliser et charge l'équilibre une application afin qu'elle utilise 90% des quatre noyaux. Votre CPU est déjà payée pour et son prix est le même que vous l'utilisiez ou non. (En fait, cela coûte un peu moins cher de fonctionner électriquement si vous ne l'utilisez pas.) Combien vaut votre temps? Combien d'heures êtes-vous prêt à investir pour utiliser plus efficacement une ressource qui peut vous avoir coûté 300 $ et qui est probablement inutilisée la plupart du temps?
Il est possible d'obtenir des accélérations par le biais du parallélisme, mais c'est cher en temps humain. Vous avez besoin d'une bonne raison pour le justifier. (Apprendre comment est une bonne raison.)
Tous les bons livres que je connais sur la programmation parallèle sont pour d'autres langages que le C++, et pour cause. Si vous voulez des choses intéressantes sur le parallélisme consultez Programmin parallèle implicite dans pH ou Programmation concurrente dans ML ou Fortress Project.
Personne lisant cette réponse ne sera surpris par ma réponse à "Comment profitez-vous de multicore" http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-) –
Soyez averti. Threading est un casse-tête et l'ajout du support de threads à une application existante est encore pire. – Yacoby
Souvent, la façon la plus simple d'utiliser un processeur 4-core est d'exécuter 4 copies de votre programme. Si cela n'est pas trivial en raison de vos infrastructures de données, il est probable que toutes les solutions de thread proposées seront également difficiles. – MSalters
Vous pouvez utiliser une simultanéité d'acteurs sans état partagé (programmeur-visible) pour éliminer la plupart des maux de tête liés à la programmation multithread, mais cela ne fonctionne que si votre architecture peut être modélisée de cette façon. –