Hay una serie de factores relacionados en el trabajo. Por un lado, las memorias principales realmente se han quedado atrás con respecto a las velocidades de la CPU; si, hipotéticamente, uno estuviera ejecutando un solo núcleo a 50 GHz y tuviera que esperar 10 ns para obtener un valor de RAM (bastante rápido, en realidad), perdería la oportunidad de realizar un trabajo útil de 500 ciclos de reloj. Por el contrario, si uno tuviera 10 núcleos que funcionaran a 2 GHz cada uno, entonces tal recuperación de memoria principal solo perdería el valor de 20 ciclos de reloj.
Otro factor es que las velocidades de la CPU están, en cierta medida, limitadas por la capacidad de obtener corriente en un chip y eliminarse. Hacer que un núcleo funcione dos veces más rápido requeriría más del doble de la corriente y produciría más del doble del calor. Si el uso de dos núcleos le permitirá a uno hacer tanto trabajo como podría hacerse con un núcleo ejecutándose dos veces más rápido, tiene más sentido utilizar dos núcleos.
Por cierto, un lugar donde se debe mejorar la interacción entre el hardware y el software, IMHO, es determinar cuándo es importante que el código que se ejecuta en un núcleo pueda ver las cosas escritas en la memoria por el código que se ejecuta en otro. Algunas arquitecturas asumen que cualquier otro procesador que intente leer esa ubicación debe ver lo antes posible cualquier cosa escrita en la memoria por cualquier procesador; otros requieren un código que desee que lo más reciente escrito en la memoria lo solicite explícitamente o se arriesgue a obtener "datos obsoletos". Es muy difícil hacer que el hardware para el estilo anterior se ejecute tan rápido como el hardware para el último estilo, y la dificultad aumenta con el número de núcleos de la CPU, pero es muy difícil crear un software para el último estilo, que es eficiente pero no ocasionalmente mal funcionamiento en circunstancias que son esencialmente imposibles de localizar. Me gustaría ver que el hardware y el software sean compatibles con un enfoque híbrido, por ejemplo, cuatro grupos de cuatro núcleos cada uno, y una garantía de que todos los núcleos dentro de cada grupo "verán" la misma memoria, garantías relajadas para los núcleos en diferentes grupos y un algoritmo de asignación de CPU predeterminado que aseguraría que el código para cualquier dominio de aplicación en particular lo haría Solo se ejecutará en grupos de procesadores que vieran la misma memoria. En los casos en que hubiera cuatro o más dominios de aplicación separados, cada uno de los cuales tenía su propio trabajo independiente para hacer, esto permitiría que los núcleos se ejecuten más rápido de lo que sería posible si los 16 tuvieran que compartir la misma imagen de memoria.