ES2934513T3 - Sistemas y métodos para omitir operaciones matriciales intrascendentes - Google Patents

Sistemas y métodos para omitir operaciones matriciales intrascendentes Download PDF

Info

Publication number
ES2934513T3
ES2934513T3 ES20164786T ES20164786T ES2934513T3 ES 2934513 T3 ES2934513 T3 ES 2934513T3 ES 20164786 T ES20164786 T ES 20164786T ES 20164786 T ES20164786 T ES 20164786T ES 2934513 T3 ES2934513 T3 ES 2934513T3
Authority
ES
Spain
Prior art keywords
instruction
processor
zero
matrix
source
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
ES20164786T
Other languages
English (en)
Inventor
Elmoustapha Ould-Ahmed-Vall
William Rash
Subramaniam Maiyuran
Varghese George
Rajesh Sankaran
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Application granted granted Critical
Publication of ES2934513T3 publication Critical patent/ES2934513T3/es
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30069Instruction skipping instructions, e.g. SKIP
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/52Multiplying; Dividing
    • G06F7/523Multiplying only
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30021Compare instructions, e.g. Greater-Than, Equal-To, MINMAX
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • G06F9/30038Instructions to perform operations on packed data, e.g. vector, tile or matrix operations using a mask
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30083Power or thermal control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Computing Systems (AREA)
  • Advance Control (AREA)

Abstract

Las realizaciones descritas se refieren a sistemas y métodos para omitir operaciones matriciales intrascendentes. En un ejemplo, un procesador incluye un circuito de decodificación para decodificar una instrucción que tiene campos para especificar un código de operación y ubicaciones de matrices de primera fuente, segunda fuente y destino, indicando el código de operación que el procesador debe multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con los contenidos anteriores de un elemento correspondiente en la fila M y la columna N de la matriz de destino, el procesador para omitir las multiplicaciones que, en función de los valores detectados de los multiplicandos correspondientes, generaría resultados intrascendentes, programando circuitos para programar la ejecución de la instrucción; (Traducción automática con Google Translate, sin valor legal)

Description

DESCRIPCIÓN
Sistemas y métodos para omitir operaciones matriciales intrascendentes
Campo de la invención
El campo de la invención se refiere en general a la arquitectura de procesadores informáticos y, más específicamente, a sistemas y métodos para omitir operaciones matriciales intrascendentes.
Antecedentes
Las matrices son cada vez más importantes en muchas tareas informáticas, tales como el aprendizaje automático y otros procesamientos de datos en masa. El aprendizaje profundo es una clase de algoritmos de aprendizaje automático. Las arquitecturas de aprendizaje profundo, tales como las redes neuronales profundas, se han aplicado a campos que incluyen la visión por ordenador, el reconocimiento de habla, el procesamiento de lenguaje natural, el reconocimiento de audio, el filtrado de redes sociales, la traducción automática, la bioinformática y el diseño de fármacos.
La inferencia y el entrenamiento, dos herramientas usadas para el aprendizaje profundo, tienden a una aritmética de baja precisión. Maximizar la capacidad de proceso de los cálculos y algoritmos de aprendizaje profundo puede ayudar a satisfacer las necesidades de los procesadores de aprendizaje profundo, por ejemplo, aquellos que realizan un aprendizaje profundo en un centro de datos.
La multiplicación de matriz con matriz (también conocida como GEMM o Multiplicación de Matrices General) es una operación que requiere mucho cómputo común en los procesadores de hoy en día. El hardware especial para la multiplicación matricial (por ejemplo, GEMM) es una buena opción para mejorar los picos de cómputo (y la eficiencia energética) de ciertas aplicaciones, tales como el aprendizaje profundo.
Los aceleradores de hardware comunes hoy en día para las redes neuronales realizan principalmente la multiplicación matricial en un formato denso, sin considerar el hecho de que hay un gran porcentaje de ceros o valores cercanos a cero que se hayan en una (o ambas) matrices. Esto introduce un uso ineficiente de recursos de hardware (desperdiciando energía y ciclos de cómputo para generar productos intrascendentes). Los aceleradores de hardware para redes neuronales, tanto para entrenamiento como para inferencia, se esfuerzan por lograr las mejores cifras de desempeño bruto y los mejores valores de relación entre potencia y desempeño; aprovechar la dispersión nativa e inyectada en esas redes neuronales es una forma de ayudar a lograr esos fines.
El documento US2019042541A1 se refiere a la manipulación de matrices. Por ejemplo, un soporte de instrucciones para operaciones de producto escalar de matrices (teselas) incluye calcular un producto escalar de palabras con signo y acumular, en una palabra cuádruple, elementos de datos de un par de matrices. Adicionalmente, los elementos de datos de palabra cuádruple no acumulativos del par de matrices se establecen a cero.
El documento US 2019/065195 A1 se refiere a la inspección de datos durante la ejecución de instrucciones de programa. Por ejemplo, un método para una inspección de datos alineada incluye las etapas de recibir, por una unidad de carga/almacenamiento, una instrucción de carga y obtener, por un circuito de inspección que está acoplado a la unidad de carga/almacenamiento, datos especificados por la instrucción de carga. Las etapas adicionales incluyen determinar que los datos son iguales a cero y transmitir los datos y una señal de predicado a la unidad de carga/almacenamiento, en donde la señal de predicado indica que los datos son iguales a cero. Las etapas adicionales alternativas incluyen calcular un valor de predicado basándose en una comparación entre los datos y un valor umbral y transmitir los datos y el valor de predicado a la unidad de carga/almacenamiento, en donde el valor de predicado se afirma cuando los datos son menores que el valor umbral y se niega cuando los datos no son menores que el valor umbral.
Antecedentes
La presente invención se define en las reivindicaciones independientes. Las reivindicaciones dependientes definen realizaciones de la misma. Se debería considerar que cualquier "realización" o "ejemplo" que se divulgue en la siguiente descripción pero que no esté cubierto por las reivindicaciones se presenta solo con fines ilustrativos.
Breve descripción de los dibujos
La presente invención se ilustra, a modo de ejemplo y no de limitación, en las figuras de los dibujos adjuntos, en los que referencias semejantes indican elementos similares, y en los que:
la figura 1A ilustra una realización de teselas configuradas;
la figura 1B ilustra una realización de teselas configuradas;
la figura 2 ilustra varios ejemplos de almacenamiento de matriz;
la figura 3 ilustra una realización de un sistema que utiliza un acelerador de operaciones matriciales (de teselas); las figuras 4 y 5 muestran diferentes realizaciones de cómo se comparte memoria usando un acelerador de operaciones matriciales;
la figura 6 ilustra una realización de una operación de multiplicación-acumulación matricial usando teselas ("TMMA"); la figura 7 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada;
la figura 8 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada;
la figura 9 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada;
la figura 10 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada;
la figura 11 ilustra implementaciones de SIMD de tamaño potencia de dos en las que los acumuladores usan tamaños de entrada que son mayores que las entradas a los multiplicadores de acuerdo con una realización;
la figura 12 ilustra una realización de un sistema que utiliza una circuitería de operaciones matriciales;
la figura 13 ilustra una realización de una canalización de núcleo de procesador que soporta operaciones matriciales usando teselas;
la figura 14 ilustra una realización de una canalización de núcleo de procesador que soporta operaciones matriciales usando teselas;
la figura 15 ilustra un ejemplo de una matriz expresada en un formato ordenado por filas y en un formato ordenado por columnas;
la figura 16 ilustra un ejemplo de uso de matrices (teselas);
la figura 17 ilustra una realización de un método de uso de matrices (teselas);
la figura 18 ilustra un soporte para la configuración del uso de teselas de acuerdo con una realización;
la figura 19 ilustra una realización de una descripción de las matrices (teselas) a soportar;
las figuras 20(A)-(D) ilustran ejemplos de un registro o registros;
la figura 21A es un diagrama de bloques que ilustra la ejecución de una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones;
la figura 21B es un diagrama de bloques que ilustra la ejecución de una instrucción de multiplicación distinta de cero de matrices (TILENZMUL) de acuerdo con algunas realizaciones;
las figuras 21C-E son diagramas de bloques que ilustran la detección de multiplicaciones intrascendentes, de acuerdo con algunas realizaciones;
la figura 21C es un diagrama de bloques que ilustra la detección de multiplicandos cercanos a cero, de acuerdo con algunas realizaciones;
la figura 21D es un diagrama de bloques que ilustra la detección de multiplicandos cerca de un valor constante, de acuerdo con algunas realizaciones;
la figura 21E es un diagrama de bloques que ilustra la detección de multiplicandos cerca de un valor medio, de acuerdo con algunas realizaciones;
la figura 22A es un diagrama de bloques que ilustra una circuitería de ejecución para realizar una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones;
la figura 22B es un diagrama de bloques que ilustra una circuitería de ejecución para realizar una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones;
la figura 22C es un diagrama de bloques que ilustra una realización de una compresión matricial;
la figura 23 ilustra una realización de un procesador que ejecuta una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones;
la figura 24 es un diagrama de bloques que ilustra un formato de una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones;
las figuras 25A-25B son diagramas de bloques que ilustran un formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción del mismo de acuerdo con realizaciones;
la figura 25A es un diagrama de bloques que ilustra un formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción de clase A del mismo de acuerdo con realizaciones;
la figura 25B es un diagrama de bloques que ilustra el formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción de clase B del mismo de acuerdo con realizaciones;
la figura 26A es un diagrama de bloques que ilustra un formato de instrucción apto para vectores de carácter específico ilustrativo de acuerdo con realizaciones;
la figura 26B es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico que constituyen el campo de código de operación completo de acuerdo con una realización; la figura 26C es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico que constituyen el campo de índice de registro de acuerdo con una realización;
la figura 26D es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico que constituyen el campo de operación de aumento de acuerdo con una realización;
la figura 27 es un diagrama de bloques de una arquitectura de registro de acuerdo con una realización;
la figura 28A es un diagrama de bloques que ilustra tanto una canalización en orden ilustrativa como una canalización de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativa de acuerdo con realizaciones;
la figura 28B es un diagrama de bloques que ilustra tanto una realización ilustrativa de un núcleo de arquitectura en orden como un núcleo de arquitectura de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativo a incluir en un procesador de acuerdo con realizaciones;
las figuras 29A-B ilustran un diagrama de bloques de una arquitectura de núcleo en orden ilustrativa más específica, cuyo núcleo sería uno de varios bloques lógicos (incluyendo otros núcleos del mismo tipo y/o de diferentes tipos) en un chip;
la figura 29A es un diagrama de bloques de un único núcleo de procesador, junto con su conexión a la red de interconexión integrada en pastilla y con su subconjunto local de la memoria caché de nivel 2 (L2), de acuerdo con realizaciones;
la figura 29B es una vista ampliada de parte del núcleo de procesador en la figura 29A de acuerdo con realizaciones; la figura 30 es un diagrama de bloques de un procesador que puede tener más de un núcleo, puede tener un controlador de memoria integrado y puede tener gráficos integrados de acuerdo con realizaciones;
las figuras 31-34 son diagramas de bloques de arquitecturas de ordenador ilustrativas;
la figura 31 muestra un diagrama de bloques de un sistema de acuerdo con una realización de la presente invención; la figura 32 es un diagrama de bloques de un primer sistema ilustrativo más específico de acuerdo con una realización de la presente invención;
la figura 33 es un diagrama de bloques de un segundo sistema ilustrativo más específico de acuerdo con una realización de la presente invención;
la figura 34 es un diagrama de bloques de un sistema en un chip (SoC) de acuerdo con una realización de la presente invención; y
la figura 35 es un diagrama de bloques que contrapone el uso de un convertidor de instrucciones de software para convertir instrucciones binarias en un conjunto de instrucciones de origen en instrucciones binarias en un conjunto de instrucciones de destino de acuerdo con realizaciones.
Descripción detallada
En la siguiente descripción, se exponen numerosos detalles específicos. Sin embargo, se entiende que las realizaciones se pueden poner en práctica sin estos detalles específicos. En otros casos, no se han mostrado con detalle circuitos, estructuras y técnicas bien conocidos con el fin de no complicar la comprensión de esta descripción.
Las referencias en la memoria descriptiva a "una realización", "una realización", "una realización de ejemplo" y similares indican que la realización descrita puede incluir un rasgo, estructura o característica particular, pero no puede no ser necesario que cada realización incluya el rasgo, estructura o característica particular. Además, tales expresiones no hacen referencia necesariamente a la misma realización. Además, cuando un rasgo, estructura o característica particular se describe en conexión con una realización, se afirma que está dentro del conocimiento de un experto en la materia afectar a tal rasgo, estructura o característica en conexión con otras realizaciones, ya se describa explícitamente o no.
En muchos procesadores de uso generalizado, el manejo de matrices es una tarea difícil y/o exigente en cuanto a instrucciones. Por ejemplo, las filas de una matriz se podrían colocar en una pluralidad de registros de datos empaquetados (por ejemplo, de SIMD o de vector) y entonces operarse sobre las mismas de forma individual. Por ejemplo, sumar dos matrices 8 x 2 puede requerir una carga o recopilación en cuatro registros de datos empaquetados dependiendo de los tamaños de datos. Entonces se realiza una primera suma de registros de datos empaquetados correspondientes a una primera fila a partir de cada matriz y se realiza una segunda suma de registros de datos empaquetados correspondientes a una segunda fila a partir de cada matriz. Entonces, los registros de datos empaquetados resultantes se dispersan de vuelta a la memoria. Aunque este escenario puede ser aceptable para matrices pequeñas, a menudo no lo es con matrices más grandes.
Análisis
En el presente documento se describen mecanismos para soportar operaciones matriciales en hardware informático, tales como unidades centrales de procesamiento (CPU), unidades de procesamiento gráfico (GPU) y aceleradores. Las operaciones matriciales utilizan estructuras de datos bidimensionales (2-D) que representan una o más regiones empaquetadas de memoria, tales como registros. De principio a fin de esta descripción, estas estructuras de datos 2-D se denominan teselas. Obsérvese que una matriz puede ser más pequeña que una tesela (usar menos que toda una tesela) o utilizar una pluralidad de teselas (la matriz es más grande que el tamaño de una cualquiera de las teselas). De principio a fin de la descripción, se usa vocabulario de matrices (teselas) para indicar operaciones realizadas usando teselas que afectan a una matriz; habitualmente no es relevante si esa matriz es o no más grande que una cualquiera de las teselas.
Se puede actuar sobre cada tesela mediante diferentes operaciones, tales como las que se detallan en el presente documento e incluyen, pero no se limitan a: multiplicación de matrices (teselas), adición de teselas, resta de teselas, diagonal de teselas, puesta a cero de teselas, transformada de teselas, producto escalar de teselas, radiodifusión de teselas, radiodifusión de filas de tesela, radiodifusión de columnas de tesela, multiplicación de teselas, multiplicación y acumulación de teselas, movimiento de teselas, etc. Adicionalmente, se puede usar un soporte para operadores tal como el uso de una escala y/o sesgo con estas operaciones o en apoyo de aplicaciones no numéricas en el futuro, por ejemplo, "memoria local" de OpenCL, compresión/descompresión de datos, etc. En el presente documento también se describen instrucciones para realizar instrucciones de multiplicación-acumulación fusionada distinta de cero de matrices (teselas) (TILENZFMA) y de multiplicación distinta de cero de matrices (teselas) (TILEMUL).
Porciones de almacenamiento (tales como memoria (no volátil y volátil), registros, caché, etc.) se disponen en teselas de diferentes dimensiones horizontales y verticales. Por ejemplo, una tesela puede tener una dimensión horizontal de 4 (por ejemplo, cuatro filas de una matriz) y una dimensión vertical de 8 (por ejemplo, 8 columnas de la matriz). Habitualmente, la dimensión horizontal está relacionada con tamaños de elemento (por ejemplo, 2, 4, 8, 16, 32, 64, 128 bits, etc.). Se pueden soportar múltiples tipos de datos (coma flotante de precisión simple, coma flotante de precisión doble, número entero, etc.).
Uso ilustrativo de teselas configuradas
En algunas realizaciones, se pueden configurar parámetros de tesela. Por ejemplo, una tesela dada se puede configurar para proporcionar opciones de tesela. Las opciones de tesela ilustrativas incluyen, pero no se limitan a: un número de filas de la tesela, un número de columnas de la tesela, si la tesela es VÁLIDA y si la tesela consiste en un PAR de teselas de igual tamaño.
La figura 1A ilustra una realización de teselas configuradas. Como se muestra, 4 kB de la memoria de aplicación 102 tienen almacenados, en los mismos, 4 títulos de 1 kB, la tesela t0 104, la tesela t1 106, la tesela t2 108 y la tesela t3 110. En este ejemplo, las 4 teselas no consisten en pares y cada una tiene elementos dispuestos en filas y columnas. La tesela t0 104 y la tesela t1 106 tienen K filas y N columnas de elementos de 4 bytes (por ejemplo, datos de precisión simple), en donde K es igual a 8 y N = 32. La tesela t2108 y la tesela t3 110 tienen K filas y N/2 columnas de elementos de 8 bytes (por ejemplo, datos de precisión doble). Debido a que los operandos de precisión doble tienen el doble de anchura que los de precisión simple, esta configuración es coherente con una paleta, usada para proporcionar opciones de tesela, que suministra al menos 4 nombres con un almacenamiento total de al menos 4 kB. Durante el funcionamiento, las teselas se pueden cargar de y almacenar en memoria usando operaciones de carga y de almacenamiento. Dependiendo del esquema de codificación de instrucciones usado, varía la cantidad de memoria de aplicación disponible, así como el tamaño, el número y la configuración de las teselas disponibles.
La figura 1B ilustra una realización de teselas configuradas. Como se muestra, 4 kB de la memoria de aplicación 122 tienen almacenados, en los mismos, 2 pares de títulos de 1 kB, siendo el primer par la tesela t4L 124 y la tesela t4R 126, y siendo el segundo par la tesela t5L 128 y la tesela t5R 130. Como se muestra, los pares de teselas se dividen en una tesela izquierda y una tesela derecha. En otras realizaciones, el par de teselas se divide en una tesela par y una tesela impar. En este ejemplo, cada una de las 4 teselas tiene elementos dispuestos en filas y columnas. La tesela t4L 124 y la tesela t4R 126 tienen K filas y N columnas de elementos de 4 bytes (por ejemplo, datos de coma flotante de precisión simple), en donde K es igual a 8 y N es igual a 32. La tesela t5L 128 y la tesela t5R 130 tienen K filas y N/2 columnas de elementos de 8 bytes (por ejemplo, datos de coma flotante de precisión doble). Debido a que los operandos de precisión doble tienen el doble de anchura que los de precisión simple, esta configuración es coherente con una paleta, usada para proporcionar opciones de tesela, que suministra al menos 2 nombres con un almacenamiento total de al menos 4 kB. Las cuatro teselas de la figura 1A usan 4 nombres, cada uno nombrando una tesela de 1 kB, mientras que los 2 pares de teselas en la figura 1B pueden usar 2 nombres para especificar las teselas emparejadas. En algunas realizaciones, las instrucciones de tesela aceptan un nombre de una tesela emparejada como un operando. Durante el funcionamiento, las teselas se pueden cargar de y almacenar en memoria usando operaciones de carga y de almacenamiento. Dependiendo del esquema de codificación de instrucciones usado, varía la cantidad de memoria de aplicación disponible, así como el tamaño, el número y la configuración de las teselas disponibles.
En algunas realizaciones, se pueden definir parámetros de tesela. Por ejemplo, se usa una "paleta" para proporcionar opciones de tesela. Las opciones ilustrativas incluyen, pero no se limitan a: el número de nombres de tesela, el número de bytes en una fila de almacenamiento, el número de filas y columnas en una tesela, etc. Por ejemplo, una "altura" (número de filas) máxima de una tesela se puede definir como:
Filas máximas de teselas = almacenamiento estructurado / (número de nombres de paleta * número de bytes por fila).
En ese sentido, una aplicación se puede escribir de tal forma que un uso fijo de nombres será capaz de aprovechar los diferentes tamaños de almacenamiento en todas las implementaciones.
La configuración de teselas se hace usando una instrucción de configuración de teselas ("TILECONFIG"), en donde se define un uso de teselas particular en una paleta seleccionada. Esta declaración incluye el número de nombres de tesela a usar, el número solicitado de filas y columnas por nombre (tesela) y, en algunas realizaciones, el tipo de datos solicitado de cada tesela. En algunas realizaciones, se realizan comprobaciones de coherencia durante la ejecución de una instrucción TILECONFIG para determinar que esta coincide con las restricciones de la entrada de paleta.
Tipos de almacenamiento de tesela ilustrativos
La figura 2 ilustra varios ejemplos de almacenamiento de matriz. En (A), una tesela se almacena en memoria. Como se muestra, cada "fila" consiste en cuatro elementos de datos empaquetados. Para llegar a la siguiente "fila", se usa un valor de zancada. Obsérvese que se pueden almacenar filas de forma consecutiva en memoria. Los accesos a memoria con zancada permiten el acceso de una fila a la siguiente cuando el almacenamiento de teselas no correlaciona la anchura de fila de matriz de memoria subyacente.
Las cargas de tesela desde memoria y los almacenamientos en memoria son habitualmente accesos con zancada desde la memoria de aplicación a filas empaquetadas de datos. Las instrucciones ilustrativas TILELOAD y TILESTORE, u otras referencias de instrucción a la memoria de aplicación como un operando de TESELA en instrucciones de operación de carga son, en algunas realizaciones, reiniciables para manejar (hasta) 2 * filas de fallos de página, excepciones de coma flotante sin enmascarar y/o interrupciones por instrucción.
En (B), una matriz se almacena en una tesela compuesta por una pluralidad de registros tales como registros de datos empaquetados (una única instrucción, múltiples datos (SIMD) o registros de vector). En este ejemplo, la tesela se superpone sobre tres registros físicos. Habitualmente, se usan registros consecutivos, sin embargo, este no tiene que ser el caso.
En (C), una matriz se almacena en una tesela en almacenamiento no de registro accesible por un circuito de multiplicación-acumulación fusionada (FMA) usado en operaciones de teselas. Este almacenamiento puede estar dentro de un FMA o ser adyacente al mismo. Adicionalmente, en algunas realizaciones, que se analizan a continuación, el almacenamiento puede ser para un elemento de datos y no para una fila o tesela completa.
Los parámetros soportados para la arquitectura de TMMA se notifican a través de CPUID. En algunas realizaciones, la lista de información incluye una altura máxima y una dimensión de SIMD máxima. Configurar la arquitectura de TMMA requiere especificar las dimensiones para cada tesela, el tamaño de elemento para cada tesela y el identificador de paleta. Esta configuración se hace ejecutando la instrucción TILECONFIG.
Una ejecución con éxito de una instrucción TILECONFIG habilita operadores de TESELA subsiguientes. Una instrucción TILERELEASEALL borra la configuración de teselas y deshabilita las operaciones de TESELA (hasta que se ejecuta la instrucción TILECONFIG siguiente). En algunas realizaciones, se usan XSAVE, XSTORE, etc., en una conmutación de contexto usando teselas. En algunas realizaciones, se usan 2 bits XCR0 en XSAVE, uno para metadatos de TILECONFIG y un bit correspondiente a datos de cabida útil de tesela reales.
TILECONFIG no solo configura el uso de teselas, sino que también establece una variable de estado que indica que el programa está en una región de código con teselas configuradas. Una implementación puede enumerar restricciones sobre otras instrucciones que se pueden usar con una región de tesela, tal como no usar un conjunto de registros existente, etc.
Salir de una región de tesela se hace habitualmente con la instrucción TILERELEASEALL. Esta no acepta parámetro alguno e invalida rápidamente todas las teselas (lo que indica que los datos ya no necesitan guardado ni restablecimiento alguno) y borra el estado interno correspondiente a estar en una región de tesela.
En algunas realizaciones, las operaciones de teselas pondrán a cero cualquier fila y cualquier columna más allá de las dimensiones especificadas por la configuración de teselas. Por ejemplo, las operaciones de teselas pondrán a cero los datos más allá del número configurado de columnas (teniendo en cuenta el tamaño de los elementos) a medida que se escribe cada fila. Por ejemplo, con filas de 64 bytes y una tesela configurada con 10 filas y 12 columnas, una operación que escribe elementos FP32 escribiría cada una de las primeras 10 filas con 12 * 4 bytes con datos de salida/resultado y pondría a cero los 4 * 4 bytes restantes en cada fila. Las operaciones de teselas también ponen a cero por completo cualquier fila después de las primeras 10 filas configuradas. Cuando se usa una tesela de 1 K con filas de 64 bytes, habría 16 filas, por lo que, en este ejemplo, las últimas 6 filas también se pondrían a cero.
En algunas realizaciones, una instrucción de restablecimiento de contexto (por ejemplo, XRSTOR), cuando se cargan datos, impone que los datos más allá de las filas configuradas para una tesela se mantengan como cero. Si no hay configuración válida alguna, todas las filas se ponen a cero. XRSTOR de datos de tesela puede cargar basura en las columnas más allá de las configuradas. No debería ser posible que XRSTOR borre más allá del número de columnas configuradas debido a que no hay una anchura de elemento asociada con la configuración de teselas.
Un guardado de contexto (por ejemplo, XSAVE) expone toda el área de almacenamiento de TESELA cuando se escribe la misma en memoria. Si XRSTOR cargó datos basura en la parte más a la derecha de una tesela, esos datos serán guardados por XSAVE. XSAVE escribirá ceros para las filas más allá del número especificado para cada tesela.
En algunas realizaciones, las instrucciones de tesela se pueden reiniciar. Las operaciones que acceden a memoria permiten reiniciar después de fallos de página. Las instrucciones computacionales que se ocupan de operaciones de coma flotante también permiten excepciones de coma flotante sin enmascarar, con el enmascaramiento de las excepciones controlado por un registro de control y/o de estado.
Para soportar instrucciones de reinicio después de estos sucesos, las instrucciones almacenan información en los registros de inicio detallados a continuación.
Sistemas de operaciones matriciales (de teselas)
Soporte de hardware ilustrativo
La figura 3 ilustra una realización de un sistema que utiliza un acelerador de operaciones matriciales (de teselas). En esta ilustración, un sistema de procesamiento/procesador de anfitrión 301 comunica las órdenes 311 (por ejemplo, operaciones de manipulación de matrices tales como operaciones aritméticas o de manipulación de matrices, u operaciones de carga y de almacenamiento) a un acelerador de operaciones matriciales 307. Sin embargo, esto se muestra de esta forma solo con fines de análisis. Como se detalla más adelante, este acelerador 307 puede ser una parte de un núcleo de procesamiento. Habitualmente, las órdenes 311 que son instrucciones de operador de manipulación de teselas se referirán a teselas como formato de registro-registro ("reg-reg") o de registro-memoria ("reg-mem"). Otras órdenes, tales como TILESTORE, TILELOAD, TILECONFIG, etc., no realizan operaciones de datos sobre una tesela. Las órdenes pueden ser instrucciones descodificadas (por ejemplo, microoperaciones) o macroinstrucciones para que las maneje el acelerador 307.
En este ejemplo, una interfaz de memoria coherente 303 se acopla al sistema de procesamiento/procesador de anfitrión 301 y al acelerador de operaciones matriciales 307 de tal forma que estos puedan compartir memoria. Las figuras 4 y 5 muestran diferentes realizaciones de cómo se comparte memoria usando un acelerador de operaciones matriciales. Como se muestra en la figura 4, el procesador de anfitrión 401 y la circuitería de acelerador de operaciones matriciales 405 comparten la misma memoria 403. La figura 5 ilustra una realización en la que el procesador principal 501 y el acelerador de operaciones matriciales 505 no comparten memoria, pero pueden acceder uno a la memoria del otro. Por ejemplo, el procesador 501 puede acceder a la memoria de teselas 507 y utilizar su memoria de anfitrión 503 de forma normal. De forma similar, el acelerador de operaciones matriciales 505 puede acceder a la memoria de anfitrión 503 pero, más habitualmente, usa su propia memoria 507. Obsérvese que estas memorias pueden ser de diferentes tipos.
En algunas realizaciones, las teselas se soportan usando una superposición sobre registros físicos. Por ejemplo, una tesela puede utilizar 16 registros de 1.024 bits, 32 registros de 512 bits, etc., dependiendo de la implementación. En algunas realizaciones, las operaciones matriciales utilizan estructuras de datos bidimensionales (2-D) que representan una o más regiones empaquetadas de memoria, tales como registros. De principio a fin de esta descripción, estas estructuras de datos 2-D se denominan teselas o registros de tesela.
En algunas realizaciones, el acelerador de operaciones matriciales 307 incluye una pluralidad de los FMA 309 acoplados a las memorias intermedias de datos 305 (en algunas implementaciones, una o más de estas memorias intermedias 305 se almacenan en los FMA de la cuadrícula como se muestra). Las memorias intermedias de datos 305 almacenan teselas cargadas desde memoria y/o teselas a almacenar en memoria (por ejemplo, usando una instrucción de carga de teselas o de almacenamiento de teselas). Las memorias intermedias de datos pueden ser, por ejemplo, una pluralidad de registros. Habitualmente, estos FMA se disponen como una cuadrícula de FMA 309 encadenados que son capaces de leer y de escribir teselas. En este ejemplo, el acelerador de operaciones matriciales 307 ha de realizar una operación de multiplicación matricial usando las teselas T0, T1 y T2. Al menos una de las teselas se aloja en la cuadrícula de FMA 309. En algunas realizaciones, todas las teselas en una operación se almacenan en la cuadrícula de FMA 309. En otras realizaciones, solo se almacena un subconjunto en la cuadrícula de FMA 309. Como se muestra, T1 está alojado y T0 y T2 no lo están. Obsérvese que A, B y C se refieren a las matrices de estas teselas que pueden ocupar, o no, todo el espacio de la tesela.
La figura 6 ilustra una realización de una operación de multiplicación-acumulación matricial usando teselas (''TMMA").
El número de filas en la matriz (la TESELA A 601) coincide con el número de FMA en serie (encadenados) que comprenden la latencia del cálculo. Una implementación es libre de recircular en una cuadrícula de una altura menor, pero el cálculo sigue siendo el mismo.
El vector de origen/destino proviene de una tesela de N filas (la TESELA C 605) y la cuadrícula de los FMA 611 realiza N operaciones de matriz-vector que dan como resultado una instrucción completa que realiza una multiplicación matricial de teselas. La tesela B 603 es el otro origen de vector y suministra términos de "radiodifusión" a los FMA en cada fase.
Durante el funcionamiento, en algunas realizaciones, los elementos de la matriz B (almacenados en una tesela B 603) se diseminan por toda la cuadrícula rectangular de los FMA. La matriz B (almacenada en la tesela A 601) tiene sus elementos de una fila transformados para coincidir con la dimensión de columna de la cuadrícula rectangular de los FMA. En cada FMA de la cuadrícula, un elemento de A y B se multiplica y se suma al sumando entrante (desde arriba en la figura) y la suma saliente se pasa a la fila siguiente de los FMA (o al resultado final).
La latencia de un único escalón es proporcional a K (la altura de fila de la matriz B) y las TMMA dependientes suelen tener suficientes filas de origen-destino (o bien en una única tesela o bien por toda la tesela) para ocultar esa latencia. Una implementación también puede dividir la dimensión de SIMD (elemento de datos empaquetado) M (la altura de fila de la matriz A) a través de escalones de tiempo, pero esto simplemente cambia la constante por la que se multiplica K. Cuando un programa especifica un K más pequeño que el máximo enumerado por el TMACC, una implementación es libre de implementar esto con "enmascaramiento" o "salidas tempranas".
La latencia de un TMMA completo es proporcional a N * K. La tasa de repetición es proporcional a N. *El número de MAC por instrucción TMMA es N * K * M.
La figura 7 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada. En particular, esto ilustra una circuitería de ejecución de una iteración de una posición de elemento de datos empaquetado del destino. En esta realización, el multiplicaciónacumulación fusionada encadenada está operando sobre unos orígenes con signo en donde el acumulador tiene 2 veces el tamaño de datos de entrada.
Un primer origen con signo (el origen 1701) y un segundo origen con signo (el origen 2703) tienen, cada uno, cuatro elementos de datos empaquetados. Cada uno de estos elementos de datos empaquetados almacena datos con signo, tales como datos de coma flotante. Un tercer origen con signo (el origen 3 709) tiene dos elementos de datos empaquetados, cada uno de los cuales almacena datos con signo. Los tamaños del primer y el segundo orígenes con signo 701 y 703 son la mitad de los del tercer origen con signo (valor inicial o resultado previo) 709. Por ejemplo, el primer y el segundo orígenes con signo 701 y 703 podrían tener elementos de datos empaquetados de 32 bits (por ejemplo, coma flotante de precisión simple) mientras que el tercer origen con signo 709 podría tener elementos de datos empaquetados de 64 bits (por ejemplo, coma flotante de precisión doble).
En esta ilustración, solo se muestran las dos posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 701 y 703 y la posición de elemento de datos empaquetado más significativa del tercer origen con signo 709. Por supuesto, también se procesarían las otras posiciones de elemento de datos empaquetado.
Como se ilustra, los elementos de datos empaquetados se procesan en pares. Por ejemplo, los datos de las posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 701 y 703 se multiplican usando un circuito de multiplicador 705, y los datos a partir de las segundas posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 701 y 703 se multiplican usando un circuito de multiplicador 707. En algunas realizaciones, estos circuitos de multiplicador 705 y 707 se reutilizan para otras posiciones de elemento de datos empaquetado. En otras realizaciones, se usan circuitos de multiplicador adicionales de tal modo que los elementos de datos empaquetados se procesen en paralelo. En algunos contextos, se realiza una ejecución en paralelo usando carriles que tienen el tamaño del tercer origen con signo 709. Los resultados de cada una de las multiplicaciones se suman usando la circuitería de suma 711.
El resultado de la suma de los resultados de las multiplicaciones se suma a los datos a partir de la posición de elemento de datos empaquetado más significativa del origen con signo 3 709 (usando un sumador 713 diferente o el mismo sumador 711).
Por último, el resultado de la segunda suma o bien se almacena en el destino con signo 715 en una posición de elemento de datos empaquetado que corresponde a la posición de elemento de datos empaquetado usada desde el tercer origen con signo 709 o bien se pasa a la iteración siguiente, si hay una. En algunas realizaciones, se aplica una máscara de escritura a este almacenamiento de tal forma que si se establece una máscara de escritura (bit) correspondiente, tiene lugar el almacenamiento y, si no se establece, no tiene lugar el almacenamiento.
La figura 8 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada. En particular, esto ilustra una circuitería de ejecución de una iteración de una posición de elemento de datos empaquetado del destino. En esta realización, el multiplicaciónacumulación fusionada encadenada está operando sobre unos orígenes con signo en donde el acumulador tiene 2 veces el tamaño de datos de entrada.
Un primer origen con signo (el origen 1801) y un segundo origen con signo (el origen 2803) tienen, cada uno, cuatro elementos de datos empaquetados. Cada uno de estos elementos de datos empaquetados almacena datos con signo, tales como datos enteros. Un tercer origen con signo (el origen 3809) tiene dos elementos de datos empaquetados, cada uno de los cuales almacena datos con signo. Los tamaños del primer y el segundo orígenes con signo 801 y 803 son la mitad de los del tercer origen con signo 809. Por ejemplo, el primer y el segundo orígenes con signo 801 y 803 podrían tener elementos de datos empaquetados de 32 bits (por ejemplo, coma flotante de precisión simple), el tercer origen con signo 809 podría tener elementos de datos empaquetados de 64 bits (por ejemplo, coma flotante de precisión doble).
En esta ilustración, solo se muestran las dos posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 801 y 803 y la posición de elemento de datos empaquetado más significativa del tercer origen con signo 809. Por supuesto, también se procesarían las otras posiciones de elemento de datos empaquetado.
Como se ilustra, los elementos de datos empaquetados se procesan en pares. Por ejemplo, los datos de las posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 801 y 803 se multiplican usando un circuito de multiplicador 805, y los datos a partir de las segundas posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes con signo 801 y 803 se multiplican usando un circuito de multiplicador 807. En algunas realizaciones, estos circuitos de multiplicador 805 y 807 se reutilizan para otras posiciones de elemento de datos empaquetado. En otras realizaciones, se usan circuitos de multiplicador adicionales de tal modo que los elementos de datos empaquetados se procesen en paralelo. En algunos contextos, se realiza una ejecución en paralelo usando carriles que tienen el tamaño del tercer origen con signo (valor inicial o resultado de iteración previo) 809. Los resultados de cada una de las multiplicaciones se suman al tercer origen con signo 809 usando la circuitería de suma/saturación 813.
La circuitería de suma/saturación (acumulador) 813 conserva un signo de un operando cuando la suma da como resultado un valor que es demasiado grande. En particular, una evaluación de saturación tiene lugar sobre el resultado de precisión infinita entre la adición multidireccional y la escritura en el destino o la iteración siguiente. Cuando el acumulador 813 es de coma flotante y los términos de entrada son enteros, la suma de productos y el valor de entrada de acumulador de coma flotante se convierten en valores de precisión infinita (números de coma fija de cientos de bits), se realiza la suma de los resultados de multiplicación y la tercera entrada y se realiza un único redondeo al tipo de acumulador real.
Una saturación sin signo significa que los valores de salida están limitados a un número sin signo máximo para esa anchura de elemento (todo unos). Una saturación con signo significa que un valor está limitado a estar en el rango entre un número negativo mínimo y un número positivo máximo para esa anchura de elemento (para bytes, por ejemplo, el rango es de -128 (= -2A7) a 127 (= 2A7 - 1)).
El resultado de la comprobación de suma y de saturación se almacena en el resultado con signo 815 en una posición de elemento de datos empaquetado que corresponde a la posición de elemento de datos empaquetado usada desde el tercer origen con signo 809 o bien se pasa a la iteración siguiente, si hay una. En algunas realizaciones, se aplica una máscara de escritura a este almacenamiento de tal forma que si se establece una máscara de escritura (bit) correspondiente, tiene lugar el almacenamiento y, si no se establece, no tiene lugar el almacenamiento.
La figura 9 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada. En particular, esto ilustra una circuitería de ejecución de una iteración de una posición de elemento de datos empaquetado del destino. En esta realización, el multiplicaciónacumulación fusionada encadenada está operando sobre un origen con signo y un origen sin signo en donde el acumulador tiene 4 veces el tamaño de datos de entrada.
Un primer origen con signo (el origen 1901) y un segundo origen sin signo (el origen 2903) tienen, cada uno, cuatro elementos de datos empaquetados. Cada uno de estos elementos de datos empaquetados tiene datos, tales como datos de coma flotante o enteros. Un tercer origen con signo (valor inicial o resultado 915) tiene un elemento de datos empaquetado que almacena datos con signo. Los tamaños del primer y el segundo orígenes 901 y 903 son una cuarta parte de los del tercer origen con signo 915. Por ejemplo, el primer y el segundo orígenes 901 y 903 podrían tener elementos de datos empaquetados de 16 bits (por ejemplo, palabra) y el tercer origen con signo 915 podría tener elementos de datos empaquetados de 64 bits (por ejemplo, coma flotante de precisión doble o número entero de 64 bits).
En esta ilustración, se muestran las cuatro posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes 901 y 903 y la posición de elemento de datos empaquetado más significativa del tercer origen con signo 915. Por supuesto, también se procesarían otras posiciones de elemento de datos empaquetado, de haber alguna.
Como se ilustra, los elementos de datos empaquetados se procesan en cuadrupletes. Por ejemplo, los datos de las posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes 901 y 903 se multiplican usando un circuito de multiplicador 905, datos a partir de segundas posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes 901 y 903 se multiplican usando un circuito de multiplicador 907, datos a partir de terceras posiciones de elemento de datos empaquetado más significativas del primer y el segundo orígenes 901 y 903 se multiplican usando un circuito de multiplicador 909, y datos a partir de las posiciones de elemento de datos empaquetado menos significativas del primer y el segundo orígenes 901 y 903 se multiplican usando un circuito de multiplicador 911. En algunas realizaciones, los elementos de datos empaquetados con signo del primer origen 901 se amplían con signo y los elementos de datos empaquetados sin signo del segundo origen 903 se amplían con ceros antes de las multiplicaciones.
En algunas realizaciones, estos circuitos de multiplicador 905-911 se reutilizan para otras posiciones de elemento de datos empaquetado. En otras realizaciones, se usan circuitos de multiplicador adicionales de tal modo que los elementos de datos empaquetados se procesen en paralelo. En algunos contextos, se realiza una ejecución en paralelo usando carriles que tienen el tamaño del tercer origen con signo 915. Los resultados de cada una de las multiplicaciones se suman usando la circuitería de suma 913.
El resultado de la suma de los resultados de las multiplicaciones se suma a los datos a partir de la posición de elemento de datos empaquetado más significativa del origen con signo 3 915 (usando un sumador 917 diferente o el mismo sumador 913).
Por último, el resultado 919 de la segunda suma o bien se almacena en el destino con signo en una posición de elemento de datos empaquetado que corresponde a la posición de elemento de datos empaquetado usada desde el tercer origen con signo 915 o bien se pasa a la iteración siguiente. En algunas realizaciones, se aplica una máscara de escritura a este almacenamiento de tal forma que si se establece una máscara de escritura (bit) correspondiente, tiene lugar el almacenamiento y, si no se establece, no tiene lugar el almacenamiento.
La figura 10 ilustra una realización de un subconjunto de la ejecución de una iteración de una instrucción de multiplicación-acumulación fusionada encadenada. En particular, esto ilustra una circuitería de ejecución de una iteración de una posición de elemento de datos empaquetado del destino. En esta realización, el multiplicaciónacumulación fusionada encadenada está operando sobre un origen con signo y un origen sin signo en donde el acumulador tiene 4 veces el tamaño de datos de entrada.
Un primer origen con signo 1001 y un segundo origen sin signo 1003 tienen, cada uno, cuatro elementos de datos empaquetados. Cada uno de estos elementos de datos empaquetados almacena datos, tales como datos de coma flotante o enteros. Un tercer origen con signo 1015 (resultado inicial o previo) tiene un elemento de datos empaquetado que almacena datos con signo. Los tamaños del primer y el segundo orígenes son una cuarta parte de los del tercer origen con signo 1015 (resultado inicial o previo). Por ejemplo, el primer y el segundo orígenes podrían tener elementos de datos empaquetados de 16 bits (por ejemplo, palabra) y el tercer origen con signo 1015 (resultado inicial o previo) podría tener elementos de datos empaquetados de 64 bits (por ejemplo, coma flotante de precisión doble o número entero de 64 bits).
En esta ilustración, se muestran las cuatro posiciones de elemento de datos empaquetado más significativas del primer origen con signo 1001 y el segundo origen sin signo 1003 y la posición de elemento de datos empaquetado más significativa del tercer origen con signo 1015. Por supuesto, también se procesarían otras posiciones de elemento de datos empaquetado, de haber alguna.
Como se ilustra, los elementos de datos empaquetados se procesan en cuadrupletes. Por ejemplo, los datos de las posiciones de elemento de datos empaquetado más significativas del primer origen con signo 1001 y el segundo origen sin signo 1003 se multiplican usando un circuito de multiplicador 1005, datos a partir de segundas posiciones de elemento de datos empaquetado más significativas del primer origen con signo 1001 y el segundo origen sin signo 1003 se multiplican usando un circuito de multiplicador 1007, datos a partir de terceras posiciones de elemento de datos empaquetado más significativas del primer origen con signo 1001 y el segundo origen sin signo 1003 se multiplican usando un circuito de multiplicador 1009, y datos a partir de las posiciones de elemento de datos empaquetado menos significativas del primer origen con signo 1001 y el segundo origen sin signo 1003 se multiplican usando un circuito de multiplicador 1011. En algunas realizaciones, los elementos de datos empaquetados con signo del primer origen con signo 1001 se amplían con signo y los elementos de datos empaquetados sin signo del segundo origen sin signo 1003 se amplían con ceros antes de las multiplicaciones.
En algunas realizaciones, estos circuitos de multiplicador 1005-1011 se reutilizan para otras posiciones de elemento de datos empaquetado. En otras realizaciones, se usan circuitos de multiplicador adicionales de tal modo que los elementos de datos empaquetados se procesen en paralelo. En algunos contextos, se realiza una ejecución en paralelo usando carriles que tienen el tamaño del tercer origen con signo 1015 (resultado inicial o previo). El resultado de la suma de los resultados de las multiplicaciones se suma a los datos a partir de la posición de elemento de datos empaquetado más significativa del tercer origen con signo 1015 (resultado inicial o previo) usando la circuitería de sumador/saturación 1013.
La circuitería de suma/saturación (acumulador) 1013 conserva un signo de un operando cuando la suma da como resultado un valor que es demasiado grande o demasiado pequeño para una saturación con signo. En particular, una evaluación de saturación tiene lugar sobre el resultado de precisión infinita entre la adición multidireccional y la escritura en el destino. Cuando el acumulador 1013 es de coma flotante y los términos de entrada son enteros, la suma de productos y el valor de entrada de acumulador de coma flotante se convierten en valores de precisión infinita (números de coma fija de cientos de bits), se realiza la suma de los resultados de multiplicación y la tercera entrada y se realiza un único redondeo al tipo de acumulador real.
El resultado 1019 de la comprobación de suma y de saturación se almacena en el destino con signo en una posición de elemento de datos empaquetado que corresponde a la posición de elemento de datos empaquetado usada desde el tercer origen con signo 1015 (resultado inicial o previo) o se pasa a la iteración siguiente. En algunas realizaciones, se aplica una máscara de escritura a este almacenamiento de tal forma que si se establece una máscara de escritura (bit) correspondiente, tiene lugar el almacenamiento y, si no se establece, no tiene lugar el almacenamiento.
La figura 11 ilustra implementaciones de SIMD de tamaño potencia de dos en las que los acumuladores usan tamaños de entrada que son mayores que las entradas a los multiplicadores de acuerdo con una realización. Obsérvese que el origen (a los multiplicadores) y los valores de acumulador pueden ser valores con signo o sin signo. Para un acumulador que tiene unos tamaños de entrada 2X (en otras palabras, el valor de entrada de acumulador es el doble del tamaño de los tamaños de elemento de datos empaquetado de los orígenes), la tabla 1101 ilustra diferentes configuraciones. Para orígenes de tamaño de byte, el acumulador usa valores de palabra o de coma flotante de precisión mitad (HPFP) que tienen un tamaño de 16 bits. Para orígenes de tamaño de palabra, el acumulador usa valores de coma flotante de precisión simple (SPFP) o enteros de 32 bits que tienen un tamaño de 32 bits. Para orígenes de tamaño entero de 32 bits o de SPFP, el acumulador usa valores de coma flotante de precisión doble (DPFP) o enteros de 64 que tienen un tamaño de 64 bits.
Para un acumulador que tiene unos tamaños de entrada 4X (en otras palabras, el valor de entrada de acumulador es cuatro veces el tamaño de los tamaños de elemento de datos empaquetado de los orígenes), la tabla 1103 ilustra diferentes configuraciones. Para orígenes de tamaño de byte, el acumulador usa valores de coma flotante de precisión simple (SPFP) o enteros de 32 bits que tienen un tamaño de 32 bits. Para orígenes de tamaño de palabra, el acumulador usa valores de coma flotante de precisión doble (DPFP) o enteros de 64 bits que tienen un tamaño de 64 bits en algunas realizaciones.
Para un acumulador que tiene unos tamaños de entrada 8X (en otras palabras, el valor de entrada de acumulador es ocho veces el tamaño de los tamaños de elemento de datos empaquetado de los orígenes), la tabla 1105 ilustra una configuración. Para orígenes de tamaño de byte, el acumulador usa un número entero de 64 bits.
Como se ha sugerido anteriormente, una circuitería de operaciones matriciales se puede incluir en un núcleo o como un acelerador externo. La figura 12 ilustra una realización de un sistema que utiliza una circuitería de operaciones matriciales. En esta ilustración, múltiples entidades se acoplan con una interconexión de anillo 1245.
Una pluralidad de núcleos, el núcleo 0 1201, el núcleo 11203, el núcleo 2 1205 y el núcleo N 1207 proporcionan un soporte de instrucciones no basado en teselas. En algunas realizaciones, la circuitería de operaciones matriciales 1251 se proporciona en un núcleo 1203 y, en otras realizaciones, las circuiterías de operaciones matriciales 1211 y 1213 son accesibles en la interconexión de anillo 1245.
Adicionalmente, se proporcionan uno o más controladores de memoria 1223-1225 para comunicarse con la memoria 1233 y 1231 en nombre de los núcleos y/o la circuitería de operaciones matriciales.
La figura 13 ilustra una realización de una canalización de núcleo de procesador que soporta operaciones matriciales usando teselas. La circuitería de predicción de bifurcaciones y de descodificación 1303 realiza una predicción de bifurcaciones de instrucciones, una descodificación de instrucciones, y/o ambas, a partir de unas instrucciones almacenadas en el almacenamiento de instrucciones 1301. Por ejemplo, instrucciones detalladas en el presente documento se pueden almacenar en un almacenamiento de instrucciones. En algunas implementaciones, se usa una circuitería separada para la predicción de bifurcaciones y, en algunas realizaciones, al menos algunas instrucciones se descodifican en una o más microoperaciones, puntos de entrada de microcódigo, microinstrucciones, otras instrucciones u otras señales de control usando el microcódigo 1305. La circuitería de predicción de bifurcaciones y de descodificación 1303 se puede implementar usando diversos mecanismos diferentes. Los ejemplos de mecanismos adecuados incluyen, pero no se limitan a, tablas de consulta, implementaciones en hardware, matrices lógicas programables (PLA), memorias de solo lectura (ROM) de microcódigo, etc.
La circuitería de predicción de bifurcaciones y de descodificación 1303 se acopla a la circuitería de asignación/cambio de nombre 1307 que se acopla, en algunas realizaciones, a la circuitería de programador 1309. En algunas realizaciones, estos circuitos proporcionan funcionalidades de cambio de nombre de registro, de asignación de registro y/o de programación realizando uno o más de: 1) cambiar de nombre unos valores de operando lógico a valores de operando físico (por ejemplo, una tabla de alias de registro en algunas realizaciones), 2) asignar unos bits de estado y unos indicadores a la instrucción descodificada, y 3) programar la instrucción descodificada para su ejecución en la circuitería de ejecución fuera de una agrupación de instrucciones (por ejemplo, usando una estación de reserva en algunas realizaciones).
La circuitería de programador 1309 representa cualquier número de programadores diferentes, incluyendo estaciones de reservas, ventana de instrucciones central, etc. La circuitería de programador 1309 se acopla a, o incluye, un archivo o archivos de registro físico 1315. Cada uno del archivo o archivos de registro físico 1315 representa uno o más archivos de registro físico, unos diferentes de los cuales almacenan uno o más tipos de datos diferentes, tales como entero escalar, coma flotante escalar, entero empaquetado, coma flotante empaquetada, entero vectorial, coma flotante vectorial, estado (por ejemplo, un puntero de instrucción que es la dirección de la siguiente instrucción a ejecutar), teselas, etc. En una realización, el archivo o archivos de registro físico 1315 comprenden una circuitería de registros de vector, una circuitería de registros de máscara de escritura y una circuitería de registros de escalar. Estos circuitos de registro pueden proporcionar registros de vector arquitectónicos, registros de máscara de vector y registros de propósito general. El archivo o archivos de registro físico 1315 son solapados por un circuito de retiro 1317 para ilustrar diversas formas en las que se pueden implementar un cambio de nombre de registro y una ejecución fuera de orden (por ejemplo, usando una memoria intermedia o memorias intermedias de reordenación y un archivo o archivos de registro de retiro; usando un archivo o archivos futuros, una memoria o memorias de historial y un archivo o archivos de registro de retiro; usando correlaciones de registro y una agrupación de registros; etc.). El circuito de retiro 1317 y el archivo o archivos de registro físico 1315 se acoplan a la circuitería de ejecución 1311.
Aunque el cambio de nombre de registros se describe en el contexto de una ejecución fuera de orden, se debería entender que el cambio de nombre de registros se puede usar en una arquitectura en orden. Aunque la realización ilustrada del procesador también puede incluir unidades de memoria caché de instrucciones y de datos separadas y una unidad de memoria caché de L2 compartida, realizaciones alternativas pueden tener una única memoria caché interna tanto para instrucciones como para datos, tal como, por ejemplo, una memoria caché interna de nivel 1 (L1) o múltiples niveles de memoria caché interna. En algunas realizaciones, el sistema puede incluir una combinación de una memoria caché interna y una memoria caché externa que es externa al núcleo y/o al procesador. Como alternativa, toda la memoria caché puede ser externa al núcleo y/o al procesador.
La circuitería de ejecución 1311 es un conjunto de uno o más circuitos de ejecución, incluyendo la circuitería de escalares 1321, la circuitería de vectores/SIMD 1323 y la circuitería de operaciones matriciales 1327, así como la circuitería de acceso a memoria 1325 para acceder a la memoria caché 1313. Los circuitos de ejecución realizan diversas operaciones (por ejemplo, desplazamientos, suma, resta, multiplicación) y sobre diversos tipos de datos (por ejemplo, coma flotante escalar, entero empaquetado, coma flotante empaquetada, entero vectorial, coma flotante vectorial). Aunque algunas realizaciones pueden incluir un número de unidades de ejecución dedicadas a funciones o conjuntos de funciones específicos, otras realizaciones pueden incluir solo una unidad de ejecución o múltiples unidades de ejecución que realizan, todas ellas, todas las funciones. La circuitería de escalares 1321 realiza operaciones escalares, la circuitería de vectores/SIMD 1323 realiza operaciones vectoriales/SIMD, y la circuitería de operaciones matriciales 1327 realiza operaciones matriciales (de teselas) detalladas en el presente documento.
A modo de ejemplo, la arquitectura de núcleo de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativa puede implementar una canalización como sigue: 1) un circuito de recuperación de instrucciones realiza unas fases de recuperación y de descodificación de longitud; 2) la circuitería de bifurcación y de descodificación 1303 realiza una fase de descodificación; 3) la circuitería de asignación/cambio de nombre 1307 realiza una fase de asignación y una fase de cambio de nombre; 4) la circuitería de programador 1309 realiza una fase de programación; 5) un archivo o archivos de registro físico (acoplados a, o incluidos en, la circuitería de programador 1309 y la circuitería de asignación/cambio de nombre 1307 y una unidad de memoria realizan una fase de lectura de registro/lectura de memoria; la circuitería de ejecución 1311 realiza una fase de ejecución; 6) una unidad de memoria y la unidad o unidades de archivo o archivos de registro físico realizan una fase de escritura no simultánea/escritura en memoria; 7) diversas unidades pueden estar implicadas en la fase de manejo de excepciones; y 8) una unidad de retiro y la unidad o unidades de archivo o archivos de registro físico realizan una fase de confirmación.
El núcleo puede soportar uno o más conjuntos de instrucciones (por ejemplo, el conjunto de instrucciones de x86 (con algunas ampliaciones que se han añadido con versiones más nuevas); el conjunto de instrucciones MIPS de MIPS Technologies de Sunnyvale, CA; el conjunto de instrucciones ARM (con ampliaciones adicionales opcionales tales como NEON) de ARM Holdings de Sunnyvale, CA), incluyendo la instrucción o instrucciones descritas en el presente documento. En una realización, el núcleo 1390 incluye lógica para soportar una ampliación de conjunto de instrucciones de datos empaquetados (por ejemplo, AVX1, AVX2), permitiendo de ese modo que las operaciones usadas por muchas aplicaciones multimedios se realicen usando datos empaquetados.
Se debería entender que el núcleo puede soportar multiproceso (ejecutar dos o más conjuntos paralelos de operaciones o subprocesos), y puede hacer esto de una diversidad de formas, incluyendo multiproceso segmentado en el tiempo, multiproceso simultáneo (en donde un único núcleo físico proporciona un núcleo lógico para cada uno de los subprocesos para los que ese núcleo físico está sometiendo a multiproceso simultáneamente), o una combinación de los mismos (por ejemplo, recuperación y descodificación segmentadas en el tiempo y multiproceso simultáneo a continuación de lo anterior, tal como en la tecnología Hyperthreading de Intel®).
La figura 14 ilustra una realización de una canalización de núcleo de procesador que soporta operaciones matriciales usando teselas. La circuitería de predicción de bifurcaciones y de descodificación 1403 realiza una predicción de bifurcaciones de instrucciones, una descodificación de instrucciones, y/o ambas, a partir de unas instrucciones almacenadas en el almacenamiento de instrucciones 1401. Por ejemplo, instrucciones detalladas en el presente documento se pueden almacenar en un almacenamiento de instrucciones. En algunas implementaciones, se usa una circuitería separada para la predicción de bifurcaciones y, en algunas realizaciones, al menos algunas instrucciones se descodifican en una o más microoperaciones, puntos de entrada de microcódigo, microinstrucciones, otras instrucciones u otras señales de control usando el microcódigo 1405. La circuitería de predicción de bifurcaciones y de descodificación 1403 se puede implementar usando diversos mecanismos diferentes. Los ejemplos de mecanismos adecuados incluyen, pero no se limitan a, tablas de consulta, implementaciones en hardware, matrices lógicas programables (PLA), memorias de solo lectura (ROM) de microcódigo, etc.
La circuitería de predicción de bifurcaciones y de descodificación 1403 se acopla a la circuitería de asignación/cambio de nombre 1407 que se acopla, en algunas realizaciones, a la circuitería de programador 1409. En algunas realizaciones, estos circuitos proporcionan funcionalidades de cambio de nombre de registro, de asignación de registro y/o de programación realizando uno o más de: 1) cambiar de nombre unos valores de operando lógico a valores de operando físico (por ejemplo, una tabla de alias de registro en algunas realizaciones), 2) asignar unos bits de estado y unos indicadores a la instrucción descodificada, y 3) programar la instrucción descodificada para su ejecución en la circuitería de ejecución fuera de una agrupación de instrucciones (por ejemplo, usando una estación de reserva en algunas realizaciones).
La circuitería de programador 1409 representa cualquier número de programadores diferentes, incluyendo estaciones de reservas, ventana de instrucciones central, etc. La circuitería de programador 1409 de la unidad o unidades de programador se acopla a, o incluye, un archivo o archivos de registro físico 1415. Cada uno del archivo o archivos de registro físico 1415 representa uno o más archivos de registro físico, unos diferentes de los cuales almacenan uno o más tipos de datos diferentes, tales como entero escalar, coma flotante escalar, entero empaquetado, coma flotante empaquetada, entero vectorial, coma flotante vectorial, estado (por ejemplo, un puntero de instrucción que es la dirección de la siguiente instrucción a ejecutar), teselas, etc. En una realización, el archivo o archivos de registro físico 1415 comprenden una circuitería de registros de vector, una circuitería de registros de máscara de escritura y una circuitería de registros de escalar. Estos circuitos de registro pueden proporcionar registros de vector arquitectónicos, registros de máscara de vector y registros de propósito general. El archivo o archivos de registro físico 1415 son solapados por un circuito de retiro 1417 para ilustrar diversas formas en las que se pueden implementar un cambio de nombre de registro y una ejecución fuera de orden (por ejemplo, usando una memoria intermedia o memorias intermedias de reordenación y un archivo o archivos de registro de retiro; usando un archivo o archivos futuros, una memoria o memorias de historial y un archivo o archivos de registro de retiro; usando correlaciones de registro y una agrupación de registros; etc.). El circuito de retiro 1417 y el archivo o archivos de registro físico 1415 se acoplan a la circuitería de ejecución 1411.
Aunque el cambio de nombre de registros se describe en el contexto de una ejecución fuera de orden, se debería entender que el cambio de nombre de registros se puede usar en una arquitectura en orden. Aunque la realización ilustrada del procesador también puede incluir unidades de memoria caché de instrucciones y de datos separadas y una unidad de memoria caché de L2 compartida, realizaciones alternativas pueden tener una única memoria caché interna tanto para instrucciones como para datos, tal como, por ejemplo, una memoria caché interna de nivel 1 (L1) o múltiples niveles de memoria caché interna. En algunas realizaciones, el sistema puede incluir una combinación de una memoria caché interna y una memoria caché externa que es externa al núcleo y/o al procesador. Como alternativa, toda la memoria caché puede ser externa al núcleo y/o al procesador.
La circuitería de ejecución 1411 un conjunto de uno o más circuitos de ejecución 1427 y un conjunto de uno o más circuitos de acceso a memoria 1425 para acceder a la memoria caché 1413. Los circuitos de ejecución 1427 realizan operaciones matriciales (de teselas) detalladas en el presente documento.
A modo de ejemplo, la arquitectura de núcleo de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativa puede implementar una canalización como sigue: 1) un circuito de recuperación de instrucciones realiza unas fases de recuperación y de descodificación de longitud; 2) la circuitería de bifurcación y de descodificación 1403 realiza una fase de descodificación; 3) la circuitería de asignación/cambio de nombre 1407 realiza una fase de asignación y una fase de cambio de nombre; 4) la circuitería de programador 1409 realiza una fase de programación; 5) un archivo o archivos de registro físico (acoplados a, o incluidos en, la circuitería de programador 1409 y la circuitería de asignación/cambio de nombre 1407 y una unidad de memoria realizan una fase de lectura de registro/lectura de memoria; la circuitería de ejecución 1411 realiza una fase de ejecución; 6) una unidad de memoria y la unidad o unidades de archivo o archivos de registro físico realizan una fase de escritura no simultánea/escritura en memoria; 7) diversas unidades pueden estar implicadas en la fase de manejo de excepciones; y 8) una unidad de retiro y la unidad o unidades de archivo o archivos de registro físico realizan una fase de confirmación.
El núcleo puede soportar uno o más conjuntos de instrucciones (por ejemplo, el conjunto de instrucciones de x86 (con algunas ampliaciones que se han añadido con versiones más nuevas); el conjunto de instrucciones MIPS de MIPS Technologies de Sunnyvale, CA; el conjunto de instrucciones ARM (con ampliaciones adicionales opcionales tales como NEON) de ARM Holdings de Sunnyvale, CA), incluyendo la instrucción o instrucciones descritas en el presente documento. En una realización, el núcleo 1490 incluye lógica para soportar una ampliación de conjunto de instrucciones de datos empaquetados (por ejemplo, AVX1, AVX2), permitiendo de ese modo que las operaciones usadas por muchas aplicaciones multimedios se realicen usando datos empaquetados.
Se debería entender que el núcleo puede soportar multiproceso (ejecutar dos o más conjuntos paralelos de operaciones o subprocesos), y puede hacer esto de una diversidad de formas, incluyendo multiproceso segmentado en el tiempo, multiproceso simultáneo (en donde un único núcleo físico proporciona un núcleo lógico para cada uno de los subprocesos para los que ese núcleo físico está sometiendo a multiproceso simultáneamente), o una combinación de los mismos (por ejemplo, recuperación y descodificación segmentadas en el tiempo y multiproceso simultáneo a continuación de lo anterior, tal como en la tecnología Hyperthreading de Intel®).
Distribución
De principio a fin de esta descripción, se expresan datos usando una distribución de datos ordenados por filas. Usuarios de un orden por columnas deberían traducir los términos de acuerdo con su orientación. La figura 15 ilustra un ejemplo de una matriz expresada en un formato ordenado por filas y en un formato ordenado por columnas. Como se muestra, la matriz A es una matriz 2 x 3. Cuando esta matriz se almacena en un formato ordenado por filas, los elementos de datos de una fila son consecutivos. Cuando esta matriz se almacena en un formato ordenado por columnas, los elementos de datos de una columna son consecutivos. Es una propiedad bien conocida de las matrices que AT * BT = (BA)T, en donde el superíndice T significa transformada. Leer datos ordenados por columnas como datos ordenados por filas da como resultado que la matriz parezca la matriz de transformada.
En algunas realizaciones, se utilizan semánticas ordenadas por filas en el hardware, y los datos ordenados por columnas son para intercambiar el orden de operandos, siendo el resultado transformadas de matriz, pero para lecturas ordenadas por columnas posteriores desde memoria, esta es la matriz no transformada, que es la correcta.
Por ejemplo, si hay que multiplicar dos matrices ordenadas por columnas:
a b g i k ag+bh ai+bj ak+bl
c d * h j l = cg+dh ci+dj ck+dl
e f eg+fh ei+fj ek+fl
(3 x 2) (2 x 3) (3 x 3)
Las matrices de entrada se almacenarían en una memoria lineal (ordenadas por columnas) como:
a c e b d f
y
g h i j k l.
Leyendo esas matrices como ordenadas por filas con unas dimensiones 2 x 3 y 3 x 2, estas aparecerían como:
a c e y g h
b d f i j
k l
Intercambiando el orden y multiplicando matricialmente:
g h a c e ag+bh cg+dh eg+fh
i j * b d f = ai+bj ci+dj ei+fj
k l ak+bl ck+dl ek+fl
La matriz de transformada está fuera y se puede almacenar entonces en orden por filas:
ag+bh cg+dh eg+fh ai+bj ci+dj ei+fj ak+bl ck+dl ek+fl y se usa en cálculos con un orden por columnas posteriores, es la matriz no transformada correcta:
ag+bh ai+bj ak+bl
cg+dh ci+dj ck+dl
eg+fh ei+fj ek+fl
Uso ilustrativo
La figura 16 ilustra un ejemplo de uso de matrices (teselas). En este ejemplo, la matriz C 1601 incluye dos teselas, la matriz A 1603 incluye una tesela y la matriz B 1605 incluye dos teselas. Esta figura muestra un ejemplo del bucle interno de un algoritmo para calcular una multiplicación matricial. En este ejemplo, se usan dos teselas de resultado, tmm0 y tmm1, a partir de la matriz C 1601 para acumular los resultados intermedios. Una tesela a partir de la matriz A 1603 (tmm2) se reutiliza dos veces cuando es multiplicada por dos teselas a partir de la matriz B 1605. Punteros para cargar una nueva matriz A (tesela) y dos nuevas matrices B (teselas) desde las direcciones indicadas por las flechas. Un bucle exterior, no mostrado, ajusta los punteros para las teselas C.
El código ilustrativo como se muestra incluye el uso de una instrucción de configuración de teselas y se ejecuta para configurar el uso de teselas, cargar teselas, un bucle para procesar las teselas, almacenar teselas en memoria y liberar el uso de teselas.
La figura 17 ilustra una realización de uso de matrices (teselas). En 1701, se configura un uso de teselas. Por ejemplo, se ejecuta una instrucción TILECONFIG para configurar el uso de teselas, incluyendo establecer un número de filas y columnas por tesela. Habitualmente, al menos una matriz (tesela) se carga desde memoria en 1703. Al menos una operación matricial (de teselas) se realiza en 1705 usando las matrices (teselas). En 1707, al menos una matriz (tesela) se almacena fuera en memoria y una conmutación de contexto puede tener lugar en 1709.
Configuración ilustrativa
Soporte de hardware de configuración de teselas
Como se ha analizado anteriormente, habitualmente es necesario configurar el uso de teselas antes de su uso. Por ejemplo, puede que no sea necesario el uso completo de todas las filas y columnas. Configurar estas filas y columnas no solo ahorra energía en algunas realizaciones, sino que la configuración se puede usar para determinar si una operación generará un error. Por ejemplo, habitualmente una multiplicación matricial de la forma (N x M) * (L x N) no funcionará si M y L no son iguales.
Antes de usar matrices que usan teselas, en algunas realizaciones, se ha de configurar un soporte de teselas. Por ejemplo, se configuran cuántas filas y columnas por tesela, teselas que se van a usar, etc. Una instrucción TILECONFIG es, en sí misma, una mejora para un ordenador, debido a que esta prevé soporte para configurar el ordenador para usar un acelerador de matrices (o bien como una parte de un núcleo de procesador o bien como un dispositivo externo). En particular, una ejecución de la instrucción TILECONFIG hace que una configuración se recupere desde memoria y se aplique a ajustes de matriz (tesela) dentro de un acelerador de matrices.
Configuración de uso de teselas
La figura 18 ilustra un soporte para la configuración del uso de teselas de acuerdo con una realización. Una memoria 1801 contiene la descripción de tesela 1803 de las matrices (teselas) a soportar.
Los recursos de ejecución de instrucciones 1811 de un procesador/núcleo 1805 almacena aspectos de una descripción de tesela 1803 en las configuraciones de teselas 1817. Las configuraciones de teselas 1817 incluyen una tabla de paleta 1813 para detallar qué teselas para una paleta están configuradas (el número de filas y columnas en cada tesela) y una marca de que el soporte de matriz está en uso. En particular, los recursos de ejecución de instrucciones 1811 están configurados para usar teselas como es especificado por las configuraciones de teselas 1817. Los recursos de ejecución de instrucciones 1811 también pueden incluir un registro específico de máquina o un registro de configuración para indicar un uso de teselas. También se establecen valores adicionales, tales como valores en uso y de inicio. Las configuraciones de teselas 1817 utilizan un(os) registro(s) 1819 para almacenar información de uso y de configuración de teselas.
La figura 19 ilustra una realización de una descripción de las matrices (teselas) a soportar. Esta es la descripción que se va a almacenar tras la ejecución de una instrucción STTILECFG. En este ejemplo, cada campo es un byte. En el byte [0] se almacena un ID de paleta 1901. El ID de paleta se usa para indexar una tabla de paleta 1813 que almacena, por ID de paleta, un número de bytes en una tesela y bytes por fila de las teselas que están asociadas con este ID como es definido por la configuración.
El byte 1 almacena un valor a almacenar en un registro de ''filaInicio'' 1903 y el byte 2 almacena un valor a almacenar en un registro, PInicio 1905. Para soportar instrucciones de reinicio después de estos sucesos, las instrucciones almacenan información en estos registros. Para soportar instrucciones de reinicio después de sucesos de interrupción tales como los detallados anteriormente, las instrucciones almacenan información en estos registros. El valor de filaInicio indica la fila que debería usarse para un reinicio. El valor de PInicio indica la posición dentro de la fila para operaciones de almacenamiento cuando se usan pares y, en algunas realizaciones, indica la mitad inferior de la fila (en la tesela inferior de un par) o la mitad superior de la fila (en la tesela superior de un par). En general, la posición en la fila (la columna) no es necesaria.
Con la excepción de TILECONFIG y STTILECFG, ejecutar con éxito instrucciones de matrices (teselas) establecerá tanto filaInicio como PInicio a cero.
Cada vez que no se reinicia una instrucción de matrices (teselas) interrumpida, es responsabilidad del software poner a cero los valores de filaInicio y de PInicio. Por ejemplo, los manejadores de excepciones de coma flotante sin enmascarar podrían decidir finalizar la operación en software y cambiar el valor de contador de programa a otra instrucción, habitualmente la instrucción siguiente. En este caso, el controlador de excepciones de software debe poner a cero los valores de filaInicio y de PInicio en la excepción presentada al mismo por el sistema operativo antes de reanudar el programa. Posteriormente, el sistema operativo recargará esos valores usando una instrucción de restablecimiento.
El byte 3 almacena una indicación de pares (1 b por tesela) de teselas 1907.
Los bytes 16-17 almacenan el número de filas 1913 y columnas 1915 para la tesela 0, los bytes 18-19 almacenan el número de filas y columnas para la tesela 1, etc. En otras palabras, cada grupo de 2 bytes especifica un número de filas y columnas para una tesela. Si no se usa un grupo de 2 bytes para especificar parámetros de tesela, estos deberían tener el valor cero. Especificar parámetros de tesela para más teselas que el límite de implementación o el límite de paleta da como resultado un error. Las teselas no configuradas se establecen a un estado inicial con 0 filas, 0 columnas.
Por último, la configuración en memoria termina habitualmente con una delineación final tal como todo ceros durante varios bytes consecutivos.
Tesela y almacenamiento de configuración de teselas ilustrativos
Las figuras 20(A)-(D) ilustran ejemplos de un registro o registros 1819. La figura 20(A) ilustra una pluralidad de registros 1819. Como se muestra, cada tesela (TMM02001 ... TMMN 2003) tiene un registro separado, almacenando cada registro un tamaño de fila y de columna para esa tesela particular. PInicio 2011 y FilaInicio 2013 se almacenan en unos registros separados. Se establecen uno o más registros de estado 2015 (por ejemplo, TESELAS_CONFIGURADAS = 1) para indicar que las teselas están configuradas para su uso.
La figura 20(B) ilustra una pluralidad de registros 1819. Como se muestra, cada tesela tiene registros separados para sus filas y columnas. Por ejemplo, la configuración de filas de TMM0 2021, la configuración de columnas de TMM0 2023, PInicio 2011 y FilaInicio 2013 se almacenan en unos registros separados. Se establecen uno o más registros de estado 2015 (por ejemplo, TESELAS_CONFIGURADAS = 1) para indicar que las teselas están configuradas para su uso.
La figura 20(C) ilustra un único registro 1819. Como se muestra, este registro almacena las configuraciones de teselas (filas y columnas por tesela) 2031, PInicio 2011 y FilaInicio 2013 se almacenan en un único registro como registros de datos empaquetados. Se establecen uno o más registros de estado 2015 (por ejemplo, TESELAS_CONFIGURADAS = 1) para indicar que las teselas están configuradas para su uso.
La figura 20(D) ilustra una pluralidad de registros 1819. Como se muestra, un único registro almacena la configuración de las teselas (filas y columnas por tesela) 2031. PInicio y FilaInicio se almacenan en unos registros 2011 y 2013 separados. Se establecen uno o más registros de estado 2015 (por ejemplo, TESELAS_CONFIGURADAS = 1) para indicar que las teselas están configuradas para su uso.
Se contemplan otras combinaciones, tales como combinar los registros de inicio en un único registro en donde los mismos se muestran por separado, etc.
Instrucciones TILENZFMA/TILENZMUL
Como se ha mencionado anteriormente, los aceleradores de hardware comunes hoy en día para las redes neuronales realizan principalmente la multiplicación matricial en un formato denso, sin tener en cuenta el hecho de que hay un gran porcentaje de ceros o valores cercanos a cero que se hayan en una (o ambas) matrices. Esto introduce un uso ineficiente de recursos de hardware (desperdiciando energía y ciclos de cómputo para generar productos intrascendentes). En el presente documento se divulgan realizaciones de sistemas, procesadores y métodos para acelerar la ejecución de operaciones matriciales para su uso en el aprendizaje automático y las redes neuronales, incluyendo para entrenamiento e inferencia. Las realizaciones divulgadas mejoran el desempeño y reducen el consumo de energía de las multiplicaciones en un contexto de redes neuronales.
En particular, las realizaciones divulgadas proponen una familia de instrucciones para detectar y evitar operaciones matriciales que producirían resultados de valor cero o de valor cercano a cero (es decir, despreciables o intrascendentes). Los elementos de datos que son candidatos para ser omitidos o bien se han de detectar dinámicamente, o bien se han de etiquetar con antelación con un campo que indique tal cosa.
Los enfoques inferiores alternativos para la aceleración de hardware para redes neuronales realizan una multiplicación matricial asumiendo matrices con un formato denso y no consiguen tener en cuenta que a menudo hay un gran porcentaje de ceros o valores cercanos a cero (también denominados "casi cero" o "aproximadamente cero") que se hayan en una (o ambas) de las matrices de origen. Esto introduce un uso ineficiente de recursos de hardware, debido a que se desperdician energía y recursos de ejecución.
Algunos enfoques inferiores alternativos requieren que las matrices de origen tengan características particulares, en concreto, a veces se supone que las matrices de origen son o bien dispersas o bien densas. En contraposición, las realizaciones divulgadas no fuerzan tales suposiciones.
Algunos enfoques inferiores alternativos no consiguen aprovechar los valores cercanos a cero para extraer más desempeño y ahorro de energía. En contraposición, las realizaciones divulgadas detectan valores de datos que son cercanos a cero (es decir, en comparación con un umbral programable) y fuerzan esos valores a cero con el fin de permitir que los mismos se omitan y potenciar el desempeño y la conservación de energía.
Los aceleradores de hardware para redes neuronales, incluyendo para entrenamiento e inferencia, se esfuerzan por lograr las mejores cifras de desempeño bruto y los mejores valores de relación entre potencia y desempeño. Aprovechar la dispersión nativa e inyectada en esas redes neuronales es una forma de ayudar a lograr estos fines.
La familia de instrucciones propuesta ha de evitar el procesamiento de elementos de valor cero o de elementos que producirían resultados de multiplicación despreciables. Otros términos usados en el presente documento para hacer referencia a resultados "despreciables" son "intrascendente" y "trivial". Los elementos que se van a omitir se han de identificar dinámicamente o, si no, etiquetarse con antelación.
Las realizaciones de un procesador para ejecutar instrucciones de multiplicación-acumulación fusionada distinta de cero de matrices (teselas) (TILENZFMA) han de incluir una circuitería de descodificación para descodificar una instrucción que tiene campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes. Tales procesadores incluyen además una circuitería de programación para programar la ejecución de la instrucción, y una circuitería de ejecución para ejecutar la instrucción según el código de operación.
Las realizaciones de un procesador para realizar instrucciones de multiplicación distinta de cero de matrices (teselas) (TILENZMUL) han de incluir: una circuitería de descodificación para descodificar una instrucción que tiene unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador, para cada par de elementos correspondientes de las matrices de origen, ha de generar un resultado de una multiplicación y almacenar el resultado en un elemento correspondiente de la matriz de destino, al tiempo que se evitando operaciones que, basándose en valores detectados de los elementos correspondientes, generarían resultados intrascendentes. El procesador ha de incluir adicionalmente una circuitería de programación para programar la ejecución de las instrucciones, y una circuitería de ejecución para ejecutar las instrucciones según el código de operación.
Ejecución ilustrativa
La figura 21A es un diagrama de bloques que ilustra la ejecución de una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones. Como se muestra, el sistema 2100 ha de ejecutar la instrucción TILENZFMA 2101, que incluye campos para especificar una primera matriz de origen, una segunda matriz de origen y una matriz de destino, y un código de operación que indica que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino. El procesador ha de omitir las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes. Durante el funcionamiento, una circuitería de descodificación (no mostrada) ha de descodificar la instrucción TILENZFMA 2101. El procesador ha de usar adicionalmente una circuitería de programación (no mostrada) para programar la ejecución de la instrucción, y una circuitería de ejecución 2106 para ejecutar las instrucciones según el código de operación. Ventajosamente, como se muestra, detectar un elemento de valor cero 2108, 2109 en cada una de las dos matrices de origen 2102, 2104 permite que el procesador omita ocho multiplicaciones intrascendentes.
Por supuesto, la ilustración de la figura 21A está simplificada para transmitir lo esencial del asunto. Se espera que, en realidad, el procesador pueda funcionar con matrices mucho más grandes, tales como matrices de 32 x 32 o más grandes, y que al menos una de las matrices de origen tenga una dispersión mucho más grande, tal como que la incidencia de ceros y valores cercanos a cero esté entre, póngase por caso, el 40 % y el 90 %.
La ejecución de la instrucción TILENZFMA de acuerdo con realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21C-E, 22A-B, 23, 28A-B y 29A-B. Un formato de la instrucción TILENZFMA se ilustra y se describe adicionalmente con respecto a las figuras 24, 25A-B y 26A-D.
La figura 21B es un diagrama de bloques que ilustra la ejecución de una instrucción de multiplicación distinta de cero de matrices (teselas) (TILENZMUL) de acuerdo con algunas realizaciones. Se muestra un ejemplo de una multiplicación elemento a elemento de dos matrices de origen. En el presente caso, el sistema 2150 ha de ejecutar la instrucción TILENZMUL 2151, que incluye campos para especificar la primera matriz de origen, la segunda matriz de origen y la matriz de destino, y un código de operación que indica que el procesador ha de multiplicar cada elemento en la fila M y la columna N de la primera matriz de origen con un elemento correspondiente en la fila M y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos, generarían resultados intrascendentes (también conocidos como resultados despreciables o triviales). Durante el funcionamiento, una circuitería de descodificación (no mostrada) ha de descodificar la instrucción TILENZMUL 2151. El procesador ha de usar adicionalmente una circuitería de programación (no mostrada) para programar la ejecución de la instrucción, y una circuitería de ejecución para ejecutar las instrucciones según el código de operación. Ventajosamente, como se muestra, el procesador ha de detectar dos elementos de valor cero 2158 y 2159 en la primera matriz de origen 2152 y en la segunda matriz de origen 2154, que permiten evitar dos multiplicaciones intrascendentes mostradas como valores cero en la matriz de destino 2156.
En las aplicaciones prácticas de aprendizaje automático y de multiplicación matricial, se espera que las matrices de origen sean mucho más grandes, por ejemplo, de 16 x 16, y se espera que su dispersión sea mucho mayor, teniendo, por ejemplo, del 50 % al 90 % de elementos de valor cero.
La ejecución de la instrucción TILENZMUL de acuerdo con realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21C-E, 22A-B, 28A-B y 29A-B. Un formato de la instrucción TILENZMUL se ilustra y se describe adicionalmente con respecto a las figuras 24, 25A-B y 26A-D.
Identificar y forzar elementos de datos de valor cero (intrascendentes)
Las realizaciones divulgadas de sistemas, circuitos y métodos para realizar la familia de instrucciones TILENZFMA y TILENZMUL realizan la multiplicación matricial después de, en primer lugar, identificar y evitar (por ejemplo, omitir) multiplicaciones que producirían resultados intrascendentes (por ejemplo, despreciables, triviales). Por ejemplo, se evita multiplicar por elementos de datos de valor cero en ninguna de las matrices de origen. Pero también, a diferencia de enfoques inferiores alternativos, las realizaciones divulgadas aprovechan los valores que son cercanos a cero. Esto se hace forzando elementos de datos a cero si estos son menores que un umbral programable y predefinido. Por supuesto, para los datos con signo, su valor absoluto se compara con el umbral.
Cuando se han de identificar candidatos de optimización
Algunas realizaciones de sistemas, circuitos y métodos para realizar la familia de instrucciones TILENZFMA y TILENZMUL detectan candidatos para proporcionar oportunidades de optimización dinámicamente, en el transcurso de la ejecución de la instrucción. En tales realizaciones, la ejecución de una multiplicación va precedida por comprobar si se generaría un producto de valor cero o intrascendente y, si es así, por omitir o evitar la ejecución de la multiplicación. Algunas de tales realizaciones reducen el consumo de energía deshabilitando una circuitería de multiplicación durante el ciclo que se va a omitir. Algunas de tales realizaciones mejoran el desempeño programando una multiplicación diferente y útil, tal como una multiplicación de un par siguiente de elementos de matriz de origen correspondientes, durante el ciclo que se omitiría de otro modo. En cualquier caso, omitir una multiplicación que produciría un resultado intrascendente mejora la relación entre potencia y desempeño del procesador.
Algunas realizaciones alternativas de sistemas, circuitos y métodos para realizar la familia de instrucciones TILENZFMA y TILENZMUL detectan candidatos para proporcionar oportunidades de optimización dinámicamente, pero durante una fase de programación. En particular, tales realizaciones, cuando se programa la ejecución de una multiplicación, comprueban si un producto de valor cero o intrascendente sería generado por una multiplicación, y, si es así, omiten (por ejemplo, evitan) programar la multiplicación. En su lugar, tales realizaciones aprovechan el ciclo que se va a omitir para obtener una ventaja de desempeño o de ahorro de energía. En relación con esto, algunas realizaciones, después de comprobar que se evitan las multiplicaciones que generarían resultados intrascendentes, mantienen una cola o memoria intermedia de multiplicaciones programadas para su ejecución.
Otras realizaciones alternativas más de sistemas, circuitos y métodos para realizar la familia de instrucciones TILENZFMA y TILENZMUL detectan y etiquetan elementos de matriz de origen que se van a omitir con antelación. Por ejemplo, algunas realizaciones anexan un campo "omíteme" (por ejemplo, un bit) a cada elemento de matriz de origen que se ha de omitir debido a que usarlo como un multiplicando generaría un producto intrascendente. Tales realizaciones han de omitir (evitar) multiplicar con tales elementos etiquetados, y mejoran de forma beneficiosa la potencia o el desempeño durante el ciclo que se usaría de otro modo para generar un producto despreciable. En algunas realizaciones, estos campos "omíteme" se han de anexar a los elementos de datos de matriz de origen con antelación.
Realizaciones similares de sistemas, circuitos y métodos para realizar la familia de instrucciones TILENZFMA y TILENZMUL detectan elementos de matriz de origen que se van a omitir con antelación y especifican una máscara distinta de cero de múltiples bits que tiene un bit para cada elemento de una matriz de origen que se va a omitir. En algunas realizaciones, los bits de la máscara NZ se correlacionan con los elementos de matriz de origen en orden por filas. En algunas realizaciones, la instrucción ha de especificar una máscara NZ para cada una de la primera y la segunda matrices de origen.
Identificar y forzar elementos de datos de valor cero (intrascendentes)
Las figuras 21C-E son diagramas de bloques que ilustran la detección de candidatos de multiplicación intrascendentes en una matriz de origen, de acuerdo con algunas realizaciones.
La figura 21C es un diagrama de bloques que ilustra la detección de multiplicandos cercanos a cero, de acuerdo con algunas realizaciones. Como se muestra, la matriz 2162 es una matriz de 4 x 4 que tiene cuatro elementos cercanos a cero (cerca de cero) cuyos valores absolutos, iguales a 1, son menores que un umbral, 2. También se muestra una gráfica 2164 que representa gráficamente los elementos de la matriz 2162 en orden por filas y que identifica los cuatro elementos cuyos valores absolutos son menores que 2. Ventajosamente, las realizaciones divulgadas han de omitir esos cuatro elementos, produciendo un mejor desempeño de potencia.
La figura 21D es un diagrama de bloques que ilustra la detección de multiplicandos cerca de un valor constante, de acuerdo con algunas realizaciones. Como se muestra, la matriz 2166 es una matriz de 4 x 4 cuyos elementos tienen valores apiñados cerca de un valor constante, 10. También se muestra una gráfica 2168 que representa gráficamente los elementos de la matriz 2166 en orden por filas y que identifica los cuatro elementos cuyos valores absolutos están cerca de la constante, 10 en el presente caso. Para optimizar el desempeño, las realizaciones divulgadas identifican los cuatro elementos cuyos valores están dentro de un umbral, póngase por caso 2, de la constante. Ventajosamente, algunas realizaciones añaden una transformación de normalización restando la constante y dividiendo por la desviación típica en torno a la misma para inducir valores cercanos a cero.
La figura 21E es un diagrama de bloques que ilustra la detección de multiplicandos cerca de un valor medio, de acuerdo con algunas realizaciones. Como se muestra, la matriz 2170 es una matriz de 4 x 4 cuyos elementos tienen valores apiñados cerca de una media, 12,7. También se muestra una gráfica 2172 que representa gráficamente los elementos de la matriz 2170 en orden por filas y destaca los dos elementos cuyos valores absolutos están cerca de la media. De nuevo en este caso, algunas realizaciones añaden una normalización que resta la media de cada valor y la divide por la desviación típica, y da como resultado una matriz que tiene significativamente más valores de valor cero o cercanos a cero.
Se debería hacer notar que una constante con la que se han de comparar los elementos de matriz de origen se puede seleccionar usando diferentes características estadísticas, tales como una mediana, una moda, un mínimo o un máximo, por citar unos pocos ejemplos no limitativos.
Circuitería de ejecución ilustrativa
La figura 22A es un diagrama de bloques que ilustra una circuitería de ejecución para realizar una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones. Como se muestra, el sistema 2200 ha de ejecutar la instrucción TILENZFMA 2201, que incluye campos para especificar una primera matriz de origen 2204 (que tiene M filas por K columnas), una segunda matriz de origen (que tiene K filas por N columnas) (no mostrada), una matriz destino (que tiene M filas por N columnas) (no mostrada), y un código de operación que indica que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen 2204 con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes.
En el presente caso, la matriz de origen de 4 x 4 2204 tiene valores que se han de comparar con un umbral 2202 usando la circuitería de ejecución 2206, incluyendo el comparador 2208, que ha de emitir una señal para habilitar el circuito de multiplicación-acumulación fusionada (FMA) 2210. El umbral 2202 se ha de especificar en cualquiera de un campo de instrucción, como parte del código de operación de instrucción, o programándose con antelación en un registro de configuración (por ejemplo, TILECONFIG). Como se muestra, el umbral 2202 es igual a 2, lo que significa que cuatro de los dieciséis elementos de la matriz (tesela) de origen tienen valores absolutos que son menores que el umbral. Durante el funcionamiento, cuando se procesan esos cuatro elementos, el procesador ha de evitar habilitar el FMA 2210. En algunos casos, se programa otro trabajo útil para usar el FMA 2210 durante tales ciclos con el fin de evitar desperdiciar recursos de ejecución y mejorar el desempeño.
La habilitación o deshabilitación del FMA 2210 se realiza de cualquiera de varias formas, con el objetivo de reducir el consumo de energía. Por ejemplo, en algunas realizaciones, se detienen los relojes y/o la tensión de suministro al FMA.
La ejecución de las instrucciones TILENZFMA de acuerdo con realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21A-E, 22A, 23, 28A-B y 29A-B. Un formato de las instrucciones TILENZFMA se ilustra y se describe adicionalmente con respecto a las figuras 24, 25A-B y 26A-D.
Reducir la pérdida de precisión cuando se fuerzan ceros
La ejecución de la familia de instrucciones TILENZFMA y TILENZMUL divulgada usa a veces un redondeo para reducir la pérdida de precisión provocada forzando elementos intrascendentes a cero.
La figura 22B es un diagrama de bloques que ilustra una circuitería de ejecución para realizar una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones. Como se muestra, el sistema 2250 ha de ejecutar la instrucción TILENZFMA 2251, que incluye campos para especificar un umbral 2252, una primera matriz de origen 2254 (que tiene M filas por K columnas), una segunda matriz de origen (que tiene K filas por N columnas) (no mostrada), una matriz destino (que tiene M filas por N columnas) (no mostrada), y un código de operación que indica que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen 2254 con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes.
En el presente caso, la matriz de origen de 4 x 4 2254 tiene valores que se han de comparar con un umbral 2252 usando la circuitería de ejecución 2256, incluyendo el selector bit a bit 2258, que ha de encaminar los bits [31 :N] a la puerta O 2259, que ha de emitir una señal para habilitar el circuito de multiplicación-acumulación fusionada (FMA) 2260. Como se muestra, el umbral 2252 es 2, lo que significa que cuatro de los dieciséis elementos de la matriz (tesela) de origen tienen valores absolutos que son menores que el umbral. Si la puerta O 2259 detecta un 1 en cualquiera de los bits [31 :N], entonces el elemento de datos es más grande que el umbral y se ha de habilitar el FMA 2260.
De forma concurrente, los bits [N-1:0] de cada elemento se van a usar como controles de redondeo (es decir, bits de guarda y bits pegajosos, como se los conoce) para determinar si se añade condicionalmente un "1" al elemento de origen, con el fin de potenciar la precisión de la multiplicación matricial cuando se ha de omitir una Multiplicación que usa el elemento.
En algunas realizaciones, el umbral ha de ser especificado por la instrucción 2251. Cuando se procesan esos cuatro elementos, el procesador ha de evitar habilitar el FMA 2260. En algunos casos, se programa otro trabajo útil para usar el FMA 2260 durante tales ciclos con el fin de evitar desperdiciar recursos de ejecución.
La ejecución de la instrucción TILENZFMA de acuerdo con realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21A-E, 22A, 23, 28A-B y 29A-B. Un formato de las instrucciones TILENAZMUL y TILENZFMA se ilustra y se describe con respecto a las figuras 24, 25A-B y 26A-D.
Compresión matricial ilustrativa
La figura 22C es un diagrama de bloques que ilustra una realización de una compresión matricial. En algunas realizaciones, las instrucciones TILENZMUL y TILENZFMA se aceleran adicionalmente comprimiendo una o ambas de la primera y la segunda matrices de origen antes de la multiplicación. Como se muestra, el diagrama de flujo de bloques 2270 muestra cuatro matrices no comprimidas (las teselas 1-4) 2272, la circuitería de ejecución 2276 y las mismas cuatro matrices (las teselas 1-4) en formato comprimido 2278, con las máscaras de bits distintas de cero (NZ) 2280. Las matrices (teselas) comprimidas 2278 ofrecen una ventaja de potencia y de desempeño tanto en términos de movimiento de memoria como en el uso de recursos de ejecución, debido a que las columnas 4-15, que solo contienen elementos de valor cero, se pueden omitir en su totalidad, dando como resultado una ejecución global más rápida y un consumo de energía global inferior.
Durante el funcionamiento, en algunas realizaciones, una o ambas de la primera matriz y la segunda matriz de origen especificadas por una instrucción TILENZMUL o TILENZFMA se comprimen con antelación o bien por hardware (como se muestra) o bien por software.
En algunas realizaciones, una o ambas de la primera y la segunda matrices de origen se almacenan en formato comprimido en memoria y se descomprimen cuando se cargan para su uso. Una optimización de este tipo mejora la utilización de memoria y el ancho de banda.
Métodos ilustrativos de ejecución
La figura 23 ilustra una realización de un procesador que ejecuta una instrucción de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA), de acuerdo con algunas realizaciones. Como se muestra, la figura 23 ilustra una realización de un procesador que ejecuta un flujo 2300 para procesar una instrucción TILENZFMA 2303. Como se muestra, en 2305, el procesador ha de descodificar una instrucción usando una circuitería de descodificación, teniendo la instrucción unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes.
Obsérvese que una realización de un flujo de procesador para ejecutar una instrucción de multiplicación distinta de cero de matrices (teselas) (TILENZMUL) es similar al flujo 2300, con la excepción de que el código de operación incluido con la instrucción y descodificado en el código de operación de la operación 2305 indicaría que el procesador ha de multiplicar cada elemento en la fila M y la columna N de la primera matriz de origen con un elemento correspondiente en la fila M y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos, generarían resultados intrascendentes (también conocidos como resultados despreciables o triviales).
En algunas realizaciones, en 2307 el procesador ha de programar, usando una circuitería de programación, la ejecución de la instrucción. La operación 2307 es opcional (como es indicado por su borde de trazo discontinuo) en la medida en la que esta puede tener lugar en un momento diferente, o no tener lugar en absoluto.
En 2309, el procesador ha de ejecutar, usando una circuitería de ejecución, la instrucción según el código de operación. La circuitería de ejecución se ilustra y se describe adicionalmente con respecto a las figuras 3-14. En algunas realizaciones, la circuitería de ejecución es un acelerador de operaciones matriciales, tal como el ilustrado y descrito como el acelerador 307 (la figura 3). En algunas realizaciones, la circuitería de ejecución es un circuito de operaciones matriciales, tal como la circuitería de operaciones matriciales 405 (la figura 4), 505 (la figura 5) o 1213 (la figura 12) y 1327 (la figura 13).
En algunas realizaciones, la instrucción se confirma o se retira en 2311, que es opcional (como es indicado por su borde de trazo discontinuo) en la medida en la que esta puede tener lugar en un momento diferente, o no tener lugar en absoluto.
La ejecución de las instrucciones TILENZFMA y TILENAZMUL de acuerdo con realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21A-E, 22A-B, 28A-B y 29A-B. Un formato de las instrucciones TILENZFMA y TILENAZMUL se ilustra y se describe adicionalmente con respecto a las figuras 24, 25A-B y 26A-D.
Formatos ilustrativos de las instrucciones TILENZFMA y TILENZMUL
La figura 24 es un diagrama de bloques que ilustra un formato de unas instrucciones de multiplicación-acumulación fusionada distinta de cero de matrices (TILENZFMA) y de multiplicación distinta de cero de matrices (TILENZMUL), de acuerdo con algunas realizaciones. Como se muestra, el formato de instrucción TILENZFMA y TILENZMUL 2400 incluye campos para especificar un código de operación 2402 (o bien TILENZFMA o bien TILENZMUL) y unas ubicaciones de una primera matriz de origen 2406, una segunda matriz de origen 2408 y una matriz de destino 2404.
En el caso de una instrucción TILENZFMA, el código de operación ha de indicar que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes.
En el caso de una instrucción TILENZMUL, el código de operación 2402 ha de indicar que el procesador ha de multiplicar cada elemento en la fila M y la columna N de la primera matriz de origen con un elemento correspondiente en la fila M y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de los multiplicandos correspondientes, generarían resultados intrascendentes.
Las matrices de origen y de destino se pueden ubicar en memoria, en una colección de registros de archivo de registro y en una colección de registros de tesela, como es especificado por la instrucción 2400.
En algunas realizaciones, la instrucción 2400 especifica adicionalmente el umbral 2410, que ha de servir como un umbral por debajo del cual los valores de los elementos proporcionan productos intrascendentes. El uso de un umbral por realizaciones divulgadas se ilustra y se describe adicionalmente con respecto a las figuras 21A-E, 22A-B y 23. El umbral 2410 es opcional, como se indica por su contorno de trazo discontinuo, en la medida en la que el umbral 2410 se proporciona a veces como parte del código de operación 2402, o mediante un registro de configuración programado con antelación por software.
En algunas realizaciones, la instrucción 2400 especifica adicionalmente la máscara NZ 2412, que es un valor de múltiples bits, especificando cada bit si un elemento correspondiente tiene, o no, valor cero.
La instrucción TILENZFMA/TILENZMUL 2400 incluye además varios parámetros opcionales para controlar el comportamiento del procesador, incluyendo M 2414, K 2416, N 2418, el tamaño de elemento 2420 (medio byte, byte, palabra, palabra doble o palabra cuádruple), el formato de elemento 2422 (entero, coma flotante de precisión simple, coma flotante de precisión doble).
En algunas realizaciones, la instrucción 2400 especifica la máscara de escritura 2422 (un valor de múltiples bits con un bit por elemento de destino, el bit para controlar si el elemento de destino se ha de actualizar, o si se ha de poner a cero o fusionarse).
El código de operación 2402 se muestra incluyendo un asterisco, lo que sirve para transmitir que se pueden añadir prefijos y/o sufijos adicionales para especificar el comportamiento de la instrucción. Uno o más de los modificadores de instrucciones 2410, 2412, 2414, 2416, 2418, 2420, 2422 y 2424 se especifican en algunas realizaciones usando prefijos o sufijos al código de operación 2402.
En algunas realizaciones, uno o más de los modificadores de instrucciones 2410, 2412, 2414, 2416, 2418, 2420, 2422 y 2424 opcionales se codifican en un campo de valor inmediato (no mostrado) incluido opcionalmente con la instrucción 2400. En algunas realizaciones, uno o más de los modificadores de instrucciones 2410, 2412, 2414, 2416, 2418, 2420, 2422 y 2424 opcionales se especifican a través de un registro de configuración/estado (por ejemplo, XTILECONFIG). En otras palabras, cuando uno o más cualesquiera de los modificadores opcionales 2410, 2412, 2414, 2416, 2418, 2420, 2422 y 2424 no son especificados por la instrucción, a veces estos usan parámetros implícitos que se heredan de otras partes de la arquitectura de teselas.
Sistemas, procesadores y emulación ilustrativos detallados
En el presente documento se detallan ejemplos de hardware, software, etc., para ejecutar las instrucciones descritas anteriormente. Por ejemplo, lo que se describe a continuación detalla aspectos de la ejecución de instrucciones, incluyendo diversas fases de canalización, tales como recuperar, descodificar, programar, ejecutar, retirar, etc.
Conjuntos de instrucciones
Un conjunto de instrucciones puede incluir uno o más formatos de instrucción. Un formato de instrucción dado puede definir diversos campos (por ejemplo, número de bits, ubicación de bits) para especificar, entre otras cosas, la operación a realizar (por ejemplo, código de operación) y el operando u operandos en los que esa operación se va a realizar y/u otro campo o campos de datos (por ejemplo, máscara). Algunos formatos de instrucción se descomponen adicionalmente a través de la definición de plantillas de instrucción (o subformatos). Por ejemplo, se puede definir que las plantillas de instrucción de un formato de instrucción dado tengan diferentes subconjuntos de los campos del formato de instrucción (los campos incluidos están habitualmente en el mismo orden, pero al menos algunos tienen posiciones de bits diferentes debido a que hay menos campos incluidos) y/o se puede definir que tengan un campo dado interpretado de forma diferente. Por lo tanto, cada instrucción de una ISA se expresa usando un formato de instrucción dado (y, si se define, en una dada de las plantillas de instrucción de ese formato de instrucción) e incluye campos para especificar la operación y los operandos. Por ejemplo, una instrucción ADD ilustrativa tiene un código de operación específico y un formato de instrucción que incluye un campo de código de operación para especificar ese código de operación y campos de operando para seleccionar operandos (origen 1/destino y origen 2); y una aparición de esta instrucción ADD en un flujo de instrucciones tendrá contenidos específicos en los campos de operando que seleccionan operandos específicos. Se ha lanzado y/o publicado un conjunto de ampliaciones de SIMD denominadas Ampliaciones de Vectores Avanzadas (AVX) (AVX1 y AVX2) y que usan el esquema de codificación de Ampliaciones de Vectores (VEX) (por ejemplo, véase el documento Manual para desarrolladores de software para arquitecturas Intel® 64 e IA-32, septiembre de 2014; y véase el documento Intel® Advanced Vector Extensions Programming Reference, octubre de 2014).
Formatos de instrucción ilustrativos
Se pueden materializar realizaciones de la instrucción o instrucciones descritas en el presente documento en diferentes formatos. Adicionalmente, a continuación se detallan sistemas, arquitecturas y canalizaciones ilustrativos. Se pueden ejecutar realizaciones de la instrucción o instrucciones en tales sistemas, arquitecturas y canalizaciones, pero no se limitan a las detalladas.
Formato de instrucción apto para vectores de carácter genérico
Un formato de instrucción apto para vectores es un formato de instrucción adecuado para instrucciones de vector (por ejemplo, hay ciertos campos específicos de operaciones vectoriales). Aunque se describen realizaciones en las que se soportan operaciones tanto vectoriales como escalares a través del formato de instrucción apto para vectores, realizaciones alternativas usan solo operaciones vectoriales en el formato de instrucción apto para vectores.
Las figuras 25A-25B son diagramas de bloques que ilustran un formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción del mismo de acuerdo con realizaciones. La figura 25A es un diagrama de bloques que ilustra un formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción de clase A del mismo de acuerdo con realizaciones; mientras que la figura 25B es un diagrama de bloques que ilustra el formato de instrucción apto para vectores de carácter genérico y plantillas de instrucción de clase B del mismo de acuerdo con realizaciones. Específicamente, un formato de instrucción apto para vectores de carácter genérico 2500 para el que se definen plantillas de instrucción de clase A y de clase B, ambas de las cuales incluyen plantillas de instrucción sin acceso a memoria 2505 y plantillas de instrucción de acceso a memoria 2520. El término genérico en el contexto del formato de instrucción apto para vectores se refiere a que el formato de instrucción no está vinculado a conjunto de instrucciones específico alguno.
Aunque se describirán realizaciones en las que el formato de instrucción apto para vectores soporta lo siguiente: una longitud (o tamaño) de operando de vector de 64 bytes con unas anchuras (o tamaños) de elemento de datos de 32 bits (4 bytes) o 64 bits (8 bytes) (y, por lo tanto, un vector de 64 bytes consiste o bien en 16 elementos de tamaño de palabra doble o bien, como alternativa, en 8 elementos de tamaño de palabra cuádruple); una longitud (o tamaño) de operando de vector de 64 bytes con unas anchuras (o tamaños) de elemento de datos de 16 bits (2 bytes) u 8 bits (1 byte); una longitud (o tamaño) de operando de vector de 32 bytes con unas anchuras (o tamaños) de elemento de datos de 32 bits (4 bytes), 64 bits (8 bytes), 16 bits (2 bytes) u 8 bits (1 byte); y una longitud (o tamaño) de operando de vector de 16 bytes con unas anchuras (o tamaños) de elemento de datos de 32 bits (4 bytes), 64 bits (8 bytes), 16 bits (2 bytes) u 8 bits (1 byte); realizaciones alternativas pueden soportar más, menos y/o diferentes tamaños de operando de vector (por ejemplo, operandos de vector de 256 bytes) con más, menos o diferentes anchuras de elemento de datos (por ejemplo, anchuras de elemento de datos de 128 bits (16 bytes)).
Las plantillas de instrucción de clase A en la figura 25A incluyen: 1) dentro de las plantillas de instrucción sin acceso a memoria 2505 se muestra una plantilla de instrucción de operación de tipo control de redondeo completo sin acceso a memoria 2510 y una plantilla de instrucción de operación de tipo transformada de datos sin acceso a memoria 2515; y 2) dentro de las plantillas de instrucción de acceso a memoria 2520 se muestra una plantilla de instrucción temporal de acceso a memoria 2525 y una plantilla de instrucción no temporal de acceso a memoria 2530. Las plantillas de instrucción de clase B en la figura 25B incluyen: 1) dentro de las plantillas de instrucción sin acceso a memoria 2505 se muestra una plantilla de instrucción de operación de tipo control de redondeo parcial de control de máscara de escritura sin acceso a memoria 2512 y una plantilla de instrucción de operación de tipo vsize de control de máscara de escritura sin acceso a memoria 2517; y 2) dentro de las plantillas de instrucción de acceso a memoria 2520 se muestra una plantilla de instrucción de control de máscara de escritura de acceso a memoria 2527.
El formato de instrucción apto para vectores de carácter genérico 2500 incluye los campos siguientes enumerados a continuación en el orden ilustrado en las figuras 25A-25B.
Campo de formato 2540 - un valor específico (un valor de identificador de formato de instrucción) en este campo identifica de forma exclusiva el formato de instrucción apto para vectores y, por lo tanto, apariciones de instrucciones en el formato de instrucción apto para vectores en flujos de instrucciones. En ese sentido, este campo es opcional en el sentido de que no es necesario para un conjunto de instrucciones que solo tiene el formato de instrucción apto para vectores de carácter genérico.
Campo de operación base 2542 - su contenido distingue diferentes operaciones base.
Campo de índice de registro 2544 - su contenido, directamente o a través de una generación de direcciones, especifica las ubicaciones de los operandos de origen y de destino, ya estén estos en registros o en memoria. Estos incluyen un número suficiente de bits para seleccionar N registros de un archivo de registro P x Q (por ejemplo, 32 x 512, 16 x 128, 32 x 1024, 64 x 1024). Aunque, en una realización, N puede ser hasta tres orígenes y un registro de destino, realizaciones alternativas pueden soportar más o menos orígenes y registros de destino (por ejemplo, pueden soportar hasta dos orígenes en donde uno de estos orígenes también actúa como el destino, pueden soportar hasta tres orígenes en donde uno de estos orígenes también actúa como el destino, puede soportar hasta dos orígenes y un destino).
Campo de modificador 2546 - su contenido distingue apariciones de instrucciones en el formato de instrucción de vector genérico que especifican un acceso a memoria de aquellas que no lo hacen; es decir, entre las plantillas de instrucción sin acceso a memoria 2505 y las plantillas de instrucción de acceso a memoria 2520. Las operaciones de acceso a memoria leen y/o escriben en la jerarquía de memoria (especificando, en algunos casos, las direcciones de origen y/o de destino usando valores en registros), mientras que las operaciones sin acceso a memoria no lo hacen (por ejemplo, el origen y los destinos son registros). Aunque, en una realización, este campo también selecciona entre tres formas diferentes de realizar cálculos de dirección de memoria, realizaciones alternativas pueden soportar más, menos o diferentes formas de realizar cálculos de dirección de memoria.
Campo de operación de aumento 2550 - su contenido distingue cuál de una diversidad de operaciones diferentes se va a realizar además de la operación base. Este campo es específico del contexto. En una realización, este campo se divide en un campo de clase 2568, un campo alfa 2552 y un campo beta 2554. El campo de operación de aumento 2550 permite que se realicen grupos comunes de operaciones en una única instrucción en lugar de en 2, 3 o 4 instrucciones.
Campo de escala 2560 - su contenido permite ajustar a escala el contenido del campo de índice para una generación de direcciones de memoria (por ejemplo, para una generación de direcciones que usa 2escala * índice base).
Campo de desplazamiento 2562A - su contenido se usa como parte de la generación de direcciones de memoria (por ejemplo, para una generación de direcciones que usa 2escala * índice base desplazamiento).
Campo de factor de desplazamiento 2562B (obsérvese que la yuxtaposición del campo de desplazamiento 2562A directamente sobre el campo de factor de desplazamiento 2562B indica que se usa uno u otro) - su contenido se usa como parte de una generación de direcciones; este especifica un factor de desplazamiento que se va a ajustar a escala con el tamaño de un acceso a memoria (N) - en donde N es el número de bytes en el acceso a memoria (por ejemplo, para una generación de direcciones que usa 2escala * índice base desplazamiento ajustado a escala). Los bits de orden bajo redundantes se ignoran y, por lo tanto, el contenido del campo de factor de desplazamiento es multiplicado por el tamaño total de operandos de memoria (N) con el fin de generar el desplazamiento final a usar en el cálculo de una dirección eficaz. El valor de N es determinado por el hardware de procesador en tiempo de ejecución basándose en el campo de código de operación completo 2574 (descrito más adelante en el presente documento) y el campo de manipulación de datos 2554C. El campo de desplazamiento 2562A y el campo de factor de desplazamiento 2562B son opcionales en el sentido de que estos no se usan para las plantillas de instrucción sin acceso a memoria 2505 y/o diferentes realizaciones pueden implementar solo uno o ninguno de los dos.
Campo de anchura de elemento de datos 2564 - su contenido distingue cuál de un número de anchuras de elemento de datos se va a usar (en algunas realizaciones para todas las instrucciones; en otras realizaciones, para solo algunas de las instrucciones). Este campo es opcional en el sentido de que el mismo no es necesario si solo se soporta una anchura de elemento de datos y/o se soportan anchuras de elemento de datos usando algún aspecto de los códigos de operación.
Campo de máscara de escritura 2570 - su contenido controla, de una forma por posición de elemento de datos, si esa posición de elemento de datos en el operando de vector de destino refleja el resultado de la operación base y la operación de aumento. Las plantillas de instrucción de clase A soportan un enmascaramiento de escritura de combinación, mientras que las plantillas de instrucción de clase B soportan un enmascaramiento de escritura tanto de combinación como de puesta a cero. Cuando se combina, las máscaras de vector permiten proteger de actualizaciones cualquier conjunto de elementos en el destino durante la ejecución de cualquier operación (especificada por la operación base y la operación de aumento); en otra realización, conservando el valor antiguo de cada elemento del destino en donde el bit de máscara correspondiente tiene un 0. En contraposición, cuando se pone a cero, las máscaras de vector permiten poner a cero cualquier conjunto de elementos en el destino durante la ejecución de cualquier operación (especificada por la operación base y la operación de aumento); en una realización, un elemento del destino se establece a 0 cuando el bit de máscara correspondiente tiene un valor 0. Un subconjunto de esta funcionalidad es la capacidad de controlar la longitud de vector de la operación que se realiza (es decir, el rango de elementos que se modifican, desde el primero hasta el último); sin embargo, no es necesario que los elementos que se modifican sean consecutivos. Por lo tanto, el campo de máscara de escritura 2570 permite operaciones vectoriales parciales, incluyendo cargas, almacenamientos, aritméticas, lógicas, etc. Aunque se describen realizaciones en las que el contenido del campo de máscara de escritura 2570 selecciona uno de un número de registros de máscara de escritura que contiene la máscara de escritura a usar (y, por lo tanto, el contenido del campo de máscara de escritura 2570 identifica indirectamente el enmascaramiento a realizar), realizaciones alternativas permiten, en su lugar o adicionalmente, que el contenido del campo de escritura de máscara 2570 especifique directamente el enmascaramiento a realizar.
Campo de valor inmediato 2572 - su contenido permite la especificación de un valor inmediato. Este campo es opcional en el sentido de que no está presente en una implementación del formato apto para vectores de carácter genérico que no soporta un valor inmediato y no está presente en instrucciones que no usan un valor inmediato.
Campo de clase 2568 - su contenido distingue entre diferentes clases de instrucciones. Con referencia a las figuras 25A-B, los contenidos de este campo seleccionan entre instrucciones de clase A y de clase B. En las figuras 25A-B, se usan unos cuadrados de esquinas redondeadas para indicar que un valor específico está presente en un campo (por ejemplo, la clase A 2568A y la clase B 2568B para el campo de clase 2568, respectivamente, en las figuras 25A-B).
Plantillas de instrucción de clase A
En el caso de las plantillas de instrucción sin acceso a memoria 2505 de clase A, el campo alfa 2552 se interpreta como un campo RS 2552A, cuyo contenido distingue cuál de los diferentes tipos de operación de aumento se va a realizar (por ejemplo, el redondeo 2552A.1 y la transformada de datos 2552A.2 se especifican, respectivamente, para las plantillas de instrucción de operación de tipo redondeo sin acceso a memoria 2510 y de operación de tipo transformada de datos sin acceso a memoria 2515), mientras que el campo beta 2554 distingue cuál de las operaciones del tipo especificado se va a realizar. En las plantillas de instrucción sin acceso a memoria 2505, no están presentes el campo de escala 2560, el campo de desplazamiento 2562A y el campo de factor de desplazamiento 2562B.
Plantillas de instrucción sin acceso a memoria - operación de tipo control de redondeo completo
En la plantilla de instrucción de operación de tipo control de redondeo completo sin acceso a memoria 2510, el campo beta 2554 se interpreta como un campo de control de redondeo 2554A, cuyo contenido o contenidos proporcionan un redondeo estático. Aunque, en las realizaciones descritas, el campo de control de redondeo 2554A incluye un campo de supresión de todas las excepciones de coma flotante (SAE) 2556 y un campo de control de operación de redondeo 2558, realizaciones alternativas pueden soportar pueden codificar ambos de estos conceptos en el mismo campo o solo tener uno u otro de estos conceptos/campos (por ejemplo, pueden tener solo el campo de control de operación de redondeo 2558).
Campo de SAE 2556 - su contenido distingue si se deshabilita o no la notificación de sucesos de excepción; cuando el contenido del campo de SAE 2556 indica que se habilita una supresión, una instrucción dada no notifica tipo alguno de indicador de excepción de coma flotante y no genera manejador de excepciones de coma flotante alguno.
Campo de control de operación de redondeo 2558 - su contenido distingue cuál de un grupo de operaciones de redondeo realizar (por ejemplo, Redondeo hacia arriba, Redondeo hacia abajo, Redondeo hacia cero y Redondeo hacia el más cercano). Por lo tanto, el campo de control de operación de redondeo 2558 permite el cambio del modo de redondeo de una forma por instrucción. En una realización en la que un procesador incluye un registro de control para especificar modos de redondeo, el contenido del campo de control de operación de redondeo 2550 reemplaza ese valor de registro.
Plantillas de instrucción sin acceso a memoria - operación de tipo transformada de datos
En la plantilla de instrucción de la operación de tipo transformada de datos sin acceso a memoria 2515, el campo beta 2554 se interpreta como un campo de transformada de datos 2554B, cuyo contenido distingue cuál de un número de transformadas de datos se va a realizar (por ejemplo, sin transformada de datos, alineación, radiodifusión).
En el caso de una plantilla de instrucción de acceso a memoria 2520 de clase A, el campo alfa 2552 se interpreta como un campo de sugerencia de expulsión 2552B, cuyo contenido distingue cuál de las sugerencias de expulsión se va a usar (en la figura 25A, se especifican temporal 2552B.1 y no temporal 2552B.2, respectivamente, para la plantilla de instrucción temporal de acceso a memoria 2525 y la plantilla de instrucción no temporal de acceso a memoria 2530), mientras que el campo beta 2554 se interpreta como un campo de manipulación de datos 2554C, cuyo contenido distingue cuál de un número de operaciones de manipulación de datos (también conocidas como primitivas) se va a realizar (por ejemplo, sin manipulación; radiodifusión; conversión ascendente de un origen; y conversión descendente de un destino). Las plantillas de instrucción de acceso a memoria 2520 incluyen el campo de escala 2560 y, opcionalmente, el campo de desplazamiento 2562A o el campo de factor de desplazamiento 2562B.
Las instrucciones de memoria de vectores realizan cargas de vector desde y almacenamientos de vector en memoria, con soporte de conversión. Al igual que con las instrucciones de vector regulares, las instrucciones de memoria de vector transfieren datos desde/hacia la memoria de una forma elemento de datos a elemento de datos, con los elementos que realmente se transfieren dictados por los contenidos de la máscara de vector que se selecciona como máscara de escritura.
Plantillas de instrucción de acceso a memoria - temporal
Los datos temporales son datos que es probable que se reutilicen lo bastante pronto como para beneficiarse de un almacenamiento en memoria caché. Sin embargo, esto es una sugerencia, y diferentes procesadores pueden implementarlo de diferentes formas, incluso ignorando la sugerencia por completo.
Plantillas de instrucción de acceso a memoria - no temporal
Los datos no temporales son datos que es poco probable que se reutilicen lo bastante pronto como para beneficiarse de un almacenamiento en memoria caché en la memoria caché de primer nivel y se les debería dar prioridad para la expulsión. Sin embargo, esto es una sugerencia, y diferentes procesadores pueden implementarlo de diferentes formas, incluso ignorando la sugerencia por completo.
Plantillas de instrucción de clase B
En el caso de las plantillas de instrucción de clase B, el campo alfa 2552 se interpreta como un campo de control de máscara de escritura (Z) 2552C, cuyo contenido distingue si el enmascaramiento de escritura controlado por el campo de máscara de escritura 2570 debería ser una combinación o una puesta a cero.
En el caso de las plantillas de instrucción sin acceso a memoria 2505 de clase B, parte del campo beta 2554 se interpreta como un campo RL 2557A, cuyo contenido distingue cuál de los diferentes tipos de operación de aumento se va a realizar (por ejemplo, el redondeo 2557A.1 y la longitud de vector (VSIZE) 2557A.2 se especifican, respectivamente, para la plantilla de instrucción de operación de tipo control de redondeo parcial de control de máscara de escritura sin acceso a memoria 2512 y la plantilla de instrucción de operación de tipo VSIZE de control de máscara de escritura sin acceso a memoria 2517), mientras que el resto del campo beta 2554 distingue cuál de las operaciones del tipo especificado se va a realizar. En las plantillas de instrucción sin acceso a memoria 2505, no están presentes el campo de escala 2560, el campo de desplazamiento 2562A y el campo de factor de desplazamiento 2562B.
En la plantilla de instrucción de operación de tipo control de redondeo parcial de control de máscara de escritura sin acceso a memoria 2510, el resto del campo beta 2554 se interpreta como un campo de operación de redondeo 2559A y se deshabilita la notificación de sucesos de excepción (una instrucción dada no notifica tipo alguno de indicador de excepción de coma flotante y no genera manejador de excepciones de coma flotante alguno).
Campo de control de operación de redondeo 2559A - exactamente igual que el campo de control de operación de redondeo 2558, su contenido distingue cuál de un grupo de operaciones de redondeo realizar (por ejemplo, Redondeo hacia arriba, Redondeo hacia abajo, Redondeo hacia cero y Redondeo hacia el más cercano). Por lo tanto, el campo de control de operación de redondeo 2559A permite el cambio del modo de redondeo de una forma por instrucción. En una realización en la que un procesador incluye un registro de control para especificar modos de redondeo, el contenido del campo de control de operación de redondeo 2550 reemplaza ese valor de registro.
En la plantilla de instrucción de la operación de tipo VSIZE de control de máscara de escritura sin acceso a memoria 2517, el resto del campo beta 2554 se interpreta como un campo de longitud de vector 2559B, cuyo contenido distingue sobre cuál de un número de longitudes de vector de datos se va a realizar (por ejemplo, 128, 256 o 512 bytes).
En el caso de una plantilla de instrucción de acceso a memoria 2520 de clase B, parte del campo beta 2554 se interpreta como un campo de radiodifusión 2557B, cuyo contenido distingue si se va a realizar o no la operación de manipulación de datos de tipo radiodifusión, mientras que el resto del campo beta 2554 se interpreta como el campo de longitud de vector 2559B. Las plantillas de instrucción de acceso a memoria 2520 incluyen el campo de escala 2560 y, opcionalmente, el campo de desplazamiento 2562A o el campo de factor de desplazamiento 2562B.
Con respecto al formato de instrucción apto para vectores de carácter genérico 2500, se muestra un campo de código de operación completo 2574 que incluye el campo de formato 2540, el campo de operación base 2542 y el campo de anchura de elemento de datos 2564. Aunque se muestra una realización en la que el campo de código de operación completo 2574 incluye todos estos campos, el campo de código de operación completo 2574 incluye menos de todos estos campos en realizaciones que no soportan la totalidad de los mismos. El campo de código de operación completo 2574 proporciona el código de operación (código de op.).
El campo de operación de aumento 2550, el campo de anchura de elemento de datos 2564 y el campo de máscara de escritura 2570 permiten que estas características se especifiquen de una forma por instrucción en el formato de instrucción apto para vectores de carácter genérico.
La combinación de campo de máscara de escritura y campo de anchura de elemento de datos crea instrucciones con tipo ya que permiten aplicar la máscara basándose en diferentes anchuras de elemento de datos.
Las diversas plantillas de instrucción halladas dentro de la clase A y la clase B son beneficiosas en diferentes situaciones. En algunas realizaciones, diferentes procesadores o diferentes núcleos dentro de un procesador pueden soportar solo la clase A, solo la clase B o ambas clases. Por ejemplo, un núcleo fuera de orden de propósito general de desempeño alto destinado a computación de propósito general puede soportar solo la clase B, un núcleo destinado principalmente a gráficos y/o computación científica (de capacidad de proceso) puede soportar solo la clase A, y un núcleo destinado y ambos puede soportar ambas (por supuesto, un núcleo que tiene alguna combinación de plantillas e instrucciones a partir de ambas clases, pero no todas las plantillas e instrucciones a partir de ambas clases, está dentro del alcance de la invención). Además, un único procesador puede incluir múltiples núcleos, todos los cuales soportan la misma clase o en los que diferentes núcleos soportan diferentes clases. Por ejemplo, en un procesador con gráficos y núcleos de propósito general separados, uno de los núcleos de gráficos destinado principalmente a gráficos y/o computación científica puede soportar solo la clase A, mientras que uno o más de los núcleos de propósito general pueden ser núcleos de propósito general de desempeño alto con ejecución fuera de orden y cambio de nombre de registro destinados a computación de propósito general que soportan solo la clase B. Otro procesador que no tiene un núcleo de gráficos separado puede incluir uno más núcleos en orden o fuera de orden de propósito general que soportan tanto la clase A como la clase B. Por supuesto, las características a partir de una clase también se pueden implementar en la otra clase en diferentes realizaciones. Programas escritos en un lenguaje de alto nivel se pondrían (por ejemplo, compilados justo a tiempo o compilados estáticamente) en una diversidad de formas ejecutables diferentes, que incluyen: 1) una forma que tiene solo instrucciones de la clase o clases soportadas por el procesador de destino para su ejecución; o 2) una forma que tiene rutinas alternativas escritas usando diferentes combinaciones de instrucciones de todas las clases y que tiene un código de flujo de control que selecciona las rutinas a ejecutar basándose en las instrucciones soportadas por el procesador que actualmente está ejecutando el código.
Formato de instrucción apto para vectores de carácter específico ilustrativo
La figura 26A es un diagrama de bloques que ilustra un formato de instrucción apto para vectores de carácter específico ilustrativo de acuerdo con realizaciones. La figura 26A muestra un formato de instrucción apto para vectores de carácter específico 2600 que es específico en el sentido de que el mismo especifica la ubicación, el tamaño, la interpretación y el orden de los campos, así como valores para algunos de esos campos. El formato de instrucción apto para vectores de carácter específico 2600 se puede usar para ampliar el conjunto de instrucciones de x86 y, por lo tanto, algunos de los campos son similares o iguales a los usados en el conjunto de instrucciones de x86 existente y la ampliación del mismo (por ejemplo, AVX). Este formato sigue siendo coherente con el campo de codificación de prefijo, el campo de bytes de código de operación real, el campo MOD R/M, el campo SIB, el campo de desplazamiento y los campos inmediatos del conjunto de instrucciones de x86 existente con ampliaciones. Se ilustra los campos a partir de la figura 25A con los que se correlacionan los campos a partir de la figura 26A.
Se debería entender que, aunque se describen realizaciones con referencia al formato de instrucción apto para vectores de carácter específico 2600 en el contexto del formato de instrucción apto para vectores de carácter genérico 2500 con fines ilustrativos, la invención no se limita al formato de instrucción apto para vectores de carácter específico 2600 excepto en donde se reivindique. Por ejemplo, el formato de instrucción apto para vectores de carácter genérico 2500 contempla una diversidad de tamaños posibles para los diversos campos, mientras que el formato de instrucción apto para vectores de carácter específico 2600 se muestra como que tiene campos de tamaños específicos. A modo de ejemplo específico, mientras que el campo de anchura de elemento de datos 2564 se ilustra como un campo de un bit en el formato de instrucción apto para vectores de carácter específico 2600, la invención no se limita a ello (es decir, el formato de instrucción apto para vectores de carácter genérico 2500 contempla otros tamaños del campo de anchura de elemento de datos 2564).
El formato de instrucción apto para vectores de carácter específico 2600 incluye los campos siguientes enumerados a continuación en el orden ilustrado en la figura 26A.
Prefijo EVEX 2602 (bytes 0-3) - se codifica en un formato de cuatro bytes.
Campo de formato 2540 (byte de EVEX 0, bits [7:0]) - el primer byte (byte de EVEX 0) es el campo de formato 2540 y contiene 0x62 (el valor exclusivo usado para distinguir el formato de instrucción apto para vectores en una realización).
Del segundo al cuarto bytes (bytes de EVEX 1-3) incluyen un número de campos de bits que proporcionan una capacidad específica.
Campo REX 2605 (byte de EVEX 1, bits [7-5]) - consiste en un campo de bits EVEX.R (byte de EVEX 1, bit [7] - R), campo de bits EVEX.X (byte de EVEX 1, bit [6] - X) y un campo de bits EVEX.B (byte de EVEX 1, bit [5] - B). Los campos de bits EVEX.R, EVEX.X y EVEX.B proporcionan la misma funcionalidad que los campos de bits VEX correspondientes y se codifican usando la forma de complemento a 1, es decir, ZMM0 se codifica como 1111B, ZMM15 se codifica como 0000B. Otros campos de las instrucciones codifican los tres bits inferiores de los índices de registro como se conoce en la técnica (rrr, xxx y bbb), de tal forma que Rrrr, Xxxx y Bbbb se pueden formar sumando EVEX.R, EVEX.X y EVEX.B.
Campo REX' 2510 - esta es la primera parte del campo REX' 2510 y es el campo de bits EVEX.R' (byte 1 de EVEX, bit [4] - R') que se usa para codificar o bien los 16 superiores o bien los 16 inferiores del conjunto de 32 registros ampliado. En una realización, este bit, junto con otros como se indica a continuación, se almacena en un formato invertido en bits para distinguirlo (en el bien conocido modo de 32 bits de x86) de la instrucción BOUND, cuyo byte de código de operación real es 62, pero no acepta en el campo MOD R/M (descrito a continuación) el valor de 11 en el campo MOD; realizaciones alternativas no almacenan este y los otros bits indicados a continuación en el formato invertido. Se usa un valor de 1 para codificar los 16 registros inferiores. En otras palabras, R'Rrrr se forma combinando EVEX.R', EVEX.R y el otro RRR a partir de otros campos.
Campo de correlación de código de operación 2615 (byte de EVEX 1, bits [3:0] - mmmm) - su contenido codifica un byte de código de operación inicial implícito (0F, 0F 38 o 0F 3).
Campo de anchura de elemento de datos 2564 (byte de EVEX 2, bit [7] - W) - se representa mediante la notación EVEX.W. EVEX.W se usa para definir la granularidad (tamaño) del tipo de datos (o bien elementos de datos de 32 bits o bien elementos de datos de 64 bits).
EVEX.vvvv 2620 (byte de EVEX 2, bits [6:3] - vvvv) - el papel de EVEX.vvvv puede incluir lo siguiente: 1) EVEX.vvvv codifica el primer operando de registro de origen, especificado de forma invertida (complemento a 1) y es válido para instrucciones con 2 o más operandos de origen; 2) EVEX.vvvv codifica el operando de registro de destino, especificado en forma de complemento a 1 para ciertos desplazamientos de vector; o 3) EVEX.vvvv no codifica operando alguno, el campo está reservado y debería contener 1111b. Por lo tanto, el campo EVEX.vvvv 2620 codifica los 4 bits de orden inferior del primer especificador de registro de origen almacenado de forma invertida (complemento a 1). Dependiendo de la instrucción, se usa un campo de bits EVEX diferente adicional para ampliar el tamaño de especificador a 32 registros.
Campo de clase de EVEX.U 2568 (byte de EVEX 2, bit [2] - U) - Si EVEX.U = 0, este indica clase A o EVEX.U0; si EVEX.U = 1, este indica clase B o EVEX.U1.
Campo de codificación de prefijo 2625 (byte de EVEX 2, bits [1:0] - pp) - proporciona bits adicionales para el campo de operación base. Además de proporcionar soporte para las instrucciones SSE heredadas en el formato de prefijo EVEX, este también tiene la ventaja de compactar el prefijo SIMD (en lugar de requerir un byte para expresar el prefijo SIMD, el prefijo EVEX requiere solo 2 bits). En una realización, para soportar instrucciones de SSE heredadas que usan un prefijo SIMD (66H, F2H, F3H) tanto en el formato heredado como en el formato de prefijo EVEX, estos prefijos SIMD heredados se codifican en el campo de codificación de prefijo SIMD; y, en tiempo de ejecución, se expanden al prefijo SIMD heredado antes de proporcionarse a la PLA del descodificador (de tal modo que la PLA pueda ejecutar tanto el formato heredado como el de EVEX de estas instrucciones heredadas sin modificaciones). Aunque instrucciones más nuevas podrían usar el contenido del campo de codificación de prefijo EVEX directamente como una ampliación de código de operación, ciertas realizaciones se expanden de una forma similar por razones de coherencia, pero permiten que diferentes significados sean especificados por estos prefijos SIMD heredados. Una realización alternativa puede rediseñar la PLA para soportar las codificaciones de prefijo SIMD de 2 bits y, por lo tanto, no requieren la expansión.
Campo alfa 2552 (byte de EVEX 3, bit [7] - EH; también conocido como EVEX.EH, EVEX.rs, EVEX.RL, EVEX.control de máscara de escritura y EVEX.N; también ilustrado con a) - como se ha descrito previamente, este campo es específico del contexto.
Campo beta 2554 (byte de EVEX 3, bits [6:4] - SSS, también conocido como EVEX.s2-0, EVEX.r2-0, EVEX.rr1, EVEX.LL0, EVEX.LLB; también ilustrado con ppp) - como se ha descrito previamente, este campo es específico del contexto.
Campo REX' 2510 - este es el resto del campo REX' y es el campo de bits EVEX.V' (byte 3 de EVEX, bit [3] - V') que se puede usar para codificar o bien los 16 superiores o bien los 16 inferiores del conjunto de 32 registros ampliado. Este bit se almacena en un formato invertido en bits. Se usa un valor de 1 para codificar los 16 registros inferiores. En otras palabras, V'VVVV se forma combinando EVEX.V', EVEX.vvvv.
Campo de máscara de escritura 2570 (byte de EVEX 3, bits [2:0] - kkk) - su contenido especifica el índice de un registro en los registros de máscara de escritura como se ha descrito previamente. En una realización, el valor específico EVEX.kkk = 000 tiene un comportamiento especial que implica que no se usa máscara de escritura alguna para la instrucción particular (esto se puede implementar de una diversidad de formas, incluyendo el uso de una máscara de escritura cableada físicamente a todo unos o hardware que sortea el hardware de enmascaramiento).
El campo de código de operación real 2630 (byte 4) también se conoce como el byte de código de operación. Parte del código de operación se especifica en este campo.
El campo MOD R/M 2640 (byte 5) incluye el campo MOD 2642, el campo Reg 2644 y el campo R/M 2646. Como se ha descrito previamente, el contenido del campo MOD 2642 distingue entre operaciones de acceso a memoria y sin acceso a memoria. El papel del campo Reg 2644 se puede resumir en dos situaciones: codificar o bien el operando de registro de destino o un operando de registro de origen o tratarse como una ampliación de código de operación y no usarse para codificar operando de instrucción alguno. El papel del campo R/M 2646 puede incluir lo siguiente: codificar el operando de instrucción que hace referencia a una dirección de memoria o codificar o bien el operando de registro de destino o bien un operando de registro de origen.
Byte de Escala, Índice, Base (SIB) (byte 6) - como se ha descrito previamente, el contenido del SIB 2650 se usa para una generación de direcciones de memoria. SIB.xxx 2654 y SIB.bbb 2656 - se ha hecho referencia previamente a los contenidos de estos campos con respecto a los índices de registro Xxxx y Bbbb.
Campo de desplazamiento 2562A (bytes 7-10) - cuando el campo MOD 2642 contiene un 10, los bytes 7-10 son el campo de desplazamiento 2562A, y este funciona igual que el desplazamiento de 32 bits heredado (disp32) y funciona con una granularidad de bytes.
Campo de factor de desplazamiento 2562B (byte 7) - cuando el campo MOD 2642 contiene un 01, el byte 7 es el campo de factor de desplazamiento 2562B. La ubicación de este campo es la misma que la del desplazamiento de 8 bits de conjunto de instrucciones de x86 heredado (disp8), que funciona con una granularidad de bytes. Debido a que disp8 se amplía con signo, este solo puede abordar desplazamientos entre -128 y 127 bytes; en términos de líneas de memoria caché de 64 bytes, disp8 usa 8 bits que se pueden establecer a solo cuatro valores realmente útiles -128, -64, 0 y 64; debido a que a menudo se necesita un rango mayor, se usa disp32; sin embargo, disp32 requiere 4 bytes. A diferencia de disp8 y disp32, el campo de factor de desplazamiento 2562B es una reinterpretación de disp8; cuando se usa el campo de factor de desplazamiento 2562B, el desplazamiento real es determinado por el contenido del campo de factor de desplazamiento multiplicado por el tamaño del acceso de operando de memoria (N). Este tipo de desplazamiento se denomina disp8 * N. Esto reduce la longitud de instrucción promedio (se usa un único byte para el desplazamiento, pero con un rango mucho mayor). Tal desplazamiento comprimido supone que el desplazamiento eficaz es un múltiplo de la granularidad del acceso a memoria y, por lo tanto, no es necesario codificar los bits de orden bajo redundantes del desplazamiento de dirección. En otras palabras, el campo de factor de desplazamiento 2562B sustituye el desplazamiento de 8 bits de conjunto de instrucciones de x86 heredado. Por lo tanto, el campo de factor de desplazamiento 2562B se codifica de la misma forma que un desplazamiento de 8 bits de conjunto de instrucciones de x86 (por lo que no hay cambio alguno en las reglas de codificación de ModRM/SIB), con la única excepción de que disp8 se sobrecarga a disp8 * N. En otras palabras, no hay cambio alguno en las reglas de codificación o en las longitudes de codificación, sino solo en la interpretación del valor de desplazamiento por hardware (que necesita ajustar a escala el desplazamiento con el tamaño del operando de memoria para obtener un desplazamiento de dirección byte a byte). El campo de valor inmediato 2572 funciona como se ha descrito previamente.
Campo de código de operación completo
La figura 26B es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico 2600 que constituyen el campo de código de operación completo 2574 de acuerdo con una realización. Específicamente, el campo de código de operación completo 2574 incluye el campo de formato 2540, el campo de operación base 2542 y el campo de anchura (W) de elemento de datos 2564. El campo de operación base 2542 incluye el campo de codificación de prefijo 2625, el campo de correlación de código de operación 2615 y el campo de código de operación real 2630.
Campo de índice de registro
La figura 26C es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico 2600 que constituyen el campo de índice de registro 2544 de acuerdo con una realización. Específicamente, el campo de índice de registro 2544 incluye el campo de REX 2605, el campo de REX' 2610, el campo MODR/M.reg 2644, el campo MODR/Mr/m 2646, el campo VVVV 2620, el campo xxx 2654 y el campo bbb 2656.
Campo de operación de aumento
La figura 26D es un diagrama de bloques que ilustra los campos del formato de instrucción apto para vectores de carácter específico 2600 que constituyen el campo de operación de aumento 2550 de acuerdo con una realización. Cuando el campo de clase (U) 2568 contiene un 0, ello significa EVEX.U0 (clase A 2568A); cuando este contiene un 1, ello significa EVEX.U1 (clase B 2568B). Cuando U = 0 y el campo MOD 2642 contiene un 11 (lo que significa una operación sin acceso a memoria), el campo alfa 2552 (byte de EVEX 3, bit [7] - EH) se interpreta como el campo rs 2552A. Cuando el campo rs 2552A contiene un 1 (redondeo 2552A.1), el campo beta 2554 (byte de EVEX 3, bits [6:4] - SSS) se interpreta como el campo de control de redondeo 2554A. El campo de control de redondeo 2554A incluye un campo de SAE 2556 de un bit y un campo de operación de redondeo 2558 de dos bits. Cuando el campo rs 2552a contiene un 0 (transformada de datos 2552A.2), el campo beta 2554 (byte de EVEX 3, bits [6:4] - SSS) se interpreta como un campo de transformada de datos 2554A de tres bits. Cuando U = 0 y el campo MOD 2642 contiene 00, 01 o 10 (lo que significa una operación de acceso a memoria), el campo alfa 2552 (byte de EVEX 3, bits [7] - EH) se interpreta como el campo de sugerencia de expulsión (EH) 2552B y el campo beta 2554 (byte de EVEX 3, bits [6:4] -SSS) se interpreta como un campo de manipulación de datos 2554C de tres bits.
Cuando U = 1, el campo alfa 2552 (byte de EVEX 3, bit [7] - EH) se interpreta como el campo de control de máscara de escritura (Z) 2552C. Cuando U = 1 y el campo MOD 2642 contiene un 11 (lo que significa una operación sin acceso a memoria), parte del campo beta 2554 (byte de EVEX 3, bit [4] - S0) se interpreta como el campo RL 2557A; cuando este contiene un 1 (redondeo 2557A.1), el resto del campo beta 2554 (byte de EVEX 3, bit [6-5] - S2-1) se interpreta como el campo de operación de redondeo 2559A, mientras que, cuando el campo RL 2557A contiene un 0 (VSIZE 2557A.2), el resto del campo beta 2554 (byte de EVEX 3, bit [6-5] - S2-1) se interpreta como el campo de longitud de vector 2559B (byte de EVEX 3, bit [6-5] - L1-0). Cuando U = 1 y el campo MOD 2642 contiene 00, 01 o 10 (lo que significa una operación de acceso a memoria), el campo beta 2554 (byte de EVEX 3, bits [6:4] - SSS) se interpreta como el campo de longitud de vector 2559B (byte de EVEX 3, bit [6-5] - L1-0) y el campo de radiodifusión 2557B (byte de EVEX 3, bit [4] - B).
Arquitectura de registro ilustrativa
La figura 27 es un diagrama de bloques de una arquitectura de registro 2700 de acuerdo con una realización. En la realización ilustrada, hay 32 registros de vector 2710 que tienen una anchura de 512 bits; estos registros se referencian como zmm0 a zmm31. Los 256 bits de orden inferior de los 16 registros zmm inferiores se superponen sobre los registros ymm0-16. Los 128 bits de orden inferior de los 16 registros zmm inferiores (los 128 bits de orden inferior de los registros ymm) se superponen sobre los registros xmm0-15. El formato de instrucción apto para vectores de carácter específico 2600 opera sobre estos archivos de registro superpuestos, como se ilustra en las tablas a continuación.
Figure imgf000030_0001
________
En otras palabras, el campo de longitud de vector 2559B selecciona entre una longitud máxima y otras una o más longitudes más cortas, en donde cada una de tales longitudes más cortas es la mitad de la longitud de la longitud precedente; y las plantillas de instrucciones sin el campo de longitud de vector 2559B operan sobre la longitud de vector máxima. Además, en una realización, las plantillas de instrucción de clase B del formato de instrucción apto para vectores de carácter específico 2600 operan sobre datos de coma flotante de precisión simple/doble escalares o empaquetados y datos enteros escalares o empaquetados. Las operaciones escalares son operaciones realizadas sobre la posición de elemento de datos del orden más bajo en un registro zmm/ymm/xmm; las posiciones de elemento de datos de orden superior o bien se dejan igual que como estaban antes de la instrucción o bien se ponen a cero dependiendo de la realización.
Registros de máscara de escritura 2715 - en la realización ilustrada, hay 8 registros de máscara de escritura (de k0 a k7), cada uno de un tamaño de 64 bits. En una realización alternativa, los registros de máscara de escritura 2715 tienen un tamaño de 16 bits. Como se ha descrito previamente, en una realización, el registro de máscara de vector k0 no se puede usar como una máscara de escritura; cuando la codificación que normalmente indicaría k0 se usa para una máscara de escritura, este selecciona una máscara de escritura cableada físicamente de 0xFFFF, deshabilitando en la práctica el enmascaramiento de escritura para esa instrucción.
Registros de propósito general 2725 - en la realización ilustrada, hay dieciséis registros de propósito general de 64 bits que se usan junto con los modos de direccionamiento de x86 existentes para direccionar operandos de memoria. A estos registros se hace referencia mediante los nombres RAX, RBX, Rc X, RDX, RBP, RSI, RDI, RSP y de R8 a R15.
Archivo de registro de pila de coma flotante escalar (pila de x87) 2745, en el que se establece un alias para el archivo de registro plano de entero empaquetado MMX 2750 - en la realización ilustrada, la pila de x87 es una pila de ocho elementos usada para realizar operaciones de coma flotante escalar sobre datos de coma flotante de 32/64/80 bits usando la ampliación del conjunto de instrucciones de x87; mientras que los registros MMX se usan para realizar operaciones sobre datos enteros empaquetados de 64 bits, así como para contener operandos para algunas operaciones realizadas entre los registros MMX y XMM.
Realizaciones alternativas pueden usar registros más anchos o más estrechos. Adicionalmente, realizaciones alternativas pueden usar más, menos o diferentes archivos de registro y registros.
Arquitecturas de núcleo, procesadores y arquitecturas de ordenador ilustrativas
Los núcleos de procesador se pueden implementar de diferentes formas, para diferentes fines y en diferentes procesadores. Por ejemplo, las implementaciones de tales núcleos pueden incluir: 1) un núcleo en orden de propósito general destinado a computación de propósito general; 2) un núcleo fuera de orden de propósito general de desempeño alto destinado a computación de propósito general; 3) un núcleo de propósito especial destinado principalmente a gráficos y/o computación científica (de capacidad de proceso). Las implementaciones de diferentes procesadores pueden incluir: 1) una CPU que incluye uno o más núcleos en orden de propósito general destinados a computación de propósito general y/o uno o más núcleos fuera de orden de propósito general destinados a computación de propósito general; y 2) un coprocesador que incluye uno o más núcleos de propósito especial destinados principalmente a cálculos gráficos y/o científicos (de capacidad de proceso). Tales procesadores diferentes conducen a diferentes arquitecturas de sistema informático, que pueden incluir: 1) el coprocesador en un chip separado de la CPU; 2) el coprocesador en una pastilla separada en el mismo encapsulado que una CPU; 3) el coprocesador en la misma pastilla que una CPU (en cuyo caso, un coprocesador de este tipo se denomina, a veces, lógica de propósito especial, tal como gráficos integrados y/o lógica científica (de capacidad de proceso), o como núcleos de propósito especial); y 4) un sistema en un chip que puede incluir, en la misma pastilla, la CPU descrita (denominada, a veces, el núcleo o núcleos de aplicación o procesador o procesadores de aplicación), el coprocesador descrito anteriormente y una funcionalidad adicional. A continuación, se describen arquitecturas de núcleo ilustrativas, seguidas de descripciones de procesadores y arquitecturas de ordenador ilustrativas.
Arquitecturas de núcleo ilustrativas
Diagrama de bloques de núcleo en orden y fuera de orden
La figura 28A es un diagrama de bloques que ilustra tanto una canalización en orden ilustrativa como una canalización de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativa de acuerdo con realizaciones. La figura 28B es un diagrama de bloques que ilustra tanto una realización ilustrativa de un núcleo de arquitectura en orden como un núcleo de arquitectura de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativo a incluir en un procesador de acuerdo con realizaciones. Los recuadros con líneas de trazo continuo en las figuras 28A-B ilustran la canalización en orden y el núcleo en orden, mientras que la adición opcional de los recuadros con líneas de trazo discontinuo ilustra la canalización y el núcleo de cambio de nombre de registro, emisión/ejecución fuera de orden. Debido a que el aspecto en orden es un subconjunto del aspecto fuera de orden, se describirá el aspecto fuera de orden.
En la figura 28A, una canalización de procesador 2800 incluye una fase de recuperación 2802, una fase de descodificación de longitud 2804, una fase de descodificación 2806, una fase de asignación 2808, una fase de cambio de nombre 2810, una fase de programación (también conocida como despacho o emisión) 2812, una fase de lectura de registro/lectura de memoria 2814, una fase de ejecución 2816, una fase de escritura no simultánea/escritura en memoria 2818, una fase de manejo de excepciones 2822 y una fase de confirmación 2824.
La figura 28B muestra el núcleo de procesador 2890 que incluye una unidad de extremo frontal 2830 acoplada a una unidad de motor de ejecución 2850, y ambas se acoplan a una unidad de memoria 2870. El núcleo 2890 puede ser un núcleo de informática de conjunto de instrucciones reducido (RISC), un núcleo de informática de conjunto de instrucciones complejo (CISC), un núcleo de palabras de instrucción muy largas (VLIW) o un tipo de núcleo híbrido o alternativo. Como otra opción más, el núcleo 2890 puede ser un núcleo de propósito especial, tal como, por ejemplo, un núcleo de red o de comunicación, un motor de compresión, un núcleo de coprocesador, un núcleo de unidad de procesamiento de gráficos informáticos de propósito general (GPGPU), un núcleo de gráficos o similares.
La unidad de extremo frontal 2830 incluye una unidad de predicción de bifurcaciones 2832 acoplada a una unidad de memoria caché de instrucciones 2834, que se acopla a una memoria intermedia de traducción adelantada (TLB) de instrucciones 2836, que se acopla a una unidad de recuperación de instrucciones 2838, que se acopla a una unidad de descodificación 2840. La unidad de descodificación 2840 (o descodificador) puede descodificar instrucciones y generar como una salida una o más microoperaciones, puntos de entrada de microcódigo, microinstrucciones, otras instrucciones u otras señales de control, que se descodifican a partir de, o que reflejan de otro modo, o se derivan de, las instrucciones originales. La unidad de descodificación 2840 se puede implementar usando diversos mecanismos diferentes. Los ejemplos de mecanismos adecuados incluyen, pero no se limitan a, tablas de consulta, implementaciones en hardware, matrices lógicas programables (PLA), memorias de solo lectura (ROM) de microcódigo, etc. En una realización, el núcleo 2890 incluye una ROM de microcódigo u otro medio que almacena microcódigo para ciertas macroinstrucciones (por ejemplo, en la unidad de descodificación 2840 o, de lo contrario, dentro de la unidad de extremo frontal 2830). La unidad de descodificación 2840 se acopla a una unidad de cambio de nombre/asignación 2852 en la unidad de motor de ejecución 2850.
La unidad de motor de ejecución 2850 incluye la unidad de cambio de nombre/asignación 2852 acoplada a una unidad de retiro 2854 y un conjunto de una unidad o más unidades de programador 2856. La unidad o unidades de programador 2856 representan cualquier número de programadores diferentes, incluyendo estaciones de reservas, ventana de instrucciones central, etc. La unidad o unidades de programador 2856 se acoplan a la unidad o unidades de archivo o archivos de registro físico 2858. Cada una de las unidades de archivo o archivos de registro físico 2858 representa uno o más archivos de registro físico, unos diferentes de los cuales almacenan uno o más tipos de datos diferentes, tales como entero escalar, coma flotante escalar, entero empaquetado, coma flotante empaquetada, entero vectorial, coma flotante vectorial, estado (por ejemplo, un puntero de instrucción que es la dirección de la siguiente instrucción a ejecutar), etc. En una realización, la unidad de archivo o archivos de registro físico 2858 comprende una unidad de registros de vector, una unidad de registros de máscara de escritura y una unidad de registros de escalar. Estas unidades de registro pueden proporcionar registros de vector arquitectónicos, registros de máscara de vector y registros de propósito general. La unidad o unidades de archivo o archivos de registro físico 2858 son solapadas por la unidad de retiro 2854 para ilustrar diversas formas en las que se pueden implementar un cambio de nombre de registro y una ejecución fuera de orden (por ejemplo, usando una memoria intermedia o memorias intermedias de reordenación y un archivo o archivos de registro de retiro; usando un archivo o archivos futuros, una memoria o memorias de historial y un archivo o archivos de registro de retiro; usando correlaciones de registro y una agrupación de registros; etc.). La unidad de retiro 2854 y la unidad o unidades de archivo o archivos de registro físico 2858 se acoplan a la agrupación o agrupaciones de ejecución 2860. La agrupación o agrupaciones de ejecución 2860 incluye un conjunto de una o más unidades de ejecución 2862 y un conjunto de una o más unidades de acceso a memoria 2864. Las unidades de ejecución 2862 pueden realizar diversas operaciones (por ejemplo, desplazamientos, suma, resta, multiplicación) y sobre diversos tipos de datos (por ejemplo, coma flotante escalar, entero empaquetado, coma flotante empaquetada, entero vectorial, coma flotante vectorial). Aunque algunas realizaciones pueden incluir un número de unidades de ejecución dedicadas a funciones o conjuntos de funciones específicos, otras realizaciones pueden incluir solo una unidad de ejecución o múltiples unidades de ejecución que realizan, todas ellas, todas las funciones. La unidad o unidades de programador 2856, la unidad o unidades de archivo o archivos de registro físico 2858 y la agrupación o agrupaciones de ejecución 2860 se muestran como que son posiblemente una pluralidad debido a que ciertas realizaciones crean canalizaciones separadas para ciertos tipos de datos/operaciones (por ejemplo, una canalización de entero escalar, una canalización de coma flotante escalar/entero empaquetado/coma flotante empaquetada/entero vectorial/coma flotante vectorial y/o una canalización de acceso a memoria que tienen, cada una, sus propias unidad de programador, unidad de archivo o archivos de registro físico y/o agrupación de ejecución - y, en el caso de una canalización de acceso a memoria separada, se implementan ciertas realizaciones en las que solo la agrupación de ejecución de esta canalización tiene la unidad o unidades de acceso a memoria 2864). También se debería entender que, cuando se usan canalizaciones separadas, una o más de estas canalizaciones pueden ser de emisión/ejecución fuera de orden y, el resto, en orden.
El conjunto de unidades de acceso a memoria 2864 se acopla a la unidad de memoria 2870, que incluye una unidad de TLB de datos 2872 acoplada a una unidad de memoria caché de datos 2874 acoplada a una unidad de memoria caché de nivel 2 (L2) 2876. En una realización ilustrativa, las unidades de acceso a memoria 2864 pueden incluir una unidad de carga, una unidad de dirección de almacenamiento y una unidad de datos de almacenamiento, cada una de las cuales se acopla a la unidad de TLB de datos 2872 en la unidad de memoria 2870. La unidad de memoria caché de instrucciones 2834 se acopla adicionalmente a una unidad de memoria caché de nivel 2 (L2) 2876 en la unidad de memoria 2870. La unidad de memoria caché de L2 2876 se acopla a otros uno o más niveles de memoria caché y, finalmente, a una memoria principal.
A modo de ejemplo, la arquitectura de núcleo de cambio de nombre de registro, emisión/ejecución fuera de orden ilustrativa puede implementar la canalización 2800 como sigue: 1) la recuperación de instrucciones 2838 realiza las fases de recuperación y de descodificación de longitud 2802 y 2804; 2) la unidad de descodificación 2840 realiza la fase de descodificación 2806; 3) la unidad de cambio de nombre/asignación 2852 realiza la fase de asignación 2808 y la fase de cambio de nombre 2810; 4) la unidad o unidades de programador 2856 realizan la fase de programación 2812; 5) la unidad o unidades de archivo o archivos de registro físico 2858 y la unidad de memoria 2870 realizan la fase de lectura de registro/lectura de memoria 2814; la agrupación de ejecución 2860 realiza la fase de ejecución 2816; 6) la unidad de memoria 2870 y la unidad o unidades de archivo o archivos de registro físico 2858 realizan la fase de escritura no simultánea/escritura en memoria 2818; 7) diversas unidades pueden estar implicadas en la fase de manejo de excepciones 2822; y 8) la unidad de retiro 2854 y la unidad o unidades de archivo o archivos de registro físico 2858 realizan la fase de confirmación 2824.
El núcleo 2890 puede soportar uno o más conjuntos de instrucciones (por ejemplo, el conjunto de instrucciones de x86 (con algunas ampliaciones que se han añadido con versiones más nuevas); el conjunto de instrucciones MIPS de MIPS Technologies de Sunnyvale, CA; el conjunto de instrucciones ARM (con ampliaciones adicionales opcionales tales como NEON) de ARM Holdings de Sunnyvale, CA), incluyendo la instrucción o instrucciones descritas en el presente documento. En una realización, el núcleo 2890 incluye lógica para soportar una ampliación de conjunto de instrucciones de datos empaquetados (por ejemplo, AVX1, AVX2), permitiendo de ese modo que las operaciones usadas por muchas aplicaciones multimedios se realicen usando datos empaquetados.
Se debería entender que el núcleo puede soportar multiproceso (ejecutar dos o más conjuntos paralelos de operaciones o subprocesos), y puede hacer esto de una diversidad de formas, incluyendo multiproceso segmentado en el tiempo, multiproceso simultáneo (en donde un único núcleo físico proporciona un núcleo lógico para cada uno de los subprocesos para los que ese núcleo físico está sometiendo a multiproceso simultáneamente), o una combinación de los mismos (por ejemplo, recuperación y descodificación segmentadas en el tiempo y multiproceso simultáneo a continuación de lo anterior, tal como en la tecnología Hyperthreading de Intel®).
Aunque el cambio de nombre de registros se describe en el contexto de una ejecución fuera de orden, se debería entender que el cambio de nombre de registros se puede usar en una arquitectura en orden. Aunque la realización ilustrada del procesador también incluye unidades de memoria caché de instrucciones y de datos 2834/2874 separadas y una unidad de memoria caché de L22876 compartida, realizaciones alternativas pueden tener una única memoria caché interna tanto para instrucciones como para datos, tal como, por ejemplo, una memoria caché interna de nivel 1 (L1) o múltiples niveles de memoria caché interna. En algunas realizaciones, el sistema puede incluir una combinación de una memoria caché interna y una memoria caché externa que es externa al núcleo y/o al procesador. Como alternativa, toda la memoria caché puede ser externa al núcleo y/o al procesador.
Arquitectura de núcleo en orden ilustrativa específica
Las figuras 29A-B ilustran un diagrama de bloques de una arquitectura de núcleo en orden ilustrativa más específica, cuyo núcleo sería uno de varios bloques lógicos (incluyendo otros núcleos del mismo tipo y/o de diferentes tipos) en un chip. Los bloques lógicos se comunican a través de una red de interconexión de ancho de banda alto (por ejemplo, una red en anillo) con alguna lógica de función fija, interfaces de E/S de memoria y otra lógica de E/S necesaria, dependiendo de la aplicación.
La figura 29A es un diagrama de bloques de un único núcleo de procesador, junto con su conexión a la red de interconexión integrada en pastilla 2902 y con su subconjunto local de la memoria caché de nivel 2 (L2) 2904, de acuerdo con realizaciones. En una realización, un descodificador de instrucciones 2900 soporta el conjunto de instrucciones de x86 con una ampliación de conjunto de instrucciones de datos empaquetados. Una memoria caché de L1 2906 permite accesos de latencia baja a memoria caché a las unidades de escalares y de vectores. Aunque en una realización (para simplificar el diseño), una unidad de escalares 2908 y una unidad de vectores 2910 usan conjuntos de registros separados (respectivamente, los registros de escalar 2912 y los registros de vector 2914) y los datos transferidos entre los mismos se escriben en memoria y entonces se vuelven a leer desde una memoria caché de nivel 1 (L1) 2906, realizaciones alternativas pueden usar un enfoque diferente (por ejemplo, usar un único conjunto de registros o incluir una ruta de comunicación que permita que se transfieran datos entre los dos archivos de registro sin que se escriban y se vuelvan a leer).
El subconjunto local de la memoria caché de L2 2904 es parte de una memoria caché de L2 global que se divide en subconjuntos locales separados, uno por núcleo de procesador. Cada núcleo de procesador tiene una ruta de acceso directo a su propio subconjunto local de la memoria caché de L22904. Los datos leídos por un núcleo de procesador se almacenan en su subconjunto de memoria caché de L2 2904 y se puede acceder a los mismos rápidamente, en paralelo con que otros núcleos de procesador accedan a sus propios subconjuntos de memoria caché de L2 locales. Los datos escritos por un núcleo de procesador se almacenan en su propio subconjunto de memoria caché de L22904 y se eliminan de otros subconjuntos, si es necesario. La red en anillo asegura una coherencia para datos compartidos. La red en anillo es bidireccional para permitir que agentes tales como núcleos de procesador, memorias caché de L2 y otros bloques lógicos se comuniquen entre sí dentro del chip. Cada ruta de datos de anillo tiene 1012 bits de anchura por dirección.
La figura 29B es una vista ampliada de parte del núcleo de procesador en la figura 29A de acuerdo con realizaciones. La figura 29B incluye una memoria caché de datos de L1 2906A parte de la memoria caché de L1 2904, así como más detalles con respecto a la unidad de vectores 2910 y los registros de vector 2914. Específicamente, la unidad de vectores 2910 es una unidad de procesamiento de vectores (VPU) de anchura 16 (véase la ALU 2928 de anchura 16), que ejecuta una o más de instrucciones de números enteros, flotantes de precisión simple y flotantes de precisión doble. La VPU soporta la alineación de las entradas de registro con la unidad de alineación 2920, la conversión numérica con las unidades de conversión numérica 2922A-B y la replicación con la unidad de replicación 2924 en la entrada de memoria. Los registros de máscara de escritura 2926 permiten afirmar escrituras vectoriales resultantes.
La figura 30 es un diagrama de bloques de un procesador 3000 que puede tener más de un núcleo, puede tener un controlador de memoria integrado y puede tener gráficos integrados de acuerdo con realizaciones. Los recuadros con líneas de trazo continuo en la figura 30 ilustran un procesador 3000 con un único núcleo 3002A, un agente de sistema 3010, un conjunto de una o más unidades de controlador de bus 3016, mientras que la adición opcional de los recuadros con líneas de trazo discontinuo ilustra un procesador 3000 alternativo con múltiples núcleos 3002A-N, un conjunto de una unidad o más unidades de controlador de memoria integrado 3014 en la unidad de agente de sistema 3010 y la lógica de propósito especial 3008.
Por lo tanto, diferentes implementaciones del procesador 3000 pueden incluir: 1) una CPU con la lógica de propósito especial 3008 que es una lógica de gráficos y/o científica (de capacidad de proceso) integrada (que puede incluir uno o más núcleos), y los núcleos 3002A-N que son uno o más núcleos de propósito general (por ejemplo, núcleos en orden de propósito general, núcleos fuera de orden de propósito general, una combinación de los dos); 2) un coprocesador con los núcleos 3002A-N que son un gran número de núcleos de propósito especial destinados principalmente a cálculos gráficos y/o científicos (de capacidad de proceso); y 3) un coprocesador con los núcleos 3002A-N que son un gran número de núcleos en orden de propósito general. Por lo tanto, el procesador 3000 puede ser un procesador de propósito general, un coprocesador o un procesador de propósito especial, tal como, por ejemplo, un procesador de red o de comunicación, un motor de compresión, un procesador de gráficos, una GPGPU (unidad de procesamiento de gráficos de propósito general), un coprocesador de muchos núcleos integrados (MIC) de capacidad de proceso alta (que incluye 30 o más núcleos), un procesador integrado o similar. El procesador se puede implementar en uno o más chips. El procesador 3000 puede ser parte de y/o se puede implementar sobre uno o más sustratos usando cualquiera de un número de tecnologías de proceso, tales como, por ejemplo, BiCMOS, CMOS o NMOS.
La jerarquía de memoria incluye uno o más niveles de memoria caché dentro de los núcleos, un conjunto o una o más unidades de memoria caché compartidas 3006 y memoria externa (no mostrada) acoplada al conjunto de unidades de controlador de memoria integrado 3014. El conjunto de unidades de memoria caché compartidas 3006 puede incluir una o más memorias caché de nivel medio, tales como de nivel 2 (L2), de nivel 3 (L3), de nivel 4 (L4) o de otros niveles de memoria caché, una memoria caché de último nivel (LLC) y/o combinaciones de las mismas. Aunque, en una realización, una unidad de interconexión basada en anillo 3012 interconecta la lógica de propósito especial 3008 (la lógica de gráficos integrada es un ejemplo y también se denomina en el presente documento lógica de propósito especial), el conjunto de unidades de memoria caché compartidas 3006 y la unidad de agente de sistema 3010/unidad o unidades de controlador de memoria integrado 3014, realizaciones alternativas pueden usar cualquier número de técnicas bien conocidas para interconectar tales unidades. En una realización, se mantiene la coherencia entre una o más unidades de memoria caché 3006 y los núcleos 3002A-N.
En algunas realizaciones, uno o más de los núcleos 3002A-N son capaces de multiproceso. El agente de sistema 3010 incluye aquellos componentes que coordinan y hacen funcionar los núcleos 3002A-N. La unidad de agente de sistema 3010 puede incluir, por ejemplo, una unidad de control de alimentación (PCU) y una unidad de visualización. La PCU puede ser o incluir una lógica y unos componentes necesarios para regular el estado de alimentación de los núcleos 3002A-N y la lógica de propósito especial 3008. La unidad de visualización es para accionar uno o más visualizadores conectados externamente.
Los núcleos 3002A-N pueden ser homogéneos o heterogéneos en términos del conjunto de instrucciones de arquitectura; es decir, dos o más de los núcleos 3002A-N pueden ser capaces de ejecutar el mismo conjunto de instrucciones, mientras que otros pueden ser capaces de ejecutar solo un subconjunto de ese conjunto de instrucciones o un conjunto de instrucciones diferente.
Arquitecturas de ordenador ilustrativas
Las figuras 31-34 son diagramas de bloques de arquitecturas de ordenador ilustrativas. También son adecuados otros diseños y configuraciones de sistema conocidos en las materias para portátiles, equipos de sobremesa, PC portátiles, asistentes digitales personales, estaciones de trabajo para ingeniería, servidores, dispositivos de red, concentradores de red, conmutadores, procesadores integrados, procesadores de señales digitales (DSP), dispositivos de gráficos, dispositivos de videojuegos, descodificadores de salón, microcontroladores, teléfonos celulares, reproductores de medios portátiles, dispositivos de mano y diversos otros dispositivos electrónicos. En general, son generalmente adecuados una enorme diversidad de sistemas o dispositivos electrónicos capaces de incorporar un procesador y/u otra lógica de ejecución como se divulga en el presente documento.
Haciendo referencia a continuación a la figura 31, se muestra un diagrama de bloques 3100 de un sistema de acuerdo con una realización de la presente invención. El sistema 3100 puede incluir uno o más procesadores 3110, 3115, que se acoplan a un concentrador de controlador 3120. En una realización, el concentrador de controlador 3120 incluye un concentrador de controlador de memoria de gráficos (GMCH) 3190 y un Concentrador de Entrada/Salida (IOH) 3150 (que pueden estar en chips separados); el GMCH 3190 incluye controladores de memoria y de gráficos a los que se acoplan la memoria 3140 y un coprocesador 3145; el IOH 3150 acopla los dispositivos de entrada/salida (E/S) 3160 al GMCH 3190. Como alternativa, uno o ambos de los controladores de memoria y de gráficos están integrados dentro del procesador (como se describe en el presente documento), la memoria 3140 y el coprocesador 3145 se acoplan directamente al procesador 3110, y el concentrador de controlador 3120 en un único chip con el IOH 3150.
La naturaleza opcional de los procesadores adicionales 3115 se indica en la figura 31 con líneas de trazo discontinuo. Cada procesador 3110, 3115 puede incluir uno o más de los núcleos de procesamiento descritos en el presente documento y puede ser alguna versión del procesador 3000.
La memoria 3140 puede ser, por ejemplo, una memoria de acceso aleatorio dinámica (DRAM), una memoria de cambio de fase (PCM) o una combinación de las dos. Para al menos una realización, el concentrador de controlador 3120 se comunica con el procesador o procesadores 3110, 3115 a través de un bus multipunto, tal como un bus de lado frontal (FSB), una interfaz de punto a punto tal como QuickPath Interconnect (QPI) o una conexión similar 3195.
En una realización, el coprocesador 3145 es un procesador de propósito especial, tal como, por ejemplo, un procesador de MIC de capacidad de proceso alta, un procesador de red o de comunicación, un motor de compresión, un procesador de gráficos, una GPGPU, un procesador integrado o similar. En una realización, el concentrador de controlador 3120 puede incluir un acelerador de gráficos integrado.
Puede haber una diversidad de diferencias entre los recursos físicos 3110, 3115 en términos de un espectro de métricas de méritos que incluyen características arquitectónicas, microarquitectónicas, térmicas, de consumo de energía y similares.
En una realización, el procesador 3110 ejecuta instrucciones que controlan operaciones de procesamiento de datos de un tipo general. Puede haber instrucciones de coprocesador integradas dentro de las instrucciones. El procesador 3110 reconoce estas instrucciones de coprocesador como de un tipo que debería ser ejecutado por el coprocesador 3145 adjunto. En consecuencia, el procesador 3110 emite estas instrucciones de coprocesador (o señales de control que representan instrucciones de coprocesador) en un bus del coprocesador u otra interconexión, al coprocesador 3145. Los coprocesadores 3145 aceptan y ejecutan las instrucciones de coprocesador recibidas.
Haciendo referencia a continuación a la figura 32, se muestra un diagrama de bloques de un primer sistema 3200 ilustrativo más específico de acuerdo con una realización de la presente invención. Como se muestra en la figura 32, el sistema de múltiples procesadores 3200 es un sistema de interconexión de punto a punto e incluye un primer procesador 3270 y un segundo procesador 3280 acoplados a través de una interconexión de punto a punto 3250. Cada uno de los procesadores 3270 y 3280 puede ser alguna versión del procesador 3000. En una realización, los procesadores 3270 y 3280 son, respectivamente, los procesadores 3110 y 3115, mientras que el coprocesador 3238 es el coprocesador 3145. En otra realización, los procesadores 3270 y 3280 son, respectivamente, el procesador 3110 y el coprocesador 3145.
Los procesadores 3270 y 3280 se muestran incluyendo las unidades de controlador de memoria integrado (IMC) 3272 y 3282, respectivamente. El procesador 3270 también incluye, como parte de sus unidades de controlador de bus, las interfaces de punto a punto (P-P) 3276 y 3278; de forma similar, el segundo procesador 3280 incluye las interfaces P-P 3286 y 3288. Los procesadores 3270, 3280 pueden intercambiar información a través de una interfaz de punto a punto (P-P) 3250 usando los circuitos de interfaz P-P 3278, 3288. Como se muestra en la figura 32, los IMC 3272 y 3282 acoplan los procesadores a unas memorias respectivas, en concreto, una memoria 3232 y una memoria 3234, que pueden ser porciones de una memoria principal unidas localmente a los procesadores respectivos.
Cada uno de los procesadores 3270, 3280 puede intercambiar información con un conjunto de chips 3290 a través de las interfaces P-P 3252, 3254 individuales usando los circuitos de interfaz de punto a punto 3276, 3294, 3286, 3298. El conjunto de chips 3290 puede opcionalmente intercambiar información con el coprocesador 3238 a través de una interfaz de desempeño alto 3292. En una realización, el coprocesador 3238 es un procesador de propósito especial, tal como, por ejemplo, un procesador de MIC de capacidad de proceso alta, un procesador de red o de comunicación, un motor de compresión, un procesador de gráficos, una GPGPU, un procesador integrado o similar.
Se puede incluir una memoria caché compartida (no mostrada) en uno cualquiera de los procesadores o fuera de ambos procesadores, pero conectada con los procesadores a través de una interconexión P-P, de tal forma que la información de memoria caché local de uno cualquiera de los procesadores, o de ambos, se puede almacenar en la memoria caché compartida si un procesador se coloca en un modo de bajo consumo.
El conjunto de chips 3290 se puede acoplar a un primer bus 3216 a través de una interfaz 3296. En una realización, el primer bus 3216 puede ser un bus de Interconexión de Componentes Periféricos (PCI), o un bus tal como un bus PCI Express u otro bus de interconexión de E/S de tercera generación, aunque el alcance de la presente invención no se limita a ello.
Como se muestra en la figura 32, diversos dispositivos de E/S 3214 se pueden acoplar al primer bus 3216, junto con un puente de bus 3218 que acopla el primer bus 3216 a un segundo bus 3220. En una realización, un procesador o más procesadores 3215 adicionales, tales como coprocesadores, procesadores de MIC de capacidad de proceso alta, unas GPGPU, aceleradores (tales como, por ejemplo, aceleradores de gráficos o unidades de procesamiento de señales digitales (DSP)), matrices de puertas programables en campo, o cualquier otro procesador, se acoplan al primer bus 3216. En una realización, el segundo bus 3220 puede ser un bus de recuento de pines bajo (LPC). Diversos dispositivos se pueden acoplar a un segundo bus 3220 incluyendo, por ejemplo, un teclado y/o un ratón 3222, unos dispositivos de comunicación 3227 y una unidad de almacenamiento 3228, tal como una unidad de disco u otro dispositivo de almacenamiento masivo que puede incluir instrucciones/código y datos 3230, en una realización. Además, una E/S de audio 3224 se puede acoplar al segundo bus 3220. Obsérvese que son posibles otras arquitecturas. Por ejemplo, en lugar de la arquitectura de punto a punto de la figura 32, un sistema puede implementar un bus multipunto u otra arquitectura de este tipo.
Haciendo referencia a continuación a la figura 33, se muestra un diagrama de bloques de un segundo sistema 3300 ilustrativo más específico de acuerdo con una realización de la presente invención. Elementos semejantes en las figuras 32 y 33 llevan números de referencia semejantes, y ciertos aspectos de la figura 32 se han omitido de la figura 33 con el fin de evitar complicar otros aspectos de la figura 33.
La figura 33 ilustra que los procesadores 3270, 3280 pueden incluir la memoria integrada y la lógica de control ("CL") de E/S 3372 y 3382, respectivamente. Por lo tanto, las CL 3372, 3382 incluyen unidades de controlador de memoria integrado e incluyen lógica de control de E/S. La figura 33 ilustra que no solo las memorias 3232, 3234 se acoplan a la CL 3372, 3382, sino también que los dispositivos de E/S 3314 también se acoplan a la lógica de control 3372, 3382. Los dispositivos de E/S heredados 3315 se acoplan al conjunto de chips 3290.
Haciendo referencia a continuación a la figura 34, se muestra un SoC 3400 de un sistema de acuerdo con una realización de la presente invención. Elementos semejantes en la figura 30 llevan números de referencia semejantes. Además, los recuadros con líneas de trazo discontinuo son características opcionales en SoC más avanzados. En la figura 34, una unidad o unidades de interconexión 3402 se acoplan a: un procesador de aplicaciones 3410 que incluye un conjunto de uno o más núcleos 3002A-N, que incluyen las unidades de memoria caché 3004A-N y la unidad o unidades de memoria caché compartida 3006; una unidad de agente de sistema 3010; una unidad o unidades de controlador de bus 3016; una unidad o unidades de controlador de memoria integrado 3014; un conjunto o uno o más coprocesadores 3420 que pueden incluir lógica de gráficos integrada, un procesador de imágenes, un procesador de audio y un procesador de vídeo; una unidad de memoria de acceso aleatorio estática (SRAM) 3430; una unidad de acceso a memoria directo (DMA) 3432; y una unidad de visualización 3440 para acoplar a uno o más visualizadores externos. En una realización, el coprocesador o coprocesadores 3420 incluyen un procesador de propósito especial, tal como, por ejemplo, un procesador de red o de comunicación, un motor de compresión, una GPGPU, un procesador de MIC de capacidad de proceso alta, un procesador integrado o similar.
Se pueden implementar realizaciones de los mecanismos divulgados en el presente documento en hardware, software, firmware o una combinación de tales enfoques de implementación. Se pueden implementar realizaciones como programas informáticos o códigos de programa que se ejecutan en sistemas programables que comprenden al menos un procesador, un sistema de almacenamiento (que incluye memoria volátil y no volátil y/o elementos de almacenamiento), al menos un dispositivo de entrada y al menos un dispositivo de salida.
Un código de programa, tal como el código 3230 ilustrado en la figura 32, se puede aplicar a unas instrucciones de entrada para realizar las funciones descritas en el presente documento y generar una información de salida. La información de salida se puede aplicar a uno o más dispositivos de salida, de una forma conocida. Para los fines de esta solicitud, un sistema de procesamiento incluye cualquier sistema que tenga un procesador, tal como, por ejemplo; un procesador de señales digitales (DSP), un microcontrolador, un circuito integrado de aplicación específica (ASIC) o un microprocesador.
El código de programa se puede implementar en un lenguaje de programación orientado a objetos o de procedimientos de alto nivel para comunicarse con un sistema de procesamiento. El código de programa también se puede implementar en lenguaje ensamblador o máquina, si se desea. De hecho, los mecanismos descritos en el presente documento no están limitados en su alcance a lenguaje de programación particular alguno. En cualquier caso, el lenguaje puede ser un lenguaje compilado o interpretado.
Uno o más aspectos de al menos una realización se pueden implementar mediante instrucciones representativas almacenadas en un medio legible por máquina que representa diversas lógicas dentro del procesador, que, cuando son leídas por una máquina, hacen que la máquina fabrique una lógica para realizar las técnicas descritas en el presente documento. Tales representaciones, conocidas como "núcleos de IP", se pueden almacenar en un medio legible por máquina tangible y suministrarse a diversos clientes o instalaciones de fabricación para cargarlas en las máquinas de fabricación que realmente hacen la lógica o el procesador.
Tales medios de almacenamiento legibles por máquina pueden incluir, sin limitación, disposiciones tangibles no transitorias de artículos fabricados o formados por una máquina o dispositivo, incluyendo medios de almacenamiento tales como discos duros, cualquier otro tipo de disco, incluyendo disquetes, discos ópticos, discos compactos -memorias de solo lectura (CD-ROM), discos compactos regrabables (CD-RW) y discos magnetoópticos, dispositivos de semiconductores tales como memorias de solo lectura (ROM), memorias de acceso aleatorio (RAM) tales como memorias de acceso aleatorio dinámicas (DRAM), memorias de acceso aleatorio estáticas (SRAM), memorias de solo lectura programables y borrables (EPROM), memorias flash, memorias de solo lectura programables y borrables eléctricamente (EEPROM), memoria de cambio de fase (PCM), tarjetas magnéticas u ópticas, o cualquier otro tipo de medio adecuado para almacenar instrucciones electrónicas.
En consecuencia, unas realizaciones también incluyen medios legibles por máquina tangibles no transitorios que contienen instrucciones o que contienen datos de diseño, tales como Lenguaje de Descripción de Hardware (HDL), que definen estructuras, circuitos, aparatos, procesadores y/o características de sistema descritos en el presente documento. Tales realizaciones también se pueden denominar productos de programa.
Emulación (incluyendo traducción binaria, transformación de código, etc.)
En algunos casos, se puede usar un convertidor de instrucciones para convertir una instrucción de un conjunto de instrucciones de origen a un conjunto de instrucciones de destino. Por ejemplo, el convertidor de instrucciones puede traducir (por ejemplo, usando traducción binaria estática, traducción binaria dinámica que incluye compilación dinámica), transformar, emular o convertir de otro modo una instrucción en otras una o más instrucciones a procesar por el núcleo. El convertidor de instrucciones se puede implementar en software, hardware, firmware o una combinación de los mismos. El convertidor de instrucciones puede estar en un procesador, fuera de un procesador o en parte dentro y en parte fuera de un procesador.
La figura 35 es un diagrama de bloques que contrapone el uso de un convertidor de instrucciones de software para convertir instrucciones binarias en un conjunto de instrucciones de origen en instrucciones binarias en un conjunto de instrucciones de destino de acuerdo con realizaciones. En la realización ilustrada, el convertidor de instrucciones es un convertidor de instrucciones de software, aunque, como alternativa, el convertidor de instrucciones se puede implementar en software, firmware, hardware o diversas combinaciones de los mismos. La figura 35 muestra que un programa en un lenguaje de alto nivel 3502 se puede compilar usando un compilador de x86 3504 para generar un código binario de x86 3506 que puede ser ejecutado de forma nativa por un procesador con al menos un núcleo de conjunto de instrucciones de x86 3516. El procesador con al menos un núcleo de conjunto de instrucciones de x86 3516 representa cualquier procesador que pueda realizar sustancialmente las mismas funciones que un procesador de Intel con al menos un núcleo de conjunto de instrucciones de x86 ejecutando o procesando de otro modo, de forma compatible, (1) una porción sustancial del conjunto de instrucciones del núcleo de conjunto de instrucciones de x86 de Intel o (2) versiones de código objeto de aplicaciones u otro software destinado a ejecutarse en un procesador de Intel con al menos un núcleo de conjunto de instrucciones de x86, con el fin de lograr sustancialmente el mismo resultado que un procesador de Intel con al menos un núcleo de conjunto de instrucciones de x86. El compilador de x86 3504 representa un compilador que se puede hacer funcionar para generar un código binario de x86 3506 (por ejemplo, código objeto) que, con o sin un procesamiento de vinculación adicional, se puede ejecutar en el procesador con al menos un núcleo de conjunto de instrucciones de x86 3516. De forma similar, la figura 35 muestra que el programa en el lenguaje de alto nivel 3502 se puede compilar usando un compilador de conjunto de instrucciones alternativo 3508 para generar un código binario de conjunto de instrucciones alternativo 3510 que puede ser ejecutado de forma nativa por un procesador sin al menos un núcleo de conjunto de instrucciones de x863514 (por ejemplo, un procesador con núcleos que ejecutan el conjunto de instrucciones MIPS de MIPS Technologies de Sunnyvale, CA y/o que ejecutan el conjunto de instrucciones ARM de ARM Holdings de Sunnyvale, CA). El convertidor de instrucciones 3512 se usa para convertir el código binario de x86 3506 en un código que puede ser ejecutado de forma nativa por el procesador sin un núcleo de conjunto de instrucciones de x863514. No es probable que este código convertido sea el mismo que el código binario de conjunto de instrucciones alternativo 3510 debido a que es difícil hacer un convertidor de instrucciones capaz de esto; sin embargo, el código convertido logrará el funcionamiento general y estará compuesto por instrucciones a partir del conjunto de instrucciones alternativo. Por lo tanto, el convertidor de instrucciones 3512 representa software, firmware, hardware o una combinación de los mismos que, a través de emulación, simulación o cualquier otro proceso, permite que un procesador u otro dispositivo electrónico que no tiene un procesador o núcleo de conjunto de instrucciones de x86 ejecute el código binario de x863506.
Ejemplos adicionales
De acuerdo con la invención, un procesador comprende: una circuitería de descodificación para descodificar una instrucción que tiene unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de multiplicandos correspondientes, generarían resultados intrascendentes; una circuitería de programación para programar la ejecución de la instrucción; y una circuitería de ejecución para ejecutar las instrucciones según el código de operación, en donde el procesador (1490) ha de omitir las multiplicaciones por un multiplicando que tiene un valor, estando la diferencia absoluta entre el valor y un valor constante por debajo de un umbral, debiendo cada uno del umbral y el valor constante o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
En el Ejemplo 1 del procesador de acuerdo con la invención, el procesador ha de determinar una multiplicación que generaría resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) detectando que al menos uno de los multiplicandos y el multiplicador tiene un valor absoluto que o bien es cero o bien es inferior a un umbral predeterminado.
En el Ejemplo 2 del procesador de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un elemento de valor cero.
En el Ejemplo 3 del procesador de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un multiplicando que tiene un valor absoluto por debajo de un umbral, debiendo el umbral o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
En el ejemplo 4 del procesador de acuerdo con la invención, una circuitería de lectura ha de generar los valores detectados cuando se leen los elementos correspondientes.
En el ejemplo 5 del procesador de acuerdo con la invención, cada elemento de la primera y la segunda matrices de origen tiene un campo que indica si el elemento generaría un resultado intrascendente (es decir, de valor cero o de valor cercano a cero) cuando se usa como un multiplicando en una multiplicación.
En el Ejemplo 6 del procesador de acuerdo con la invención, la instrucción especifica adicionalmente una máscara de múltiples bits que tiene un bit por elemento de primera matriz de origen, indicando el bit si el elemento generaría un resultado intrascendente (es decir, de valor cero o de valor cercano a cero) cuando se usa como un multiplicando en una multiplicación.
En el Ejemplo 7 del procesador de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar programar recursos de ejecución para realizar tales multiplicaciones y, en su lugar, intentar mejorar el desempeño programando el recurso de ejecución para realizar multiplicaciones sobre otros pares de elementos correspondientes que no generarían resultados intrascendentes.
En el Ejemplo 8 del procesador de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende intentar reducir el consumo de energía deshabilitando los recursos de ejecución que se usarían para realizar las multiplicaciones.
De acuerdo con la invención, un método que ha de ser realizado por un procesador comprende: descodificar una instrucción usando una circuitería de descodificación, teniendo la instrucción unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de multiplicandos correspondientes, generarían resultados intrascendentes; programar, usando una circuitería de programación, la ejecución de la instrucción; y ejecutar, usando una circuitería de ejecución, las instrucciones según el código de operación, en donde se omiten las multiplicaciones por un multiplicando que tiene un valor, estando la diferencia absoluta entre el valor y un valor constante por debajo de un umbral, debiendo cada uno del umbral y el valor constante o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
En el Ejemplo 9 del método de acuerdo con la invención, el procesador ha de determinar una multiplicación que generaría resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) detectando que al menos uno de los multiplicandos y el multiplicador tiene un valor absoluto que o bien es cero o bien es inferior a un umbral predeterminado.
En el Ejemplo 10 del método de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un elemento de valor cero.
En el Ejemplo 11 del método de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un multiplicando que tiene un valor absoluto por debajo de un umbral, debiendo el umbral o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
En el ejemplo 12 del método de acuerdo con la invención, una circuitería de lectura del procesador ha de generar los valores detectados cuando se leen los elementos correspondientes.
En el ejemplo 13 del método de acuerdo con la invención, cada elemento de la primera y la segunda matrices de origen tiene un campo que indica si este generaría un resultado intrascendente (es decir, de valor cero o de valor cercano a cero) cuando se usa como un multiplicando en una multiplicación.
En el Ejemplo 14 del método de acuerdo con la invención, la instrucción especifica adicionalmente una máscara de múltiples bits que tiene un bit por elemento de primera matriz de origen, indicando el bit si el elemento generaría un resultado intrascendente (es decir, de valor cero o de valor cercano a cero) cuando se usa como un multiplicando en una multiplicación.
En el Ejemplo 15 del método de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar programar recursos de ejecución para realizar tales multiplicaciones y, en su lugar, intentar mejorar el desempeño programando el recurso de ejecución para realizar multiplicaciones sobre otros pares de elementos correspondientes que no generarían resultados intrascendentes.
En el Ejemplo 16 del método de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes comprende intentar reducir el consumo de energía deshabilitando los recursos de ejecución que se usarían para realizar las multiplicaciones.
De acuerdo con la invención, un medio legible por máquina no transitorio contiene instrucciones a las que ha de responder un procesador al: descodificar una instrucción usando una circuitería de descodificación, especificando la instrucción un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino, debiendo omitir el procesador las multiplicaciones que, basándose en valores detectados de multiplicandos correspondientes, generarían resultados intrascendentes; programar, usando una circuitería de programación, la ejecución de la instrucción; y ejecutar, usando una circuitería de ejecución, las instrucciones según el código de operación, en donde se omiten las multiplicaciones por un multiplicando que tiene un valor, estando la diferencia absoluta entre el valor y un valor constante por debajo de un umbral, debiendo cada uno del umbral y el valor constante o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
En el Ejemplo 17 del medio legible por máquina no transitorio de acuerdo con la invención, el procesador ha de determinar una multiplicación que generaría resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) detectando que al menos uno de los multiplicandos y el multiplicador tiene un valor absoluto que o bien es cero o bien es inferior a un umbral predeterminado.
En el Ejemplo 18 del medio legible por máquina no transitorio de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un elemento de valor cero.
En el Ejemplo 19 del medio legible por máquina no transitorio de acuerdo con la invención, evitar las multiplicaciones que generarían resultados intrascendentes (es decir, de valor cero o de valor cercano a cero) comprende evitar multiplicar por un multiplicando que tiene un valor absoluto por debajo de un umbral, debiendo el umbral o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.

Claims (10)

REIVINDICACIONES
1. Un procesador (1490) que comprende:
una circuitería de descodificación (1403) para descodificar una instrucción que tiene unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador (1490) ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino;
una circuitería de programación (1409) para programar la ejecución de la instrucción; y
una circuitería de ejecución (1411) para ejecutar las instrucciones según el código de operación,
en donde el procesador (1490) ha de omitir las multiplicaciones por un multiplicando que tiene un valor, estando la diferencia absoluta entre el valor y un valor constante por debajo de un umbral, debiendo cada uno del umbral y el valor constante o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
2. El procesador (1490) de la reivindicación 1, en donde la circuitería de ejecución (1411) ha de determinar una multiplicación que generaría resultados de valor cero o de valor cercano a cero detectando que al menos uno de los multiplicandos tiene un valor absoluto que o bien es cero o bien es inferior a un umbral predeterminado.
3. El procesador (1490) de la reivindicación 1, en donde evitar las multiplicaciones que generarían resultados de valor cero o de valor cercano a cero comprende evitar multiplicar por un elemento de valor cero.
4. El procesador (1490) de la reivindicación 1, en donde una circuitería de lectura ha de detectar, cuando se leen los elementos correspondientes, si se generaría un resultado de valor cero o de valor cercano a cero cuando se multiplican los mismos.
5. El procesador (1490) de cualquiera de las reivindicaciones 1 -4, en donde cada elemento de la primera y la segunda matrices de origen tiene un campo que indica si el elemento generaría un resultado de valor cero o de valor cercano a cero cuando se usa como un multiplicando en una multiplicación.
6. El procesador (1490) de cualquiera de las reivindicaciones 1-4, en donde la instrucción especifica adicionalmente una máscara de múltiples bits que tiene un bit por elemento de primera matriz de origen, indicando el bit si el elemento generaría un resultado de valor cero o de valor cercano a cero cuando se usa como un multiplicando en una multiplicación.
7. El procesador (1490) de la reivindicación 1, en donde evitar las multiplicaciones que generarían resultados de valor cero o de valor cercano a cero comprende intentar reducir el consumo de energía deshabilitando los recursos de ejecución que se usarían para realizar las multiplicaciones.
8. Un método (2300) que ha de ser realizado por un procesador, comprendiendo el método:
descodificar una instrucción usando una circuitería de descodificación (2305), teniendo la instrucción unos campos para especificar un código de operación y unas ubicaciones de una primera matriz de origen, una segunda matriz de origen y una matriz de destino, indicando el código de operación que el procesador ha de multiplicar cada elemento en la fila M y la columna K de la primera matriz de origen con un elemento correspondiente en la fila K y la columna N de la segunda matriz de origen, y acumular un producto resultante con contenidos previos de un elemento correspondiente en la fila M y la columna N de la matriz de destino;
programar, usando una circuitería de programación, la ejecución de la instrucción (2307); y
ejecutar, usando una circuitería de ejecución, las instrucciones según el código de operación (2309), en donde se omiten las multiplicaciones por un multiplicando que tiene un valor, estando la diferencia absoluta entre el valor y un valor constante por debajo de un umbral, debiendo cada uno del umbral y el valor constante o bien ser especificado por la instrucción o bien ser programado en un registro de configuración.
9. El método (2300) de la reivindicación 8, que comprende además:
determinar una multiplicación que generaría resultados de valor cero o de valor cercano a cero detectando que al menos uno de los multiplicandos tiene un valor absoluto que o bien es cero o bien es inferior a un umbral predeterminado.
10. El método (2300) de la reivindicación 8, en donde evitar las multiplicaciones que generarían resultados de valor cero o de valor cercano a cero comprende evitar multiplicar por un elemento de valor cero.
ES20164786T 2019-06-26 2020-03-23 Sistemas y métodos para omitir operaciones matriciales intrascendentes Active ES2934513T3 (es)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US16/453,724 US11403097B2 (en) 2019-06-26 2019-06-26 Systems and methods to skip inconsequential matrix operations

Publications (1)

Publication Number Publication Date
ES2934513T3 true ES2934513T3 (es) 2023-02-22

Family

ID=69953820

Family Applications (1)

Application Number Title Priority Date Filing Date
ES20164786T Active ES2934513T3 (es) 2019-06-26 2020-03-23 Sistemas y métodos para omitir operaciones matriciales intrascendentes

Country Status (5)

Country Link
US (2) US11403097B2 (es)
EP (2) EP3757769B1 (es)
CN (1) CN112148251A (es)
ES (1) ES2934513T3 (es)
PL (1) PL3757769T3 (es)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11481223B2 (en) * 2019-08-08 2022-10-25 Blaize, Inc. Reducing operations of sum-of-multiply-accumulate (SOMAC) instructions
US11288076B2 (en) 2019-09-13 2022-03-29 Flex Logix Technologies, Inc. IC including logic tile, having reconfigurable MAC pipeline, and reconfigurable memory
US11307860B1 (en) 2019-11-22 2022-04-19 Blaize, Inc. Iterating group sum of multiple accumulate operations
KR102477533B1 (ko) * 2020-08-06 2022-12-15 한국과학기술원 희소성 데이터를 이용하는 연산 장치 및 그것의 동작 방법
CN113591031A (zh) * 2021-09-30 2021-11-02 沐曦科技(北京)有限公司 低功耗矩阵运算方法及装置
CN116048456A (zh) * 2023-04-03 2023-05-02 摩尔线程智能科技(北京)有限责任公司 矩阵乘法器、矩阵相乘的方法以及计算设备

Family Cites Families (53)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247632A (en) 1989-01-23 1993-09-21 Eastman Kodak Company Virtual memory management arrangement for addressing multi-dimensional arrays in a digital data processing system
US5475822A (en) 1993-11-15 1995-12-12 Motorola, Inc. Data processing system for resuming instruction execution after an interrupt and method therefor
US7301541B2 (en) 1995-08-16 2007-11-27 Microunity Systems Engineering, Inc. Programmable processor and method with wide operations
US5892962A (en) 1996-11-12 1999-04-06 Lucent Technologies Inc. FPGA-based processor
US6161219A (en) 1997-07-03 2000-12-12 The University Of Iowa Research Foundation System and method for providing checkpointing with precompile directives and supporting software to produce checkpoints, independent of environment constraints
US6282634B1 (en) 1998-05-27 2001-08-28 Arm Limited Apparatus and method for processing data having a mixed vector/scalar register file
FR2787233B1 (fr) 1998-12-11 2001-02-16 St Microelectronics Sa Procede pour verifier l'integrite des circuits de decodage d'une memoire
US6901422B1 (en) 2001-03-21 2005-05-31 Apple Computer, Inc. Matrix multiplication in a vector processing system
US7725521B2 (en) 2001-10-29 2010-05-25 Intel Corporation Method and apparatus for computing matrix transformations
US6877020B1 (en) 2001-12-31 2005-04-05 Apple Computer, Inc. Method and apparatus for matrix transposition
US7003542B2 (en) 2002-01-02 2006-02-21 Intel Corporation Apparatus and method for inverting a 4×4 matrix
US7209939B2 (en) 2002-07-11 2007-04-24 Sun Microsystems, Inc. Precision improvement method for the Strassen/Winograd matrix multiplication method
US6944747B2 (en) 2002-12-09 2005-09-13 Gemtech Systems, Llc Apparatus and method for matrix data processing
US7873812B1 (en) 2004-04-05 2011-01-18 Tibet MIMAR Method and system for efficient matrix multiplication in a SIMD processor architecture
US20060190517A1 (en) 2005-02-02 2006-08-24 Guerrero Miguel A Techniques for transposition of a matrix arranged in a memory as multiple items per word
US20070186210A1 (en) 2006-02-06 2007-08-09 Via Technologies, Inc. Instruction set encoding in a dual-mode computer processing environment
US7912889B1 (en) 2006-06-16 2011-03-22 Nvidia Corporation Mapping the threads of a CTA to the elements of a tile for efficient matrix multiplication
US7792895B1 (en) 2006-06-16 2010-09-07 Nvidia Corporation Efficient matrix multiplication on a parallel processing device
US20080071851A1 (en) 2006-09-20 2008-03-20 Ronen Zohar Instruction and logic for performing a dot-product operation
US8122078B2 (en) 2006-10-06 2012-02-21 Calos Fund, LLC Processor with enhanced combined-arithmetic capability
US7797362B2 (en) 2007-02-23 2010-09-14 Texas Instruments Incorporated Parallel architecture for matrix transposition
US8392487B1 (en) 2007-03-29 2013-03-05 Compass Electro-Optical Systems Ltd Programmable matrix processor
US8028015B2 (en) 2007-08-10 2011-09-27 Inside Contactless S.A. Method and system for large number multiplication
US8923510B2 (en) 2007-12-28 2014-12-30 Intel Corporation Method and apparatus for efficiently implementing the advanced encryption standard
US8533251B2 (en) 2008-05-23 2013-09-10 International Business Machines Corporation Optimized corner turns for local storage and bandwidth reduction
US8060730B2 (en) 2008-05-30 2011-11-15 Freescale Semiconductor, Inc. Selective MISR data accumulation during exception processing
US8250130B2 (en) 2008-05-30 2012-08-21 International Business Machines Corporation Reducing bandwidth requirements for matrix multiplication
US20100180100A1 (en) 2009-01-13 2010-07-15 Mavrix Technology, Inc. Matrix microprocessor and method of operation
US8539201B2 (en) 2009-11-04 2013-09-17 International Business Machines Corporation Transposing array data on SIMD multi-core processor architectures
US8984043B2 (en) 2009-12-23 2015-03-17 Intel Corporation Multiplying and adding matrices
US8478969B2 (en) 2010-09-24 2013-07-02 Intel Corporation Performing a multiply-multiply-accumulate instruction
US20120113133A1 (en) 2010-11-04 2012-05-10 Shpigelblat Shai System, device, and method for multiplying multi-dimensional data arrays
US9727471B2 (en) 2010-11-29 2017-08-08 Intel Corporation Method and apparatus for stream buffer management instructions
US20120254588A1 (en) 2011-04-01 2012-10-04 Jesus Corbal San Adrian Systems, apparatuses, and methods for blending two source operands into a single destination using a writemask
US20130305020A1 (en) 2011-04-01 2013-11-14 Robert C. Valentine Vector friendly instruction format and execution thereof
US9503741B2 (en) 2011-06-08 2016-11-22 Vixs Systems, Inc. Video decoder with multi-format vector processor and methods for use therewith
US20140149480A1 (en) 2012-11-28 2014-05-29 Nvidia Corporation System, method, and computer program product for transposing a matrix
US9442723B2 (en) 2012-12-28 2016-09-13 Intel Corporation Method and apparatus for integral image computation instructions
US9552205B2 (en) * 2013-09-27 2017-01-24 Intel Corporation Vector indexed memory access plus arithmetic and/or logical operation processors, methods, systems, and instructions
US9286216B2 (en) 2014-01-16 2016-03-15 Carnegie Mellon University 3DIC memory chips including computational logic-in-memory for performing accelerated data processing
US9798519B2 (en) 2014-07-02 2017-10-24 Via Alliance Semiconductor Co., Ltd. Standard format intermediate result
US20160179523A1 (en) 2014-12-23 2016-06-23 Intel Corporation Apparatus and method for vector broadcast and xorand logical instruction
US10535114B2 (en) 2015-08-18 2020-01-14 Nvidia Corporation Controlling multi-pass rendering sequences in a cache tiling architecture
US10146535B2 (en) 2016-10-20 2018-12-04 Intel Corporatoin Systems, apparatuses, and methods for chained fused multiply add
CN116009814A (zh) * 2016-10-20 2023-04-25 英特尔公司 用于经融合的乘加的系统、装置和方法
KR20190093568A (ko) 2016-12-31 2019-08-09 인텔 코포레이션 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
US10795836B2 (en) 2017-04-17 2020-10-06 Microsoft Technology Licensing, Llc Data processing performance enhancement for neural networks using a virtualized data iterator
US11275996B2 (en) * 2017-06-21 2022-03-15 Arm Ltd. Systems and devices for formatting neural network parameters
US10503507B2 (en) 2017-08-31 2019-12-10 Nvidia Corporation Inline data inspection for workload simplification
US20190079903A1 (en) * 2017-09-14 2019-03-14 Qualcomm Incorporated Providing matrix multiplication using vector registers in processor-based devices
US11669326B2 (en) 2017-12-29 2023-06-06 Intel Corporation Systems, methods, and apparatuses for dot product operations
US10572568B2 (en) * 2018-03-28 2020-02-25 Intel Corporation Accelerator for sparse-dense matrix multiplication
US10901492B1 (en) * 2019-03-29 2021-01-26 Amazon Technologies, Inc. Power reduction in processor pipeline by detecting zeros

Also Published As

Publication number Publication date
US11403097B2 (en) 2022-08-02
EP3757769B1 (en) 2022-10-05
EP4105778A1 (en) 2022-12-21
US11900114B2 (en) 2024-02-13
US20230070579A1 (en) 2023-03-09
EP3757769A1 (en) 2020-12-30
PL3757769T3 (pl) 2023-01-23
US20200409705A1 (en) 2020-12-31
CN112148251A (zh) 2020-12-29

Similar Documents

Publication Publication Date Title
ES2927546T3 (es) Procesador informático para cálculos de precisión superior que utiliza una descomposición de operaciones de precisión mixta
US11714642B2 (en) Systems, methods, and apparatuses for tile store
EP3651017B1 (en) Systems and methods for performing 16-bit floating-point matrix dot product instructions
ES2934513T3 (es) Sistemas y métodos para omitir operaciones matriciales intrascendentes
US11507376B2 (en) Systems for performing instructions for fast element unpacking into 2-dimensional registers
US20210216323A1 (en) Systems and methods for performing instructions to transform matrices into row-interleaved format
JP2024038122A (ja) 行列演算アクセラレータの命令のための装置、方法、およびシステム
US10970076B2 (en) Systems and methods for performing instructions specifying ternary tile logic operations
JP2021057004A (ja) 行列演算アクセラレータの命令のための装置、方法、及びシステム
JP2019197531A (ja) 連鎖タイル演算を実施するためのシステムおよび方法
US11269630B2 (en) Interleaved pipeline of floating-point adders
US11579883B2 (en) Systems and methods for performing horizontal tile operations
US11294671B2 (en) Systems and methods for performing duplicate detection instructions on 2D data
EP4276608A2 (en) Apparatuses, methods, and systems for 8-bit floating-point matrix dot product instructions
ES2905697T3 (es) Sistemas, aparatos y métodos para generar un índice por orden de clasificación y reordenar elementos basándose en el orden de clasificación
EP3929732A1 (en) Matrix data scatter and gather by row
US11886875B2 (en) Systems and methods for performing nibble-sized operations on matrix elements
CN112149050A (zh) 用于增强的矩阵乘法器架构的装置、方法和系统