Programmation pour processeurs multi core
Autant que je sache, les architectures multi-core du processeur n'a pas d'effet sur le programme. L'instruction elle-même l'exécution est gérée dans une couche inférieure.
ma question est,
Étant donné que vous avez un multicœur de l'environnement, puis-je utiliser toutes les pratiques de programmation à utiliser les ressources disponibles de manière plus efficace? Comment dois-je modifier mon code pour obtenir plus de performance dans les environnements multiprocesseurs?
source d'informationauteur Chathuranga Chandrasekara
Vous devez vous connecter pour publier un commentaire.
Qui est correct. Votre programme ne sera pas exécuté plus rapidement (à l'exception du fait que le cœur de métier est la gestion de moins de d'autres processus, parce que certains processus sont en cours d'exécution sur la base), sauf si vous employez de la simultanéité. Si vous utilisez la concurrence, même si, plus de cœurs améliore le réel parallélisme (avec moins de cœurs, la simultanéité est entrelacé, alors qu'avec plus de cœurs, vous pouvez obtenir de vrai parallélisme entre les threads).
Faire efficacement les programmes simultanés est pas une tâche simple. Si fait mal, ce qui rend votre programme simultanées peut effectivement le faire plus lentement! Par exemple, si vous passez beaucoup de temps de frai threads (thread construction est vraiment lent), et faire des travaux sur un très petit morceau de la taille (de sorte que la surcharge de fil de la construction domine le travail réel), ou si vous avez souvent synchroniser vos données (non seulement les forces de l'exécution des opérations en série, mais il a également un très haut dans le ciel au-dessus), ou s'il vous arrive souvent d'écrire des données dans la même ligne de cache entre plusieurs threads (qui peut conduire à l'ensemble de la ligne de cache soit invalidé sur l'un des noyaux), alors vous peuvent sérieusement nuire à la performance avec la programmation simultanée.
Il est également important de noter que si vous avez des N noyaux, cela NE signifie PAS que vous obtiendrez une accélération de N. Qui est la limite théorique à l'accélération. En fait, peut-être avec deux cœurs, il est deux fois plus rapide, mais avec quatre cœurs il peut être environ trois fois plus vite, et puis avec huit cœurs il est environ trois fois et demie plus rapide, etc. Comment votre programme est en fait capable de prendre avantage de ces noyaux est appelé le parallèle de l'évolutivité. Souvent, la communication et la synchronisation de frais généraux empêcher une accélération linéaire, bien que, dans l'idéal, si vous pouvez éviter de communication et de synchronisation autant que possible, vous pouvez espérer obtenir presque linéaire.
Il ne serait pas possible de donner une réponse complète sur la façon d'écrire parallèle efficace des programmes sur StackOverflow. C'est vraiment l'objet d'au moins un (probablement plusieurs) des cours d'informatique. Je suggère que vous vous inscrivez à un cours ou d'acheter un livre. Je vous recommande un livre à vous si je connaissais une bonne, mais le parallèle des algorithmes de cours que j'ai pris n'ont pas de manuels pour le cours. Vous pourriez également être intéressé par l'écriture d'une poignée de programmes à l'aide d'une série de mise en œuvre, en parallèle de la mise en œuvre avec le multithreading (régulier des threads, des pools de threads, etc.), et en parallèle à la mise en œuvre avec la transmission de message (comme avec Hadoop, Apache Spark, Nuage de flux de données, asynchrone Rpc, etc.), et puis de mesurer leurs performances, en variant le nombre de cœurs dans le cas de la mise en parallèle des implémentations. C'était l'essentiel du cours pour mes algorithmes parallèles de cours et peut être tout à fait lucide. Certains calculs, tu pourrais essayer de parallélisation d'inclure le calcul de Pi en utilisant la méthode de Monte Carlo (ce qui est trivialement parallélisables, en supposant que vous pouvez créer un générateur de nombre aléatoire où les nombres aléatoires générés dans différents threads sont indépendants), d'effectuer la multiplication de matrice, le calcul de la ligne d'échelon forme d'une matrice, en additionnant le carré de la numéro 1...N, pour certains très grand nombre de N, et je suis sûr que vous pouvez penser à d'autres.
Oui, il suffit d'ajouter plus de cœurs pour un système sans modifier le logiciel vous céder aucun résultat (à l'exception du système d'exploitation serait en mesure de programmer plusieurs processus simultanés sur des cœurs).
Pour votre système d'exploitation à utiliser vos cœurs multiples, vous devez faire une de deux choses: augmenter le nombre de threads par processus, ou d'augmenter le nombre de processus en cours d'exécution dans le même temps (ou les deux!).
Utilisant les cœurs de manière efficace, cependant, est une bête de couleur différente. Si vous passez trop de temps de la synchronisation de l'accès aux données partagées entre les threads et les processus, de votre niveau de simultanéité va en prendre un coup car les fils d'attendre les uns des autres. Cela suppose également que vous avez un problème ou de calcul qui peuvent assez facilement être parallélisé, depuis la version parallèle de l'algorithme est souvent beaucoup plus complexe que la version séquentielle de celle-ci.
Cela dit, en particulier pour les CPU des calculs avec des unités de travail qui sont indépendants les uns des autres, vous aurez plus de chances de voir un linéaire de la vitesse-jusqu'au moment où vous passez plus de threads au problème. À mesure que vous ajoutez de série de segments et de la synchronisation des blocs, ce speed-up aura tendance à diminuer.
I/O lourds calculs généralement tarif le pire dans un environnement multi-thread, puisque l'accès au stockage physique (surtout si c'est sur le même contrôleur, ou le même support) est également de série, auquel cas le filetage devient de plus en plus utile dans le sens qu'il libère les autres threads pour continuer avec l'interaction de l'utilisateur ou de l'UC.
Je ne sais pas si c'est le meilleur endroit possible pour commencer, mais je suis abonné à l'article flux de Intel De Réseau De Logiciel il y a quelques temps et nous avons trouvé beaucoup de chose intéressante, présentées de manière assez simple. Vous pouvez trouver des articles de base sur les concepts fondamentaux du calcul parallèle, comme cette. Ici vous avez une petite plongée dans openMP qui est une approche possible pour démarrer la parallélisation de la plus lente des parties de votre application, sans changer le reste. (Si ces pièces de parallélisme, bien sûr.) Vérifiez également Intel Guide pour le Développement d'Applications Multithread. Ou tout simplement aller naviguer la section d'articleles articles ne sont pas trop de nombreux, de sorte que vous pouvez rapidement comprendre ce qui vous convient le mieux. Ils ont aussi un forum et un hebdomadaire webcast appelé la Programmation Parallèle Parler.
Vous pouvez envisager d'utiliser des langages de programmation conçu pour la programmation simultanée. Erlang d'Aller et venir à l'esprit.