Descripción general del compilador: el concepto de programación de instrucciones

 tubería de instrucción de tubería

Supongamos que cada instrucción toma un ciclo para obtener el resultado 
La carga es de 3 ciclos
mult es de 2 ciclos
div es de 5 ciclos
la tienda es de 2 ciclos
y la suma es de 1 ciclo

Nota: El ciclo aquí puede entenderse como el tiempo de recursos informáticos de la CPU ocupado.

1 3 cargar a  \flecha correcta r1
2 4 cargar b  \flecha correcta r2
5 6 mult r1,r2  \flecha correcta r3
6 8 cargar c  \flecha correcta r4
7 9 cargar d  \flecha correcta r5
10 14 div r4,r5  \flecha correcta r6
15 15 agregar r3,r6  \flecha correcta r7
16 17 almacenar r7  \flecha correcta x

Se puede observar que la primera carga ha experimentado tres ciclos de 1, 2 y 3 desde el ciclo 1 al ciclo 3. La
segunda carga no depende de la primera carga, por lo que puedes comenzar directamente a ejecutar la
tercera carga sin esperar a que primera carga para completar. Mult necesita depender de los datos de r1 y r2, por lo que debe esperar a que se ejecute lo anterior antes de comenzar a ejecutar desde el ciclo 5.
Por analogía, aquí es principalmente necesario distinguir entre dependientes y no- dependiente

De acuerdo con este orden, se necesitarán un total de 17 ciclos para ejecutarse, que pueden entenderse como el tiempo de recursos informáticos consumido por la CPU en el orden actual.

A continuación cambiamos el orden de los comandos.

1 3 carga a  \flecha correcta r1
2 4 carga b  \flecha correcta r2
3 5 carga c  \flecha correcta r4
4 6 carga d  \flecha correcta r5

5 6 mult r1,r2  \flecha correcta r3
7 11 div r4,r5  \flecha correcta r6
12 12 agregar r3,r6  \flecha correcta r7
13 14 almacenar r7  \flecha correcta x 

Podemos ver que después de cambiar el orden, poner la carga sin dependencias al principio para ejecutar 17 ciclos se ha reducido a 14 ciclos, en inglés esto se llama  
paralelo a nivel de instrucción, que a grandes rasgos significa usar la mayor cantidad posible al final. Al mismo tiempo. Varios registros cargan datos al mismo tiempo para ahorrar tiempo.

Antes de clasificar:

17 ciclos 3 registros

// Aquí se muestra el registro en vivo (registro de supervivencia), que también puede entenderse como el registro que aún debe estar ocupado actualmente

cargar a  \flecha correcta r1 r1                          
cargar b  \flecha correcta r2 r1,r2

mult r1,r2  \flecha correcta r3 r3
load c  \flecha correcta r4 r3,r4
load d  \flecha correcta r5 r3,r4,r5 //No es difícil encontrar que la presión de registro máxima de este programa es 3         
divs r4,r5  \flecha correcta r6 r3,r6
add r3,r6  \flecha correcta r7 r7
tienda r7  \flecha correcta x ninguno

 Después de clasificar:

14 ciclos 4 registros

load a  \flecha correcta r1 r1
load b  \flecha correcta r2 r1,r2
load c  \flecha correcta r4 r1,r2,r4
load d  \flecha correcta r5 r1,r2,r4,r5 //Puedes ver que la presión de registro máxima de este programa es 4

mult r1,r2  \flecha correcta r3 r4,r5,r3
div r4,r5  \flecha correcta r6 r3,r6
agregar r3,r6  \flecha correcta r7 r7
almacenar r7  \flecha correcta x ninguno

Se puede ver que, aunque el ciclo de operación requerido se acorta después de ordenar la instrucción, el número de registros requeridos aumenta. 
Este es un problema de compensación NP: no existe un algoritmo de tiempo polinomial, es decir, ningún algoritmo de tiempo polinomial siempre puede considerarse como la solución óptima.
En otras palabras, se trata de un índice exponencial o factorial o un problema complejo a nivel factorial.

Entonces, ¿cómo elige el compilador? ¿Eliges darle prioridad al ciclo de operación o al número de registros?
Esto dependerá de las diferentes configuraciones del procesador.

La selección de instrucciones utiliza la menor cantidad de registros posible y la asignación de registros aumenta el uso de registros para reducir los ciclos. Se restringen entre sí.

Ejecución fuera de orden (fuera de orden)

La ejecución fuera de orden (OoOE u OOE para abreviar) es un método de programación utilizado en microprocesadores de alto rendimiento para aprovechar al máximo los ciclos de instrucciones para mejorar el rendimiento de las instrucciones de la CPU. En este algoritmo de programación, la CPU determina el orden de ejecución de las instrucciones de acuerdo con la disponibilidad de operandos (operandos) incluidos en las instrucciones, en lugar de estar determinado por el orden del código original del programa.
 

La figura anterior compara el tiempo de ejecución de instrucciones de dos métodos de procesamiento diferentes, ejecución secuencial y ejecución desordenada, bajo el mismo diseño de canalización. En la ejecución secuencial, el procesador ejecuta las instrucciones de la máquina en el orden escrito en el programa (In-Order). Podemos ver que la instrucción de carga que lee datos de la memoria cuando se ejecuta en el orden escrito, como se muestra en la figura LOAD R2, 8 (R1), debido a que acceder a la memoria requiere un ciclo de instrucción largo, las otras instrucciones que siguen siguen inmediatamente Caerá en una larga espera (esperando la confirmación del comando anterior). Aunque esta situación parece razonable, en ocasiones, la siguiente instrucción no depende de la instrucción anterior con un gran retraso, mientras haya operandos se puede ejecutar ¿Tenemos una mejor manera de lidiar con eso? Sí, eso es ejecución fuera de orden. Para las CPU que admiten la ejecución fuera de orden, el orden de ejecución de las instrucciones de la máquina puede interrumpirse, en lugar de ejecutarse en el orden en que está escrito el programa. Rendimiento de instrucciones IPC (Instrucciones por ciclo).

x86 tiene una CPU averiada

Supongo que te gusta

Origin blog.csdn.net/weixin_43754049/article/details/126181221
Recomendado
Clasificación