El uso de múltiples núcleos requiere exponer explícitamente el paralelismo de nivel de subproceso al sistema operativo, que generalmente requiere que el programador escriba un programa de subprocesos múltiples. (O para ejecutar un programa de subproceso único varias veces en diferentes entradas, como compilar con make -j4
)
Sin embargo, los compiladores para algunos idiomas admiten la paralelización automática. Por ejemplo, C o C ++ con OpenMP puede compilar un for()
bucle ordinario en un programa que inicia múltiples subprocesos.
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
Pero aún así, esto tiene que suceder cuando escribió o compiló el programa. No hay forma de que el hardware y los sistemas operativos actuales usen múltiples núcleos para acelerar un programa de subproceso único.
Relacionado: ¿Cómo se ejecuta un solo hilo en múltiples núcleos? : respuesta: no lo hacen. Pero hay otros tipos de paralelismo, como el paralelismo de nivel de instrucción que un solo núcleo de CPU encuentra y explota para ejecutar un solo hilo más rápido que una instrucción a la vez.
Mi respuesta a esa pregunta entra en algunos de los detalles de cómo las CPU modernas encuentran y explotan el paralelismo de nivel de instrucción de grano fino. (Principalmente centrado en x86). Eso es solo parte de cómo funcionan las CPU normales, al tener varias instrucciones en vuelo a la vez, y no es algo que necesite habilitar especialmente. (Sin embargo, hay contadores de rendimiento que le permiten ver cuántas instrucciones por reloj logró ejecutar su CPU mientras ejecutaba un programa u otras medidas).
Tenga en cuenta que RPi3 utiliza núcleos de CPU ARM Cortex-A53 en orden . Cada núcleo es superescalar de ancho 2 (2 instrucciones por reloj como lo permite ILP), pero no puede reordenar las instrucciones para encontrar más paralelismo a nivel de instrucción y ocultar latencia.
Aún así, la CPU está canalizada, por lo que el número total de instrucciones en vuelo (desde recuperar y decodificar hasta la etapa de reescritura al final de la canalización) es significativo. Cuando las dependencias de datos no limitan las cosas, puede haber 2 instrucciones en cada etapa de canalización en las que la CPU está trabajando, con un rendimiento de 2 instrucciones por reloj. (Eso es lo que significa 2 ancho).
No puede ejecutar instrucciones fuera de orden, pero con un orden de instrucciones cuidadoso (generalmente por un compilador) aún puede ocultar la latencia de una instrucción que toma varios ciclos para que su salida esté lista. (por ejemplo, una carga incluso si llega a la memoria caché o una multiplicación tomará varios ciclos, en comparación con una adición que esté lista el próximo ciclo). El truco consiste en ordenar las instrucciones asm para que haya múltiples instrucciones independientes entre la que produce un resultado y la que lo utiliza.
Tener software (un compilador) para programar las instrucciones estáticamente es más frágil que tener hardware que puede reordenarse internamente mientras se preserva la ilusión de ejecutarse en orden de programa. Es muy difícil para los compiladores hacer un trabajo tan bueno como incluso una pequeña ventana fuera de orden para reordenar las instrucciones porque los errores de caché son impredecibles, y es difícil analizar las cadenas de dependencia a través de las llamadas a funciones en tiempo de compilación. Y el número de registros es limitado sin cambiar el nombre del registro de hardware.
Todo esto es una pequeña comodidad cuando su código se ejecuta más lentamente de lo que desea. Claro que hay muchas cosas interesantes debajo del capó en un Cortex-A53, pero hay más cosas geniales debajo del capó en un Cortex-A57 (como la ejecución fuera de orden de hasta 3 instrucciones por reloj), e incluso más en una gran CPU x86 como Skylake (sin mencionar las diferencias de velocidad de reloj).
Cortex-A53 es bastante fantástico en comparación con un https://en.wikipedia.org/wiki/Classic_RISC_pipeline como MIPS original sobre el que aprendería en la clase de arquitectura de computadora, pero según los estándares modernos es bastante bajo.