Peut-on créer un programme à thread unique pour utiliser plusieurs cœurs?


12

Le titre dit tout: existe-t-il un moyen d'obtenir un ancien programme conçu pour utiliser un seul cœur de processeur pour utiliser plusieurs cœurs de processeur?


13
Non, pas possible.
Moab

5
Si seulement c'était aussi simple que ça ..
Brendan Long

1
Et s'il y avait un programme qui «émulait» un processeur (comme peut-être un VM?) Mais qui prenait votre processeur multicœur et émulait un processeur monocœur avec beaucoup plus de puissance de traitement par thread? Est-ce possible?
schizoid04

Qui gérera alors la synchronisation entre plusieurs threads, car l'ordre est important.
user36582

Réponses:


16

Malheureusement, un programme hérité écrit pour un seul processeur ne peut pas être obligé d'utiliser plusieurs cœurs de processeur. L'utilisation de plusieurs cœurs de processeur nécessite plusieurs threads, qui doivent communiquer entre eux tout en garantissant que les conditions de concurrence et d'autres problèmes ne se produisent pas. Une application plus ancienne ne peut pas être utilisée pour utiliser plus que le cœur du processeur, sauf si elle est réécrite pour le faire, et uniquement si la nature de l'application permet de la paralléliser.


19
Il convient également de noter que certaines applications ne peuvent tout simplement pas être réécrites pour prendre en compte plusieurs cœurs. Cela dépend principalement de la parallélisabilité du processus. Un exemple simple de processus non parallélisable serait la reproduction humaine: une femme peut faire un enfant en 9 mois. Neuf femmes peuvent faire 9 enfants en 9 mois, mais vous ne pouvez pas utiliser 9 femmes pour fabriquer un seul enfant en un mois.
AndrejaKo

1
En principe, on pourrait écrire un programme pour analyser un autre programme et tenter de le paralléliser. Cela dit, même des versions "faciles" très limitées de ce problème génèrent un doctorat. dissertations pour les deux dernières générations et les progrès ont été lents. Le problème complet peut très bien être entièrement AI.
dmckee --- chaton ex-modérateur

Génial, merci à tous, vous m'avez fait grion avec votre exemple Femmes et naissance, surtout quand vous parlez de fabrication: D
Chris

que faire si un programme a un tas d'opérations mathématiques indépendantes qui sont ensuite utilisées pour l'autre? peut-être qu'un deuxième fil peut analyser le programme, hmm je ne sais pas ce que je dis. Si un thread peut analyser l'ensemble .. "Faites une opération coûteuse ici, puis faites une deuxième opération coûteuse sur ce que la première opération coûteuse ne touche pas" ok je vais mettre une opération coûteuse sur un thread, un sur l'autre, puis synchronisée de retour sur le fil principal. Je suppose qu'un programme entier devrait être pré-analysé pour identifier les opérations coûteuses indépendantes.
CausingUnderflowsEverywhere

13

Quel est votre objectif? Des performances accrues? Malheureusement, les applications conçues pour n'utiliser qu'un seul cœur n'en utiliseront pas plus. C'est de cela que parlent ces applications "multi-thread".


2

Il existe au moins trois techniques pour exploiter plusieurs processeurs dans un programme conçu pour utiliser un seul cœur. La plus simple de ces techniques consiste à utiliser des bibliothèques et du code système qui utilisent plusieurs cœurs ou peuvent s'exécuter au moins partiellement en parallèle avec le code d'application. Le garbage collection est un exemple de fonctionnalités qui peuvent être parallélisées et qu'il est possible de faire en parallèle avec l'exécution de l'application. Même sans gestion automatique de la mémoire, il existe un certain potentiel de parallélisme dans les fonctions de désallocation de mémoire car l'allocateur de mémoire peut avoir un travail à faire au-delà du simple marquage de la section de mémoire comme disponible.

Une deuxième technique est la traduction binaire. Bien que cela puisse être considéré comme une «réécriture de l'application», cela se fait par logiciel et sans accès au code source. La production de parallélisme au niveau des threads ne semble pas avoir été le principal objectif de la plupart des recherches et développements utilisant la traduction binaire (qui concerne souvent l'exécution de code hérité sur une autre ISA, l'exploitation des extensions ISA ou l'optimisation pour une microarchitecture particulière, et l'utilisation d'informations dynamiques pour fournir des résultats plus élevés). optimisation guidée par le profil de qualité), mais le potentiel est évident.

Une troisième technique est le multithreading spéculatif. Actuellement, aucun processeur (à ma connaissance) ne prend en charge le multithreading spéculatif géré par le matériel. Cependant, avec l'introduction de la mémoire transactionnelle matérielle, la mise en œuvre d'un tel système d'exécution devient un peu plus pratique car le HTM peut être utilisé pour détecter les conflits d'utilisation de la mémoire. Le multithread spéculatif géré par logiciel impliquerait généralement une traduction binaire, mais sa nature spéculative justifie d'envisager une technique distincte.

Le caractère pratique de ces techniques est limité par les coûts associés aux systèmes existants (y compris le coût de communication entre les threads et les threads de frai), par le parallélisme limité qu'ils peuvent exploiter et par le retour sur investissement limité (applications importantes qui peuvent être avantageuses parallélisés sont susceptibles d'être réécrits, de nombreuses applications bénéficieraient relativement peu voire pas du tout de ces techniques (en particulier avec des limites de puissance / thermique permettant à un seul cœur de fonctionner à une fréquence plus élevée que plusieurs cœurs), et les coûts de développement sont importants). Cependant , ces techniques ne existent et il est théoriquement possible d'utiliser plusieurs cœurs avec une application conçue pour utiliser un seul noyau.


0

Non ça ne peut pas être. Un programme est explicitement écrit pour utiliser plusieurs cœurs. Il n'est pas trivial de faire le travail dans plusieurs cœurs. Il nécessite des synchronisations de tous les threads. Comme on lance le ballon, l'autre attrape, on polit le ballon, on nettoie, on vérifie si le ballon contient une bonne quantité d'air. Imaginez maintenant que chaque personnage s'exécute dans un thread indépendamment les uns des autres. Quelqu'un essaie d'attraper le ballon lorsqu'il n'est pas lancé. Ou quelqu'un essaie de polir la balle lorsqu'elle est jouée. Ou deux personnages essayant d'attraper et de lancer la balle simultanément. Il y a tellement de façons de planter. Les programmeurs doivent donc repenser soigneusement une application à cœur unique afin qu'elle puisse profiter de plusieurs cœurs.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.