L'utilisation de plusieurs cœurs nécessite d'exposer explicitement le parallélisme au niveau du thread au système d'exploitation, ce qui nécessite généralement que le programmeur écrive un programme multithread. (Ou pour exécuter un programme à thread unique plusieurs fois sur différentes entrées, comme la compilation avec make -j4
)
Les compilateurs pour certaines langues prennent cependant en charge la parallélisation automatique. Par exemple, C ou C ++ avec OpenMP peut compiler une for()
boucle ordinaire dans un programme qui démarre plusieurs threads.
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
Mais encore, cela doit se produire lorsque vous avez écrit ou compilé le programme. Il n'y a aucun moyen pour le matériel et les systèmes d'exploitation actuels d'utiliser plusieurs cœurs pour accélérer un programme à thread unique.
En relation: Comment un seul thread s'exécute-t-il sur plusieurs cœurs? : réponse: ils ne le font pas. Mais il existe d'autres types de parallélisme, comme le parallélisme au niveau de l'instruction, qu'un seul cœur de processeur trouve et exploite pour exécuter un seul thread plus rapidement qu'une instruction à la fois.
Ma réponse à cette question va dans certains détails sur la façon dont les processeurs modernes trouvent et exploitent le parallélisme fin au niveau des instructions. (Se concentrant principalement sur x86). Cela fait partie du fonctionnement normal des processeurs, en ayant plusieurs instructions en vol à la fois, et ce n'est pas quelque chose que vous devez activer spécialement. (Il existe cependant des compteurs de performances qui peuvent vous permettre de voir combien d'instructions par horloge votre processeur a réussi à exécuter lors de l'exécution d'un programme, ou d'autres mesures.)
Notez que RPi3 utilise des cœurs CPU ARM Cortex-A53 dans l'ordre . Chaque cœur est superscalaire à 2 larges (2 instructions par horloge comme ILP le permet), mais ne peut pas réorganiser les instructions pour trouver plus de parallélisme au niveau des instructions et masquer la latence.
Pourtant, le CPU est en pipeline, donc le nombre total d'instructions en vol (depuis la récupération et le décodage jusqu'à l'étape de réécriture à la fin du pipeline) est important. Lorsque les dépendances de données ne limitent pas les choses, il peut y avoir 2 instructions dans chaque étape de pipeline sur laquelle le processeur travaille, avec un débit de 2 instructions par horloge. (C'est ce que signifie 2-wide.)
Il ne peut pas exécuter des instructions dans le désordre, mais avec un ordre des instructions soigné (généralement par un compilateur), il peut toujours masquer la latence d'une instruction qui prend plusieurs cycles pour que sa sortie soit prête. (par exemple, une charge même si elle frappe dans le cache ou une multiplication prendra plusieurs cycles, contre un ajout étant prêt le cycle suivant). L'astuce consiste à ordonner les instructions asm afin qu'il y ait plusieurs instructions indépendantes entre celle qui produit un résultat et celle qui l'utilise.
Avoir un logiciel (un compilateur) pour planifier statiquement des instructions est plus fragile que d'avoir du matériel qui peut être réorganisé en interne tout en préservant l'illusion de fonctionner dans l'ordre du programme. Il est très difficile pour les compilateurs de faire un aussi bon travail que même une petite fenêtre en panne pour réorganiser les instructions car les échecs de cache sont imprévisibles, et il est difficile d'analyser les chaînes de dépendance entre les appels de fonction au moment de la compilation. Et le nombre de registres est limité sans changement de nom du registre matériel.
Tout cela est un petit confort lorsque votre code s'exécute plus lentement que vous le souhaitez. Bien sûr, il y a beaucoup de trucs sympas sous le capot dans un Cortex-A53, mais il y a plus de trucs sympas sous le capot dans un Cortex-A57 (comme l'exécution dans le désordre de jusqu'à 3 instructions par horloge), et encore plus dans un gros processeur x86 comme Skylake (sans parler des différences de vitesse d'horloge).
Le Cortex-A53 est assez fantastique par rapport à un https://en.wikipedia.org/wiki/Classic_RISC_pipeline comme le MIPS d'origine que vous découvrirez dans la classe d'architecture informatique, mais selon les normes modernes, c'est assez bas de gamme.