¿Por qué la mayoría de las ISA RISC no escriben el número entero MULH / MUL o DIV / REM en dos registros de propósito general? [cerrado]

3

La mayoría de los algoritmos de multiplicación y división de hardware pueden calcular las palabras altas y bajas de un producto de dos enteros, o el cociente y el resto de la división de dos enteros, al mismo tiempo. En las principales ISA RISC, existen muchos enfoques diferentes para la multiplicación y división de enteros. (En esta publicación, solo estoy considerando las matemáticas de enteros y no de punto flotante).

  • La mayoría de los diseños RISC anteriores no tienen instrucciones de este tipo.
  • MIPS I tiene múltiples instrucciones que devuelven el resultado de palabras dobles en un par de registros de propósito especial, $ HI: $ LO, así como instrucciones de división que devuelven el cociente en $ LO y el resto en $ HI. Mover los contenidos de $ HI o $ LO a un registro de propósito general es otra instrucción.
  • SPARC V8 y superior almacenarán la palabra baja de una multiplicación o el cociente de una división en un registro específico, pero almacenarán la palabra alta de multiplicación o el resto de la división en un registro de propósito especial,% y.
  • La mayoría de las arquitecturas RISC de los años 90, incluidas POWER, Alpha y PA-RISC, tienen instrucciones separadas para poner cualquiera la palabra alta o la palabra baja de una multiplicación en cualquier registro de propósito general , y para poner un cociente en cualquier registro de propósito general, pero no para calcular un resto en absoluto; para obtener el resto, debe calcular c = a / b , y luego encontrar d = a - b × c .
  • El ARM A32 ISA tiene dos de las instrucciones que me interesan, SMULL y UMULL , que se introdujeron en v3M. Estos almacenan la palabra alta y baja del producto de dos enteros de 32 bits en diferentes registros de 32 bits. Tiene muchas otras instrucciones de multiplicación de variantes también. Sin embargo, no calcula el resto de una división.
  • ARM A64 redefine SMULL y UMULL para almacenar el producto de 64 bits de dos enteros de 32 bits en un registro de 64 bits. No tiene instrucciones de multiplicación de 64 bits, per se . Para multiplicar, haces una suma multiplicada que agrega el registro cero. Existe una división de enteros, pero no hay un módulo de enteros.
  • La ISA RISC-V con la extensión M tiene varias variantes de MULH , MUL , DIV y REM , pero el Manual de conjunto de instrucciones RISC-V recomienda que cuando a MULH le sigue un MUL con los mismos operandos de origen, o un DIV por un REM con los mismos operandos de origen, las microarquitecturas pueden fusionar estas operaciones en una sola operación en lugar de realizar dos separadas. / li>

Definitivamente es posible calcular el resultado completo de una multiplicación, o división y resto, al mismo tiempo. ¡Varias ISA de RISC tienen una instrucción para hacerlo! En teoría, si solo desea un resultado, puede establecer el destino del otro en el registro cero. ¿Por qué, entonces, ninguna ISA RISC que miré tiene una instrucción para almacenar tanto el cociente como el resto en registros separados de propósito general, y por qué la única ISA que encontré hace esto por las palabras altas y bajas de un producto, ARM A32, ¿soltarlo en la próxima revisión importante?

Estoy particularmente interesado en saber por qué los primeros chips RISC de mediados de los 80 tomaron esta decisión de diseño. SPARC V8 no tenía un formato de instrucciones con dos registros de origen y dos de destino y posiblemente no quería complicar su decodificador con otro formato. MIPS I: ¿recortar esquinas para encajar instrucciones más complejas en una tubería RISC clásica?

Pero también me pregunto por qué las arquitecturas modernas de RISC se han alejado de él. Supongo que ARM A64 lo hace de esta manera porque la adición múltiple de precisión fija es útil para la decodificación multimedia, ya que la sobrecarga relativa es mayor cuanto más bits se multiplican y, una vez que se tiene eso, tiene sentido reutilizar los circuitos para la multiplicación ( sólo tiene que añadir 0). Pero la documentación de RISC-V sugiere que el núcleo debe tener una sola operación que calcule ambos resultados, entonces, ¿por qué no, en un diseño RISC, exponer eso en la ISA?

¿Se han publicado artículos sobre este tema? ¿O los diseñadores de estas arquitecturas han explicado alguna vez su razón para ello?

    
pregunta Davislor

1 respuesta

4

En general, los requisitos comerciales para los diseños de procesadores están dirigidos a cumplir con pruebas comparativas sintéticas o cargas de trabajo de aplicaciones en el mundo real . Las características que no abordan ninguna de las dos son más difíciles de vender y, por lo tanto, es más probable que queden excluidas.

Durante los años 80, el punto de referencia de Dhrystone fue muy popular. Por lo general, esto se presentaría en un lenguaje de alto nivel, por lo general, C. Dhrystone no incluye ningún resto de operaciones. Por lo tanto, los diseñadores que apuntan a una puntuación alta de Dhrystone pueden dejar de lado la operación del resto para eliminar algunos picosegundos del tiempo del ciclo.

La mayoría de los lenguajes de alto nivel tienen operadores aritméticos separados para el cociente y el resto, muy pocos proporcionan operaciones estandarizadas para realizar ambas operaciones desde una sola operación (en parte porque C y FORTRAN no tienen tuplas nativas). Hasta hace poco, los compiladores no han sido excelentes en el tipo de localización de optimización que les permitiría plegar dos operaciones en una sola instrucción.

Si nos fijamos en el tipo de trabajo aritmético-pesado para el que se han optimizado los procesadores , tiende a no preocuparse por los residuos. Los grandes ejemplos son la FFT y la multiplicación de matrices para el álgebra lineal. Es por eso que los procesadores tienden a tener instrucciones de acumulación múltiple e instrucciones SIMD.

    
respondido por el pjc50

Lea otras preguntas en las etiquetas