Question

Pour autant que je sache, l'architecture multi-core dans un processeur n'a pas d'effet du programme. L'exécution de l'instruction réelle est traitée dans une couche inférieure.

ma question est,

Étant donné que vous avez un environnement multi-cœurs, Puis-je utiliser des pratiques de programmation pour utiliser plus efficacement les ressources disponibles? Comment dois-je changer mon code pour gagner plus de performance dans des environnements multi-cœurs?

Était-ce utile?

La solution

C'est exact. Votre programme ne fonctionnera plus vite (à l'exception du fait que le noyau gère moins d'autres processus, parce que certains des processus sont exécutés sur l'autre noyau) à moins que vous employez la concurrence. Si vous utilisez concurrency, bien que, plus le parallélisme des noyaux améliore réel (avec moins de cœurs, la concurrence est entrelacée, alors qu'avec plus de cœurs, vous pouvez obtenir vrai parallélisme entre les threads).

Faire des programmes de manière efficace simultanée est pas une tâche simple. Si fait mal, ce qui rend votre concurrent de programme peut effectivement rendre plus lent! Par exemple, si vous passez beaucoup de fils de frai de temps (la construction de fil est très lent), et travaillez sur une taille de bloc très faible (de sorte que les frais généraux de construction de fil domine le travail réel), ou si vous synchronisez fréquemment vos données ( qui oblige non seulement les opérations à exécuter en série, mais a aussi un surcoût très élevé au-dessus de celui-ci), ou si vous écrivez souvent à des données dans la même ligne de cache entre plusieurs threads (qui peut conduire à toute la ligne de cache étant invalidée sur un des noyaux), alors vous pouvez sérieusement nuire à la performance avec la programmation concurrente.

Il est également important de noter que si vous avez des noyaux N, cela ne signifie pas que vous obtiendrez un gain de vitesse de N. C'est la limite théorique à l'accélération. En fait, peut-être avec deux noyaux, il est deux fois plus rapide, mais avec quatre cœurs, il pourrait être environ trois fois plus vite, puis avec huit cœurs, il est environ trois fois et demie plus rapide, etc. Comment bien votre programme est en fait en mesure de tirer parti de ces noyaux est appelée l'évolutivité parallèle. Souvent, la communication et la synchronisation empêchent en tête un linéaire speedup, bien que, dans l'idéal, si vous pouvez éviter la communication et la synchronisation, autant que possible, vous pouvez nous l'espérons se rapprocher de linéaire.

Il ne serait pas possible de donner une réponse complète sur la façon d'écrire des programmes parallèles efficaces sur StackOverflow. C'est vraiment l'objet d'au moins un (probablement plusieurs) cours de sciences informatiques. Je vous suggère de vous inscrire à un cours ou d'acheter un livre. Je vous recommande un livre pour vous si je connaissais un bon, mais au cours des algorithmes de Paralell je n'ai pas un manuel pour le cours. Vous pourriez également être intéressé par écrit une poignée de programmes à l'aide d'une mise en œuvre en série, une mise en œuvre parallèle avec multithreading (threads réguliers, pools de threads, etc.), et une mise en œuvre parallèle avec le passage de messages (comme avec Hadoop, Spark Apache, flux de données en nuage , RPC asynchrone, etc.), puis en mesurant leur rendement, en faisant varier le nombre de noyaux dans le cas des mises en oeuvre en parallèle. Ce fut la plus grande partie du cours travail pour mon cours d'algorithmes parallèles et peut être très perspicace. Certains calculs que vous pourriez essayer parallélisation inclure le calcul de Pi en utilisant la méthode de Monte Carlo (ce qui est trivialement parallélisable, en supposant que peut créer un générateur de nombres aléatoires, où les nombres aléatoires générés dans différents fils sont indépendants), effectuer une multiplication de matrice, le calcul de la forme échelonnée de rangée de une matrice, résumant la place du numéro 1 ... N pour un très grand nombre de N, et je suis sûr que vous pouvez penser à d'autres.

Autres conseils

Je ne sais pas si c'est le meilleur endroit pour commencer, mais je me suis inscrit à l'alimentation de l'article Intel Software Network il y a quelque temps et nous avons trouvé beaucoup de choses intéressantes là-bas, présenté de manière assez simple. Vous pouvez trouver des articles très simples sur les concepts fondamentaux de l'informatique parallèle, comme cette . vous une plongée rapide dans openMP que est une approche possible pour commencer parallélisation les plus lents parties de votre application, sans changer le reste. (Si les parties présentes parallélisme, bien sûr.) Vérifiez également Guide Intel pour développer des applications multithread . Ou tout simplement aller voir la section de l'article , les articles ne sont pas aussi beaucoup, afin que vous puissiez comprendre rapidement ce qui vous convient le mieux. Ils ont aussi un forum et un hebdomadaire webdiffusion parallèle appelé Discuter de programmation.

Oui, ajoutant simplement plus de cœurs à un système sans altérer le logiciel ne vous donne aucun résultat (à l'exception du système d'exploitation serait en mesure de planifier plusieurs processus simultanés sur noyaux distincts).

Pour que votre système d'exploitation utiliser vos cœurs multiples, vous devez faire une des deux choses: (! Ou les deux). Augmenter le nombre de threads par processus, ou augmenter le nombre de processus en cours d'exécution en même temps

En utilisant les noyaux efficacement, cependant, est une bête d'une couleur différente. Si vous passez trop de temps à synchroniser l'accès aux données partagées entre threads / processus, votre niveau de concurrence prendra un coup en tant que fils attendent les uns des autres. Cela suppose aussi que vous avez un problème / calcul qui peut être relativement facilement parallélisés, puisque la version parallèle d'un algorithme est souvent beaucoup plus complexe que la version séquentielle de celle-ci.

Cela dit, en particulier pour les calculs CPU lié avec les unités de travail qui sont indépendants les uns des autres, vous aurez probablement plus voir une accélération linéaire que vous jetez plus les discussions sur le problème. Lorsque vous ajoutez des segments de série et des blocs de synchronisation, cette accélération aura tendance à diminuer.

E / S calculs pèserais généralement les moins bien placés dans un environnement multi-thread, puisque l'accès au stockage physique (surtout si elle est sur le même contrôleur, ou le même support) est également de série, dans lequel le filetage de cas devient plus utile dans le sens où elle permet de libérer vos autres threads pour continuer les opérations de base CPU interaction de l'utilisateur ou.

Vous pouvez envisager d'utiliser des langages de programmation conçus pour la programmation concurrente. Erlang et Go viennent à l'esprit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top