Est-ce que l'avènement des architectures multicœurs me affectent en tant que développeur de logiciels?

StackOverflow https://stackoverflow.com/questions/567528

  •  05-09-2019
  •  | 
  •  

Question

En tant que développeur de logiciels traitant principalement avec des langages de programmation de haut niveau, je ne suis pas sûr de ce que je peux faire pour payer convenablement attention à la prochaine omni-présence d'ordinateurs multi-cœurs. Je vous écris pour la plupart ordinaires et des applications non exigeant, néanmoins, je pense qu'il est important de savoir si je dois changer les paradigmes de programmation ou même langage pour maîtriser l'avenir.

Ma question donc:
How to deal with increasing multicore presence in day-by-day hacking?

Était-ce utile?

La solution

Herb Sutter a écrit à ce sujet en 2005: Le Free Lunch Is Over: Un virage fondamental vers Logiciel dans Concurrency

Autres conseils

La plupart des problèmes ne nécessitent pas beaucoup de temps CPU. Vraiment, cœurs simples sont tout à fait assez rapide pour beaucoup de buts. Lorsque vous trouvez votre programme est trop lent, premier profil et regarder votre choix d'algorithmes, l'architecture et la mise en cache. Si cela ne suffit pas, essayez vous obtenez de ne pas diviser le problème en place des processus séparés. Souvent, cela vaut la peine pour simplement l'isolement de défaut et que vous pouvez comprendre l'utilisation du processeur et de la mémoire de chaque processus. En outre, normalement chaque processus se déroulera sur un noyau spécifique et faire bon usage des caches du processeur, de sorte que vous n'aurez pas à subir les frais généraux de performance importante de garder les lignes de cache cohérente. Si vous optez pour une conception de processus multiples et toujours trouver problème a besoin de plus de temps CPU que vous obtenez avec la machine que vous avez, vous êtes bien placé pour l'étendre sur un cluster géré.

Il y a des situations où vous avez besoin de plusieurs threads dans le même espace d'adressage, mais méfiez-vous que les fils sont vraiment difficiles à obtenir le droit. Les conditions de course, en particulier dans des langues non sûres, prendre parfois des semaines pour déboguer; souvent, en ajoutant simplement le suivi ou en cours d'exécution dans un débogueur va changer les timings assez pour cacher le problème. signifie partout simplement mettre des verrous souvent vous obtenez beaucoup de verrouillage frais généraux et parfois tellement contention de verrouillage que vous ne recevez pas vraiment l'avantage de vous espériez concurrency pour. Même si vous avez le droit de verrouillage, vous devez alors le profil d'accorder pour la cohérence du cache. En fin de compte, si vous voulez vraiment régler un code très simultané, vous finirez probablement regarder des constructions sans verrouillage et de systèmes de verrouillage plus complexes que ceux des bibliothèques actuelles multi-threading.

Découvrez les avantages de la concurrence, et les limites (par exemple le droit de Amdahl).

Vous pouvez donc, si possible, d'exploiter la seule voie pour une meilleure performance qui va être ouvert. Il y a beaucoup de travail novateur qui se passe sur les approches plus simples (futures et bibliothèques de tâches), et le vieux travail redécouvert (langages fonctionnels et des données immuables).

Le déjeuner libre est terminée, mais cela ne veut pas dire qu'il n'y a rien à exploiter.

En général, deviennent très amicaux avec le filetage. C'est un mécanisme terrible pour parallélisation, mais c'est ce que nous avons.

Si vous travaillez avec .NET, regardez les extensions parallèles. Ils vous permettent de facilement accomplir de nombreuses tâches de programmation parallèle.

Pour bénéficier de plus qu'un seul noyau, vous devriez envisager parallélisation votre code. Plusieurs threads, types immuables, et un minimum de synchronisation sont vos nouveaux amis.

Je pense que cela dépendra de ce type d'applications que vous écrivez.

Une sorte d'applications bénéficient plus du fait qu'ils fonctionnent sur un cpu mutli-core, puis d'autres. Si votre application peut bénéficier du fait multi-core, alors vous devriez être prêt à aller en parallèle. Le déjeuner gratuit est plus; qui est: dans le passé, l'application devient plus rapide quand un nouveau cpu a été libéré et vous ne pas mettre tout effort dans votre application pour obtenir cette vitesse supplémentaire. Maintenant, pour tirer parti des capacités d'un processeur multi-core offre, vous avez à vous assurer que votre application peut en profiter. C'est: vous avez pour voir quelles tâches peuvent être exécutées multithread / en même temps, et cela apporte quelques questions à la table ...

En savoir Erlang / F # (en fonction de votre plate-forme)

  • Préférez des structures de données immuables, leur utilisation rend le logiciel plus facile à comprendre non seulement dans les programmes concurrents.

  • Découvrez les outils de votre langue dans la concurrence (par exemple java.util.concurrent, JCIP ).

  • Apprendre une langue fonctionnelle ( Haskell ).

J'ai posé la même question, et la réponse est « ça dépend ». Si votre Joe Winforms, peut-être pas tant. Si votre code d'écriture qui doit être performant, oui. L'un des plus gros problème que je peux voir avec la programmation parallèle est celle-ci: si quelque chose ne peut pas être parallized, et vous mentir et dire la période de temps pour faire de toute façon parallèle, il ne va pas tomber en panne, il va juste faire des choses mauvaises , et vous obtiendrez des résultats de merde et blâme le cadre.

En savoir OpenMP et MPI pour le code C et C ++.

OpenMP applique également à d'autres langues comme Fortran je suppose.

Ecrire petits programmes.

D'autres langages de code / styles vous permettra de faire multithreading mieux (même si multithreading est encore très difficile dans toutes les langues), mais le grand avantage pour les développeurs réguliers, à mon humble avis, est la possibilité d'exécuter beaucoup de petits programmes en même temps pour accomplir une beaucoup plus grande tâche.

Alors, prenez l'habitude de briser vos problèmes en composants indépendants qui peuvent être exécutées chaque fois que vous voulez.

Vous allez construire des logiciels plus maintenable aussi.

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