C'est une question très délicate, avec plusieurs niveaux de réponses. Je vais esquisser ce qui peut tous se passer simultanément à un moment donné. Remarque : ce que j'esquisse ci-dessous est le cas idéal : en pratique, les processeurs perdent du temps, par exemple en attendant que les données viennent de la mémoire, d'un cache cohérent, et cetera.
- Les cœurs multiples sont comme des ordinateurs séparés, donc avoir 4 cœurs signifie que vous avez (au moins) 4 instructions qui travaillent en même temps. Ces instructions peuvent provenir de processus parallèles ou de threads.
- L'histoire des threads est un peu subtile. En partie, ils sont une construction logicielle, donc vous pouvez créer une centaine de threads, et clairement votre CPU ne va pas exécuter une centaine d'instructions simultanément, sauf dans la mesure où il a des cœurs : il va juste passer très rapidement de l'un à l'autre.
- Cependant, certains processeurs (par exemple le Xeon Phi d'Intel, et je crois certains des prochains processeurs post-Haswell) ont des "threads matériels" : ils peuvent effectivement faire en sorte que certains des threads logiciels s'exécutent simultanément dans un cœur. Ainsi, le nombre de threads (et le nombre d'instructions simultanées) est le nombre de cœurs multiplié par le nombre d'hyperthreads.
- Comme indiqué dans certaines autres réponses : les processeurs disposent de pipelining. Si vous avez une séquence d'instructions identiques, ils passent par une ligne d'assemblage d'être partiellement complété. Si une instruction prend 6 cycles, et que le pipeline a 6 étapes, alors à tout cycle d'horloge vous aurez 5 instructions partiellement complétées, et une en cours de livraison. Donc, d'une certaine manière, il y a 5 ou 6 instructions qui sont travaillées simultanément, juste à des degrés divers de progression.
- Les processeurs ont souvent des unités d'addition et de multiplication séparées. Si votre programme est écrit de telle sorte que le compilateur puisse trouver une addition et une multiplication qui ne dépendent pas l'une de l'autre, le processeur peut effectivement les exécuter simultanément. (Avec Haswell et les versions ultérieures d'Intel, c'est en fait un peu différent : il n'y a que des unités FMA `fused multiply-add&apos ; qui peuvent faire "x = ax+y" en un cycle. Pour faire une multiplication ou une addition, il faut mettre "y=0" ou "a=1" respectivement. C'est une façon légèrement différente d'avoir plus d'une opération en cours, bien que ce'soit juste une instruction.)
- Enfin, les unités à virgule flottante ont souvent des " voies SIMD " : au lieu d'opérer sur une seule paire d'opérandes, elles opèrent sur des registres qui ont 2 opérandes de large (SSE classique), 4 de large (Intel Haswell) ou même 8 de large (Intel Xeon Phi). Et par "opérande", j'entends un nombre à virgule flottante de 8 octets. Mon penchant pour le HPC se manifeste.
Donc dans une puce comme le Xeon Phi, vous aurez 60 cœurs, chacun exécutant 4 threads matériels, avec des unités d'addition et de multiplication indépendantes, chacune de 8 largeurs. Ce qui donne 60 fois 4 fois 2 fois 8 !oups divisé par 2 à cause d'une technicité ! = près de 2000 instructions actives à chaque cycle d'horloge.
Ce n'est pas quelque chose...... Bien entendu, vous'aurez un mal fou à écrire réellement un programme qui s'exécute avec ce genre de performances.