Esta es una pregunta muy complicada, con varias capas de respuestas. Esbozaré lo que puede estar ocurriendo simultáneamente en un momento dado. Nota: lo que esbozo a continuación es el caso ideal: en la práctica, los procesadores pierden tiempo, por ejemplo, esperando que los datos lleguen de la memoria, de una caché coherente, etc.
Los núcleos múltiples son como ordenadores separados, así que tener 4 núcleos significa que tienes (al menos) 4 instrucciones trabajando al mismo tiempo. Esas instrucciones pueden venir de procesos paralelos o de hilos.
La historia de los hilos es un poco sutil. En parte son una construcción de software, por lo que puedes crear 100 hilos, y claramente tu CPU no va a ejecutar cien instrucciones simultáneamente, excepto en la medida en que tenga núcleos: simplemente cambiará muy rápidamente entre ellos.Sin embargo, algunos procesadores (por ejemplo el Intel Xeon Phi, y creo que algunos de los próximos procesadores post-Haswell) tienen «hilos de hardware»: realmente pueden hacer que algunos de los hilos de software se ejecuten simultáneamente dentro de un núcleo. Así que el número de hilos (y el número de instrucciones simultáneas) es el número de núcleos multiplicado por el número de hiperhilos.Como se indica en algunas otras respuestas: los procesadores tienen pipelining. Si tienes una secuencia de instrucciones idénticas, pasan por una cadena de montaje de ser completadas parcialmente. Si una instrucción tarda 6 ciclos, y el pipeline tiene 6 etapas, entonces en cualquier ciclo de reloj tendrás 5 instrucciones parcialmente completadas, y una siendo entregada. Así que, en cierto modo, hay 5 o 6 instrucciones trabajando simultáneamente, sólo que en diferentes grados de progreso.Los procesadores suelen tener unidades de suma y multiplicación separadas. Si tu programa está escrito de forma que el compilador pueda encontrar una suma y una multiplicación que no dependan la una de la otra, el procesador puede realmente ejecutarlas simultáneamente. (Con Haswell y posteriores Intel es en realidad algo ligeramente diferente: sólo hay unidades FMA `fused multiply-add’ que pueden hacer «x = ax+y» en un ciclo. Para hacer una multiplicación o una adición se pone «y=0» o «a=1» respectivamente. Eso’es una forma ligeramente diferente de tener más de una operación en marcha, aunque’es sólo una instrucción.)Por último, las unidades de punto flotante a menudo tienen «carriles SIMD»: en lugar de operar en un solo par de operandos, operan en registros de 2 operandos de ancho (SSE clásico), 4 de ancho (Intel Haswell) o incluso 8 de ancho (Intel Xeon Phi). Y por «operando» me refiero a un número de coma flotante de 8 bytes. Se nota mi inclinación por el HPC.
Así que en un chip como el Xeon Phi, tendrás 60 núcleos, cada uno ejecutando 4 hilos de hardware, con unidades de suma y multiplicación independientes, cada una de 8 de ancho. Lo que da 60 por 4 por 2 por 8 ¡oh, dividido por 2 por un tecnicismo! = cerca de 2000 instrucciones activas en cada ciclo de reloj.
¿No es eso algo? Por supuesto, te costará mucho escribir un programa que se ejecute con ese tipo de rendimiento.