Red de conocimiento informático - Material del sitio web - ¿Cuál es la diferencia entre un sistema Linux basado en el conjunto de instrucciones MIPS y un sistema Linux basado en el conjunto de instrucciones X86?

¿Cuál es la diferencia entre un sistema Linux basado en el conjunto de instrucciones MIPS y un sistema Linux basado en el conjunto de instrucciones X86?

La evolución de MIPS

MIPS16 es una extensión de conjunto de instrucciones opcional introducida en 1997 que reduce el tamaño de los programas binarios en un 30-40%. Los implementadores esperan que esta CPU sea más atractiva en situaciones donde el tamaño del código es importante (generalmente sistemas de bajo costo). Dado que solo se utiliza en implementaciones específicas, es un estándar de múltiples proveedores: LSI, NEC y Philips producen CPU compatibles con MIPS16.

La razón por la que los binarios MIPS son más atractivos que otras arquitecturas no es porque el conjunto de instrucciones MIPS haga menos trabajo, sino porque su tamaño es mayor: 4 bytes por instrucción. Algunas arquitecturas CISC tienen un promedio de solo 3 bytes. por instrucción. 3 bytes.

MIPS agregó un modo en el que la CPU puede decodificar instrucciones de tamaño fijo de 16 bits. La mayoría de las instrucciones MIPS16 son extensibles a instrucciones MIPS III normales, por lo que obviamente se trata de un subconjunto de instrucciones bastante limitado. El truco consiste en hacer que este subconjunto sea lo suficientemente eficiente al codificar una cantidad suficiente del programa para comprimir significativamente el tamaño de todo el programa.

Por supuesto, las instrucciones de 16 bits no significan que sea un conjunto de instrucciones de 16 bits; una CPU MIPS16 es una CPU real con registros de 32 o 64 bits en los que se realizan todas las operaciones.

MIPS16 está lejos de ser un conjunto de instrucciones completo, por ejemplo, no tiene instrucciones de control de CPU ni instrucciones de punto flotante; Pero eso no importa porque cada CPU MIPS16 debe ejecutar MIPS ISA completo. Puede ejecutar una combinación de instrucciones de MIPS16 y código MIPS normal. Cada llamada de función o instrucción de registro de salto puede cambiar el modo de funcionamiento.

1. Proporcionar la opción de reducir a la mitad el tamaño de ciertas instrucciones no es la primera de su tipo en MIPS. La idea fue propuesta por primera vez por la versión Thumb de la CPU del brazo Advanced RISC Machine (ARM).

Codificar direcciones de instrucciones en modo de bit menos significativo (LSB) en MIPS16 es conveniente y eficiente. Las instrucciones MIPS16 deben estar alineadas en bytes pares, por lo que el bit 0 ya no forma parte del puntero de instrucción (contador de programa de la PC; en cambio, cada instrucción que salta a una dirección impar comienza a ejecutar MIPS16 y cada instrucción que salta a una dirección par). Todas las instrucciones devuelven MIPS normal. La dirección de destino de la instrucción jal de llamada de subrutina MIPS siempre está alineada con palabras, por lo que la nueva instrucción jalx oculta las transiciones de instrucciones entre modos.

Para comprimir el tamaño de la instrucción a la mitad, para la mayoría de las instrucciones asignamos solo 3 bits para registros seleccionados, permitiendo así acceso gratuito a solo 8 registros de propósito general como se ve en muchas instrucciones MIPS. Los campos constantes de 16 bits; También se comprimen, normalmente a 5 bits. También existen algunas reglas de codificación especiales que se presentarán en la siguiente sección.

D.1.1 Formatos de codificación especiales e instrucciones en MIPS16

Las instrucciones generales comprimidas no tienen nada de malo, pero hay dos debilidades específicas que aumentan el tamaño del programa: para la construcción El campo inmediato de 5 dígitos de la constante es insuficiente y el rango de direcciones en las operaciones de carga/almacenamiento es insuficiente. Tres nuevas directivas y un reglamento especial ayudan a abordar estas cuestiones.

Una extensión es una instrucción especial MIPS16 que consta de un código de 5 bits y un campo de 11 bits. Este campo de 11 bits se puede concatenar con el campo de dígito inmediato en instrucciones posteriores, lo que permite utilizar un único par de instrucciones para codificar un dígito inmediato de 16 bits. Esta instrucción parece un prefijo de instrucción en lenguaje ensamblador.

En el modo MIPS normal, cargar constantes requiere instrucciones adicionales, pero en el modo MIPS16 es más engorroso; será más rápido poner las constantes en la memoria y luego leerlas agregando la posición relativa a la instrucción; sí mismo Soporte para carga dependiente de la PC, lo que permite incrustar constantes en fragmentos de código. MIPS16 agregó soporte para operaciones de carga relativas a la posición de la instrucción en sí (cargas relativas a la PC), lo que permite incrustar constantes en secciones de código (generalmente antes del inicio de una función). Estas son las únicas instrucciones en MIPS16 que no corresponden estrictamente a las instrucciones MIPS ordinarias: MIPS no tiene operaciones de datos relacionadas con la PC.

Muchas operaciones de carga/almacenamiento MIPS se realizan directamente en marcos de pila, $29/mp probablemente el registro base más común. MIPS16 define un conjunto de instrucciones que implícitamente usan mp, lo que nos permite usar también la dirección de referencia del marco de pila de la función al programar, sin la necesidad de un campo de registro separado.

Las instrucciones de carga MIPS siempre generan direcciones completas de 32 bits. Dado que las instrucciones de carga de palabras sólo son legales cuando la dirección es múltiplo de 4, los dos bits más bajos se desperdician. Las instrucciones de carga MIPS16 son escalables: las compensaciones de direcciones se desplazan hacia la izquierda según el tamaño del objeto de carga/almacenamiento, lo que aumenta el rango de direcciones disponible en la instrucción.

Como mecanismo de emergencia adicional, MIPS16 define instrucciones que permiten el movimiento arbitrario de datos entre uno de los ocho registros accesibles de MIPS16 y cualquiera de los 32 registros de propósito general MIPS.

D.1.2 Evaluación de MIPS16

MIPS16 no es un lenguaje adecuado para la programación en lenguaje ensamblador y no lo cubriremos en detalle. Estos son los trabajos del compilador.

MIPS16 es más compacto que el código de arquitectura CISC de 32 bits, similar al código Thumb de Arm, y es bastante competitivo con las CPU puras de 16 bits.

Sin embargo, no hay nada gratis; un programa MIPS16 puede tener entre 40 y 50 instrucciones más que MIPS. Esto significa que los ciclos de reloj necesarios para ejecutar el programa en el núcleo de la CPU aumentarán entre 40 y 50. Pero las CPU de gama baja suelen estar limitadas principalmente por la memoria, no por los núcleos de la CPU. Los programas MIPS16 más pequeños requieren un menor ancho de banda para recuperar instrucciones, lo que resulta en tasas de pérdida de caché más bajas. En los casos en los que el caché es pequeño y la memoria del programa es limitada, MIPS16 compensará la diferencia y puede requerir reescribir el código MIPS normal.

Debido al rendimiento reducido, el código MIPS16 no es atractivo en computadoras con grandes recursos de memoria y líneas de bus anchas. Por eso es sólo una extensión opcional.

En el otro lado del espectro de aplicaciones, MIPS16 competirá con la compresión de software. Una vez colocado en la memoria ROM, un programa MIPS normal comprimido utilizando algoritmos de compresión de archivos comunes será más pequeño que el código equivalente MIPS16 sin comprimir y ligeramente más grande que el código equivalente MIPS16 comprimido (Nota 1, si su sistema tiene suficiente memoria, puede usar ROM); como sistema de archivos mientras se descomprime el código en la RAM para su ejecución, la descompresión completa del software ISA puede conducir a un mejor rendimiento general.

También existe una tendencia a construir sistemas que utilizan en gran medida lenguajes interpretados codificados en bytes (Java o sus sucesores) para escribir una gran cantidad de programas en los que el tiempo no es crítico. Este código intermedio es muy pequeño y de tamaño más eficiente que cualquier código de máquina binario. Si sólo el intérprete y unos pocos programas críticos para el rendimiento permanecieran en el ISA de la máquina, entonces un formato de codificación de conjunto de instrucciones más denso afectaría sólo a una pequeña porción de los programas. Por supuesto, los propios intérpretes (especialmente Java) serán muy grandes, pero el continuo crecimiento en la complejidad de las aplicaciones pronto hará que esto sea irrelevante.

Espero que durante el período 1998-2003, MIPS16 vea un uso a pequeña escala en sistemas de bajo consumo de energía, tamaño pequeño y con costos limitados. Todavía vale la pena inventarlo porque algunos sistemas (como los teléfonos "inteligentes") podrían producirse en masa.

1. En comparación con los algoritmos de compresión, los formatos de codificación densa tienen menos redundancia.

D.2 MIPSV/MDMX

MIPS V y MDMX se lanzaron juntos a principios de 1997. Fueron diseñados originalmente como instrucciones en preparación para las nuevas CPU MIPS/SGI que se lanzarán en 1998. Pero la CPU fue cancelada más tarde y su futuro quedó en duda.

Ambas instrucciones están diseñadas para superar algunas de las deficiencias conocidas del conjunto de instrucciones tradicionales que aparecen en las aplicaciones orientadas a multimedia de la ISA. Tareas como la codificación/decodificación de voz para módems de software, aplicaciones de transmisión por secuencias o la compresión/descompresión de imágenes/vídeos utilizan algoritmos matemáticos que históricamente solo estaban disponibles para procesadores de señales digitales (DSP) dedicados. En este nivel de informática, las tareas multimedia a menudo implican repetir las mismas operaciones en grandes vectores o conjuntos de datos.

En máquinas basadas en registros, la solución habitual es empaquetar elementos de datos multimedia en un único registro de máquina y luego ejecutar instrucciones registro-registro que realizan la misma operación en cada campo de cada registro. Esta es una forma muy obvia de procesamiento paralelo conocida como Instrucción única, datos múltiples (SIMD).

Este concepto apareció por primera vez en el desaparecido microprocesador de arquitectura i860 de Intel (alrededor del año 88). El resurgimiento de SIMD se volvió aún más dramático cuando MMX, una extensión del conjunto de instrucciones x86 de Intel, entró al mercado en 1996.

MDMX proporciona un conjunto de operaciones para manipular una matriz de números enteros de 8x8 bits en un registro de 64 bits que realiza la misma operación en los 8 subregistros. Estas operaciones incluyen las operaciones aritméticas habituales (suma, resta, multiplicación), pero también una instrucción de acumulación múltiple, que coloca el resultado en un acumulador enorme con suficiente precisión para evitar el desbordamiento.

Debido a que estas instrucciones se utilizan en situaciones donde tipos de datos específicos están claramente separados de las variables ordinarias del programa, se justifica el uso de registros de punto flotante en el conjunto de instrucciones MDMX. Reutilizar los registros existentes de esta manera significa que no se realizan cambios en el sistema operativo existente (el sistema operativo ya guarda y restaura registros de punto flotante en los cambios de tareas).

Al igual que MDMX, MMX de Intel también proporciona instrucciones de ocho vías de "ocho bytes" para empaquetar ocho números de 8 bits en un número de 64 bits. MIPS MDMX también define formatos de 4x16 bits (cuatro operaciones con enteros cortos) y 2x32 bits (operaciones de dos palabras), pero algunas implementaciones tempranas de MDMX pueden haber considerado suficientes un formato de ocho bytes e instrucciones.

Al realizar operaciones aritméticas con números de 8 bits, a menudo se producen desbordamientos y subdesbordamientos en los resultados. El rendimiento de las aplicaciones multimedia no mejorará si tenemos que escribir controladores para numerosas condiciones de prueba de desbordamiento. En cambio, es más útil para las operaciones de la máquina simplemente truncar los resultados de desbordamiento y subdesbordamiento de los números más grandes y más pequeños (255 y 0 para números de 8 bits sin signo). Este proceso se denomina algoritmo de "saturación" y MDMX tiene esta capacidad.

Esto nos lleva a MIPS V. Si bien su nombre parece implicar una actualización del conjunto de instrucciones, como MIPS I a MIPS IV, en el ámbito del punto flotante, MIPS V es similar a MDMX y proporciona pares de operaciones individuales.

MIPS V no es tan excéntrico como MDMX; MIPS IV contiene un conjunto bastante extenso de operaciones de punto flotante y proporciona directamente versiones de instrucciones emparejadas para la mayoría de las operaciones de punto flotante, incluso se pueden comparar pares ( par para comparar) porque las CPU MIPS IV ya tienen múltiples bits de condición de punto flotante para recibir el resultado.

Sin embargo, MIPS V no proporciona versiones de operación por pares de instrucciones complejas de múltiples ciclos, lo que requeriría muchos más recursos nuevos (por ejemplo, sin raíz cuadrada ni división).

D.2.1 ¿Puede el compilador utilizar directivas multimedia?

Las razones para introducir instrucciones multimedia SIMD son similares a las que proporcionaron unidades de procesamiento vectorial en las supercomputadoras hasta finales de los años 1970. Es muy fácil crear un paquete de operación matricial manual para procesadores vectoriales. Aunque los proveedores de supercomputadoras han tenido cierto éxito en este sentido, es mucho más difícil compilar un programa escrito en un lenguaje de alto nivel que utilice aritmética vectorial. Estos esfuerzos normalmente se centran en Fortran; las debilidades semánticas de la programación convencional hacen de Fortran un lenguaje pobre, pero esto también lo convierte en un lenguaje fácilmente optimizable.