Parallélisme en Julia. Caractéristiques et limites

dans leur papier arXiv , les auteurs originaux de Julia mentionnent ce qui suit:

2.14 Parallelism . L'exécution en parallèle est assurée par un système de multi-traitement basé sur les messages mis en œuvre à Julia dans la bibliothèque standard. La conception linguistique soutient la mise en œuvre de telles bibliothèques par fournissant des coroutines symétriques, qui peuvent également être considérées comme des discussions programmées en coopération. Cette fonctionnalité permet asynchrone la communication doit être cachée à l'intérieur des bibliothèques, plutôt que d'exiger à l'utilisateur de paramétrer des rappels. Julia ne soutient pas actuellement native fils, qui est une limitation, mais a l'avantage d'éviter les complexités de l'utilisation synchronisée de la mémoire partagée.

que signifient - ils en disant que Julia ne supporte pas native threads ? Qu'est ce qu'un thread natif?

D'autres langages interprétés comme Python ou R supportent-ils ce type de parallélisme? Est Julia seuls dans cette situation?

49
demandé sur StefanKarpinski 2013-05-07 17:50:32

1 réponses

"threads natifs" sont des contextes d'exécution séparés, gérés par le noyau du système d'exploitation, accédant à un espace mémoire partagé et potentiellement exécutant simultanément sur des noyaux séparés. Comparez cela avec des processus séparés, qui peuvent s'exécuter simultanément sur plusieurs noyaux mais ont des espaces de mémoire séparés. S'assurer que les processus interagissent bien est facile car ils ne peuvent communiquer entre eux que via le noyau. S'assurer que les threads n'interagissent pas de manière imprévisible, buggy est très difficile, car ils peuvent lire et écrire dans la mémoire d'une manière illimitée.

La R situation est assez simple: R n'est pas multithread . Python est un peu plus compliqué: Python supporte le threading, mais à cause du global interpreter lock (GIL) , aucune exécution réelle de code Python n'est possible. D'autres langages dynamiques open source populaires sont dans divers états mixtes en ce qui concerne natif threading (Ruby: Non / kinda / yes? ; Node.js: Non ), mais en général, la réponse est non, ils ne supportent pas totalement le threading natif concurrent, donc Julia n'est pas seule dans ce cas.

quand nous ajoutons le parallélisme mémoire partagée à Julia, comme nous projetons à - que ce soit en utilisant des fils natifs ou des processus multiples avec mémoire partagée – ce sera la vraie concurrence et il n'y aura pas de GIL empêchant la simultanéité exécution du code Julia. Cependant, il s'agit d'une fonctionnalité incroyablement délicate à ajouter à une langue, comme en témoigne le support inexistant ou limité dans d'autres langues dynamiques très populaires et matures. L'ajout d'un modèle de simultanéité mémoire partagée est techniquement difficile, mais le vrai problème est de concevoir un modèle de programmation qui permettra aux programmeurs d'utiliser efficacement la simultanéité du matériel d'une manière productive et sûre. Ce problème n'est généralement pas résolu et constitue un domaine de recherche et de développement très actif. expérimentation - il n'y a pas d'étalon-or à copier. Nous pourrions simplement ajouter le support des threads POSIX, mais ce modèle de programmation est généralement considéré comme dangereux et incroyablement difficile à utiliser correctement et efficacement. Go a une excellente histoire de concurrence, mais il est conçu pour écrire des serveurs hautement concurrents, pas pour fonctionner simultanément sur de grandes données, il n'est donc pas du tout clair que simplement copier le modèle de Go est une bonne idée pour Julia.

66
répondu StefanKarpinski 2017-05-23 12:10:30