Au menu sur cette page :
Vous trouverez ici quelques liens portant sur la multiprogrammation, qui intervient dans la plupart de mes cours, bien qu'il s'agisse, au fond, d'un sujet à part entière. Si vous découvrez d'autres liens dignes d'intérêt, faites-m'en part. De même, signalez-moi des liens brisés ou périmés si vous en rencontrez, ce qui me permettra d'offrir un meilleur service à vous comme à vos collègues.
Pour des texte portant plus spécifiquement...
Les sites Wiki décrivant...
Comment se porte la monoprogrammation? Données colligées par Jeff Preshing en 2012 : http://preshing.com/20120208/a-look-back-at-single-threaded-cpu-performance/
Discussion de différentes perspectives architecturales : http://www.possibility.com/wiki/index.php?title=ArchitectureDiscussion
Catalogue de concepts associés au parallélisme et aux systèmes concurrents, répertoriés par Kai Sellgren : https://github.com/kaisellgren/Concurrency-concepts
Les difficultés associées au développement pour des architecturess fortement hétérogènes, typiques des systèmes destinés au High Performance Computing et aux systèmes massivement parallèles, par Michael Wolfe en 2012 : http://www.hpcwire.com/hpcwire/2012-03-19/the_heterogeneous_programming_jungle.html
Une réflexion de Rob Pike sur la question des canaux en multiprogrammation :
Cours en ligne sur la programmation de systèmes concurrents :
Concurrence et réseaux de Pétri :
Quelques articles plus massifs :
Un bref sur la multiprogrammation chez Microsoft (tiré du Code Project, alors lire avec un oeil critique) :
Des réflexions sur le design de systèmes répartis par Ken Arnold, un penseur parfois provoquant :
Est-ce qu'un modèle réparti subsume un modèle centralisé « équivalent »? Une discussion : http://www.markdomowicz.com/index.php?option=com_content&view=article&id=64:distributed-is-not-a-superset-of-client-server-version-control&catid=40:programming&Itemid=60
Principes de multiprogrammation : http://queue.acm.org/detail.cfm?id=1454462
À propos des variables globales : http://software.intel.com/en-us/articles/global-variable-reconsidered/
Sur les difficultés associées à l'écriture du code multiprogrammé :
En 2012, Bartosz Milewski explique qu'à son avis, la multiprogrammation a sonné le glas de la programmation impérative, et que la programmation fonctionnelle est maintenant le chemin à emprunter : http://fpcomplete.com/the-downfall-of-imperative-programming/
Le débit et la latence, texte de 2016 par Pedro Ramalhete : http://concurrencyfreaks.blogspot.ca/2016/08/throughput-vs-latency-and-lock-free-vs.html
La conjecture CALM, ou Consistency as Logicial Monotonicity, suppose que les systèmes répartis deviendront éventuellement cohérents si leur comportement peut être exprimé par un raisonnement de logique monotone.
Quelques modèles de multiprogrammation suivent. La plupart ne sont pas mutuellement exclusifs.
Les acteurs constituent un modèle de programmation sans partage de données, fait d'entités actives qui transigent par messages asynchrones.
Non, ce n'est pas un nom scientifique.
L'approche par révisions concurrentes, mise en valeur par Microsoft Research, où chaque tâche obtient une copie (conceptuelle) de tous les états partagés, et où les changement d'états ne sont intégrés que lorsque les tâches se rejoignent, moment où les conflits d'écriture sont résolus de manière déterministe.
Quelques algorithmes et quelques familles d'algorithmes parallèles bien connus.
À propos de Map/ Reduce :
L'approche Map/ Reduce a donné naissance à ce que certains ont nommé l'architecture λ :
À propos du traitement de chaînes de caractères :
L'allocation dynamique de mémoire sur un ordinateur à plusieurs coeurs ou à plusieurs processeurs :
Comment fonctionne tcmalloc (Thread-Cache Memory Allocator), un texte de James Golick en 2013 :
Réaliser une accumulation parallèle sur des fonctions qui peuvent ne pas être pures, une proposition de Craig Gidney en 2013 : http://twistedoakstudios.com/blog/Post8355_brute-force-parallelization
Les dernières années des processeurs monocoeurs et le virage vers ce que nous connaissons maintenant, un texte de Jeff Preshing en 2012 : http://preshing.com/20120208/a-look-back-at-single-threaded-cpu-performance
Textes informatifs et semi-rigoureux sur les microprocesseurs contemporains :
Le site Wiki décrivant les processeurs à plusieurs coeurs est : http://en.wikipedia.org/wiki/Multi-core
Diverses considérations architecturales :
Des articles sur le défi derrière la programmation des processeurs à plusieurs coeurs :
Le développement et l'optimisation du code pour un processeur à plusieurs coeurs :
Idem mais pour des programmes pris en charge : http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx?loc=fr
Accéder à des masses importantes de données sur un ordinateur à plusieurs processeurs : http://msdn.microsoft.com/msdnmag/issues/01/08/Concur/
Sur les tangentes (plusieurs coeurs généralistes; plusieurs coeurs spécialisés) : http://www.eetimes.com/showArticle.jhtml;?articleID=206105179
Sur le futur de la programmation de processeurs munis de multiples coeurs : http://www.eetimes.com/news/latest/showArticle.jhtml?articleID=206504466
Sur le futur de la programmation à l'aide d'accélérateurs, par Kamil Rocki et Martin Burtscher en 2014 : http://www.hpcwire.com/2014/01/09/future-accelerator-programming/
Les coeurs ne sont pas nécessairement tous égaux : http://gcn.com/articles/2008/12/22/multicore-does-not-mean-equal-core.aspx
À propos du système d'exploitation Barrelfish, projet expérimental de Microsoft d'un système d'exploitation optimisé pour les machines à plusieurs coeurs : http://h-deb.ca/Liens/Systemes-exploitation.html#barrelfish
Avec Windows 7 :
La position d'AMD sur l'approche par hyperthreading : http://blogs.amd.com/work/2010/01/21/it%E2%80%99s-all-about-the-cores/
Faire véritablement le saut au multiples coeurs exigera une réécriture du système d'exploitation Windows, apparemment : http://www.networkworld.com/news/2010/031910-multicore-requires-os-rework-windows.html
Préparer le code pour la parallélisation sur plusieurs coeurs : http://www.drdobbs.com/go-parallel/article/showArticle.jhtml;jsessionid=MUIULNTFUDRZZQE1GHPSKH4ATMY32JVN?articleID=227500610
Il semble que les systèmes d'exploitation actuels (fin 2010) soient plus ou moins appropriés pour des ordinateurs munis de plus de 48 coeurs :
Un programme de tri en parallèle du Code Project, article de 2008 : http://www.codeproject.com/KB/threads/tricky_multicore.aspx
De combien d'échelonnabilité avons-nous besoin? La vision d'Herb Sutter :
Évaluer les interactions asymétriques sur des processeurs à multiples coeurs symétriques, article de 2008 : http://synergy.cs.vt.edu/pubs/papers/scogland-sc2008-symmer.pdf
Synchronisation et multiples coeurs : http://msdn.microsoft.com/en-us/library/ms686355%28VS.85%29.aspx
De l'avis de Vasudevan Thiygarajan, en 2012, la multiprogrammation avec plusieurs threads n'est pas la meilleure approche pour tirer profit au maximum des architectures munies de plusieurs coeurs : http://www.ibm.com/developerworks/java/library/j-nothreads/index.html?ca=drs-
Régler les problèmes de Python face aux ordinateurs à multiples coeurs, une proposition d'Eric Snow en 2015 : https://lwn.net/Articles/650521/
La multiprogrammation utilisant les unités de traitement graphiques, communément nommées GPU (Graphical Processing Unit), est en vogue. Voir aussi Advanced Massive Parallelism (AMP).
Article général de 2010 sur la montée des architectures orientées débit (Throughput-Oriented Architectures) : http://highscalability.com/blog/2010/12/3/gpu-vs-cpu-smackdown-the-rise-of-throughput-oriented-archite.html
Quelques bases de vocabulaire, tirées de Wiki :
À propos d'OpenCL, le Open Computing Language :
Approche alternative, reposant sur la virtualisation des langages, par plusieurs auteurs dont Martin Odersky : http://infoscience.epfl.ch/record/148814/files/paper.pdf
Du GPGPU avec Java : http://www.javacodegeeks.com/2011/09/gpgpu-java-programming.html
Du code hybride CPU/GPU avec Haskell, un texte de Ryan Newton en 2012 : http://parfunk.blogspot.ca/2012/05/how-to-write-hybrid-cpugpu-programs.html?m=1
La technologie CUDA, pour Compute Unified Device Architecture :
Optimiser les accès dans des programmes destinés à des GPU, textes d'Eric Holk en 2012 :
Compiler un programme Rust pour l'exécuter sur un GPU, par Eric Holk en 2012 : http://blog.theincredibleholk.org/blog/2012/12/05/compiling-rust-for-gpus/
Résoudre un labyrinthe à l'aide du GPU, texte de Christopher Wellons en 2014 : http://nullprogram.com/blog/2014/06/22/
L'outil Mapgraph, pour le traitement massivement parallèle de graphes : http://mapgraph.io/
Le GPLGPU, un moteur graphique sous licence GPL v3 : http://gplgpu.com/?p=88
Techniques pour partager de la mémoire entre CPU et GPU, à l'aide de Swift, en 2014 : http://memkite.com/blog/2014/12/30/example-of-sharing-memory-between-gpu-and-cpu-with-swift-and-metal-for-ios8/
Programmer pour un GPU de NVIDIA, par Yosef Kreinin en 2015 : http://yosefk.com/blog/simd-simt-smt-parallelism-in-nvidia-gpus.html
Cas vécu d'optimisation de code dans lequel les mises en attente lors de transferts de données entre le CPU et GPU étaient au coeur du problème, relaté par Raja Bala en 2015 : https://software.intel.com/en-us/articles/removing-cpu-gpu-sync-stalls-in-galactic-civilizations-3
Ce qu'il faut savoir à propos de la fréquence du GPU, selon Ben Widawsky en 2015 : https://bwidawsk.net/blog/index.php/2015/05/a-bit-on-intel-gpu-frequency/
L'« initiative Boltzmann » proposée par AMD pour faciliter le recours programmatique à des GPU : http://www.amd.com/en-us/press-releases/Pages/boltzmann-initiative-2015nov16.aspx
Combiner programmation sur le GPU et variables atomiques, par Elmar Westphal en 2015 : https://devblogs.nvidia.com/parallelforall/voting-and-shuffling-optimize-atomic-operations/
Les GPU et Intel, une présentation de 2015 par Jason Ross, Ken Lueh et Subramaniam Maiyuran : https://software.intel.com/sites/default/files/managed/89/92/Intel-Graphics-Architecture-ISA-and-microarchitecture.pdf
L'approche AMP, pour Advanced Massive Parallelism, est survolée sur ../Sujets/Parallelisme/AMP.html
Quelques considérations d'ordre général :
Ce qui suit liste quelques particularités de multiprogrammation de divers langages. Pour en savoir plus sur ces langages et sur bien d'autres, vous pouvez examiner ceci.
Ada et la concurrence :
C et la concurrence :
Parallélisme et concurrence avec C++ (la plupart en lien avec C++ 11) :
Parallélisme et multiprogrammation en Clojure :
Parallélisme avec C# :
La concurrence en D :
Erlang et la concurrence :
Concurrence avec F# (voir aussi les liens pour C# plus haut, étant donné que les deux partagent les mêmes outils) :
Parallélisme avec Haskell (voir aussi les collections concurrentes) :
Avec Go :
Avec Java :
Officiellement, il n'y a pas de threads en JavaScript, mais...
Avec Objective-C :
Avec Perl :
Réflexions sur la multiprogrammation avec Python :
Parallélisme avec R :
Multiprogrammation avec Ruby :
Concurrence avec Rust :
Parallélisme avec Scala :
Parallélisme avec Swift :
Multiprogrammation avec VB.NET :
Pour plus d'informations sur des API particulières en soutien aux threads, voir ../Sujets/Parallelisme/Bref-unites-execution.html#thread
La populaire API qu'est OpenMP est sommairement décrite ici : ../Sujets/Parallelisme/OpenMP.html
Un survol de la bibliothèque Threading Building Blocks, ou TBB, est offert ici : ../Sujets/Parallelisme/TBB.html
La technologie Ct, de Intel, se présente comme une API pour C++ et se concentre sur le parallélisme des données : http://software.intel.com/en-us/data-parallel/
Un survol de la technologie MPI, pour Message Passing Interface, un standard de facto du monde des calculs à haute performance (HPC, pour High Performance Computing) est offert sur ../Sujets/Parallelisme/MPI.html
Le projet PSTL, pour Parallel STL : http://www.extreme.indiana.edu/hpc++/docs/overview/class-lib/PSTL/ (ce projet est rendu quelque peu caduque du fait que la bibliothèque standard de C++ offre des algorithmes parallèles depuis C++ 17)
Le projet STAPL, pour Standard Template Adaptive Parallel Library, développé à l'Université du Texas (en partie par Bjarne Stroustrup) : https://parasol.tamu.edu/groups/rwergergroup/research/stapl/
Le Parallel Studio d'Intel : http://software.intel.com/en-us/articles/intel-parallel-studio-home/
Les collections concurrentes proposées par Intel :
L'extension Cilk Plus d'Intel, pour C et C++ :
Le projet GNU UPC (pour Unified Parallel C) : http://gcc.gnu.org/projects/gupc.html
Une nouvelle approche sous MacOS X, nommée le Grand Central Dispatch :
La bibliothèque Boost.InterProcess, pour communication entre processus : http://www.boost.org/doc/libs/1_39_0/doc/html/interprocess.html
Le compilateur Sieve est un moteur prenant en charge la parallélisation du code C++. Pour quelques articles sur le sujet, voir :
Performance des entrées/ sorties asynchrones de Java :
Bibliothèque s4, pour les calculs répartis sur des flux :
Les threads et Qt :
Parallélisme et technologies Microsoft :
Outils GNU :
Paralléliser des tâches avec xargs : http://www.spinellis.gr/blog/20090304/
L'appel système fork() : ../Sujets/Parallelisme/Bref-fork.html
Le compilateur par4all, voué à la parallélisation automatique de programmes Fortran et C :
Une instruction SIMD traite plusieurs données d'un seul coup. Lorsqu'un algorithme est écrit de manière à traiter une vaste quantité de données de manière semblable, le recours à des instructions SIMD peut réduire le temps de calcul de manière significative.
Faire des calculs avec des instructions SIMD ::
Structure d'une instruction SIMD, par Arvid Gerstmann en 2016 : https://arvid.io/2016/12/09/simd-instruction-format/
La multiprogrammation est un jouet pour grandes personnes, porteur d'un grand nombre de risques qui lui sont propres. Plusieurs font partie de la grande famille des des conditions de course et sont répertoriées sur : ../Sujets/Parallelisme/Bref-conditions-course.html
Pour un survol de quelques-uns des principaux risques associés à la multiprogrammation, voir ce texte de 2014 par Austin G. Walters : http://austingwalters.com/multithreading-common-pitfalls/
Joe Duffy, en 2010, explique les limites de readonly avec .NET : http://www.bluebytesoftware.com/blog/2010/07/01/WhenIsAReadonlyFieldNotReadonly.aspx
Certaines API ne passent pas bien le cap de la multiprogrammation.
Résoudre 11 problèmes dans du code multiprogrammé sous .NET, selon Joe Duffy en 2008 :
Pour les questions de synchronisation, voir ../Sujets/Parallelisme/Synchronisation.html
Quelques algorithmes bien connus dans le monde de la synchronisation en situation de multiprogrammation (la plupart des liens qui suivent mènent sur des sites Wiki) :
J'ai regroupé des informations sur ce sujet dans ../Sujets/Parallelisme/Bref-atomiques-primitives.html
Pour le cas plus précis des opérations Compare and Swap (CAS), voir ../Sujets/Parallelisme/Bref-atomiques-primitives.html#xchg pour des détails.
Exceptions et le Concurrency Runtime de Microsoft :
Le contenu de cette section a été déplacé dans une page à part entière : ../Sujets/Parallelisme/FauxPartage.html
Dans le monde du noyau de Linux :
Il semble que le noyau de Linux souffre (ou, du moins, ait souffert) d'une synchronisation sur la base d'un « gros verrou », si on se fie à cet article de Jeremy Andrews en 2008 : http://kerneltrap.org/Linux/Removing_the_Big_Kernel_Lock
Quelques outils de synchronisation bien connus sont brièvement décrits dans les sections ci-dessous.
J'ai regroupé les textes sur ce sujet dans ../Sujets/Parallelisme/Synchronisation.html#avec_verrou
J'ai regroupé les textes sur ce sujet dans ../Sujets/Parallelisme/futures.html
Le partage brut de mémoire est une approche traditionnellement utilisée pour les échanges à débit rapide entre processus et entre threads. Cela dit, un échange aussi direct comporte des risques.
J'ai regroupé les lies et les textes à ce sujet dans ../Sujets/Parallelisme/memoire_transactionnelle.html
Terme général pour désigner un objet susceptible d'être manipulé en toute sécurité de manière concurrente par plusieurs threads.
Un Wiki : http://en.wikipedia.org/wiki/Monitor_%28synchronization%29
J'ai regroupé les textes sur ce sujet dans ../Sujets/Parallelisme/Synchronisation.html#avec_verrou
En 2007, Herb Sutter nous rappelle qu'il ne faut pas appeler de code dont on ne connaît pas l'implémentation à l'intérieur d'une section critique : http://www.drdobbs.com/architecture-and-design/202802983?greturn=true&greturn=true
En 2009, Chris Forbes explique qu'à son avis, l'idéal est de s'assurer que tout thread puisse être suspendu au moment opportun : http://blogs.ijw.co.nz/chris/index.php/2009/04/theres-a-third-hard-thing-about-concurrency/
Une technique de partage de données entre threads à partir de transfert de responsabilité, proposée par Mark Lee en 2012 : http://www.altdevblogaday.com/2012/01/11/safer-data-sharing-between-threads/
Dans ce texte de 2012, Bruce Dawson nous rappelle que l'attente active (Busy Waiting) est rarement une bonne idée d'un point de vue performance, consommation d'énergie, équilibre systémique, etc. : http://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/
Voir aussi la synchronisation sans verrous.
Quelques structures de données pensées pour les programmes concurrents, un texte d'Arpan Sen en 2012 : http://www.ibm.com/developerworks/aix/library/au-multithreaded_structures1/index.html
Files asynchrones pour des tâches, par Richard Bone en 2012 : http://99designs.com/tech-blog/blog/2012/02/17/async-task-queues/
Collections immuables sous C# avec opérations en temps constant :
Un texte fondamental sur la question de la synchronisation et du temps, qu'on m'a fait lire quand j'étais étudiant :
Comprendre les horloges vectorielles (Vector Clocks) :
Le temps sous Microsoft Windows, de l'avis de Joseph M. Newcomer en 2011 : http://www.flounder.com/time.htm
Quelques considérations diverses sur la multiprogrammation et la synchronisation, pêle-mêle.
La littérature sur les tests et le débogage des systèmes multiprogrammés est encore en période de maturation, mais un bref aperçu de la raison pour laquelle les tests unitaires ne suffisent pas en ce sens peut être trouvée sur : http://www.artima.com/lejava/articles/javaone_2008_andy_chou.html
Certains tests nous révèlent des optimisations qui, au fond, n'en sont pas vraiment : http://antirez.com/post/fsync-different-thread-useless.html
Provoquer des bogues de concurrence (texte de 2011) : http://blog.corensic.com/2011/08/22/accelerating-concurrency-bugs/
On trouve parfois des bogues de concurrence à des endroits surprenants ou inattendus, par exemple lors de la finalisation des objets, comme en atteste ce texte de 2012 : http://wingolog.org/archives/2012/02/16/unexpected-concurrency
Pour plus d'articles sur ce sujet, voir Gestion-memoire--Liens.html