Los procesadores desde hace 20 años son superescalares. Significa que tienen varias instrucciones ejecutándose a la vez.
Hay que verlos como una cadena de montaje, donde hay distintas etapas de ensamblado. Se pueden tener varias instrucciones a la vez ensamblandose, cada una en una etapa distinta. Cuantas más etapas más rápido puedes ejecutar las cosas. Es decir, más mhz logras y mas instrucciones puedes tener en tu cadena de montaje.
Pero tienes una pega. Si pones muchas instrucciones a ejecutar a la vez porque tu cadena de montaje es muy larga, puede suceder que la última instruccion sea... por ejemplo el fin del programa. A tomar por culo las anteriores que tienes a medias. Deja de tener sentido ejecutarlas. Esto como es lógico penaliza mucho el rendimiento.
Es por esto por lo que AMD le gano la partida a Intel con los P4 y los K7. AMD tenia cadenas cortas pero muy eficientes. Intel en cambio las tenia larguisimas. Llegaban a muchos Mhz pero se formaban tiempos muertos cada vez que se equivocaban al "predecir" que instrucciones ejecutar, ya que no sabían el resultado hasta que no se completaba la primera instruccion.
Inventaron su HyperThreading que no era más que tener dos grupos de instrucciones. Cuando fallaban en la predicción de una vaciaban la cadena de montaje y metían las otras. Y mientras tanto calculaban de nuevo qué deberían meter en la siguiente tanda. Era una manera chapuza de tener siempre la cadena de montaje ocupada. Por eso parecía que había dos micros cuando lo que había era uno solo ejecutando dos hilos de proceso a la vez. Cuando se equivocaba en la predicción de uno de ellos recurria al otro, y mientras volvia a predecir que ejecutar.
No se para que me enrollo contando esto xD.
A lo que iba. Tener varios núcleos siempre se aprovecha. Igual que puedes tener varias instrucciones en una CPU las puedes tener distribuidas en varias. Pero la ganancia de proceso es ínfima. Con cuatro núcleos consigues más potencia, pero no mas velocidad. Un ordenador podrá ejecutar casi cuatro veces más carga de datos sin verse penalizado.
Con varios nucleos siempre consigues esa ganancia. Hacer más cantidad de cosas en el mismo tiempo, que no significa hacerlas más rapido. Eso ya lo logras siempre gracias al S.O. que gestiona los procesos. Y hoy en día desde Linux hasta Mac pasando por Windows lo hacen todos.
Otra historia es ya que el programa que ejecutes sea capaz de repartirse entre todos los núcleos. Cosa que dependiendo del tipo de programa es posible o no. Por ejemplo un juego online lo tiene jodido. No es predecible su comportamiento. No se puede paralelizar su ejecución.
Pero en cambio un programa que se dedique a pasar videos a divx lo tiene de fábula para aprovechar los núcleos. Es tan simple como cortar el video en X cachos y ale, cada uno a un núcleo.