ES2908651T3 - Instrucciones reducidas para generar direcciones de variables globales - Google Patents

Instrucciones reducidas para generar direcciones de variables globales Download PDF

Info

Publication number
ES2908651T3
ES2908651T3 ES18837138T ES18837138T ES2908651T3 ES 2908651 T3 ES2908651 T3 ES 2908651T3 ES 18837138 T ES18837138 T ES 18837138T ES 18837138 T ES18837138 T ES 18837138T ES 2908651 T3 ES2908651 T3 ES 2908651T3
Authority
ES
Spain
Prior art keywords
global
global variable
address
variables
base
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
ES18837138T
Other languages
English (en)
Inventor
Todd Edward Sharpe
Ten Tzen
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.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
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 Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Application granted granted Critical
Publication of ES2908651T3 publication Critical patent/ES2908651T3/es
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • G06F12/1009Address translation using page tables, e.g. page table structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/65Details of virtual memory and virtual address translation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/72Details relating to flash memory management
    • G06F2212/7201Logical to physical mapping or translation of blocks or pages

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Sistema (100), que comprende: al menos un procesador y una memoria; y un compilador (104), que se ejecuta en el al menos un procesador, que: genera un orden clasificado (302) de una o más variables globales en un programa basándose en el uso de la una o más variables globales en el programa; forma un grupo (334) de variables seleccionadas de la una o más variables globales que se usan dentro de una misma función (304, 310, 318, 326) de un programa; selecciona una variable global de base del grupo (334), en el que la variable global de base tiene la clasificación más alta en el orden clasificado (302); y genera una primera instrucción para cargar una dirección de base de una página de memoria de la variable global de base, una segunda instrucción para añadir un primer desplazamiento (342) a la dirección de base para generar una dirección de la variable global de base, y una tercera instrucción para añadir un segundo desplazamiento (342) a la dirección de la variable global de base para generar una dirección de una segunda variable global dentro de la misma función del programa, en el que el segundo desplazamiento (342) se basa en una distancia de la segunda variable global desde la variable global de base en el orden clasificado (302) de variables globales.

Description

DESCRIPCIÓN
Instrucciones reducidas para generar direcciones de variables globales
Antecedentes
Una arquitectura de conjunto de instrucciones reducido (RISC) usa instrucciones simples que se ejecutan en un solo ciclo de reloj que da como resultado una velocidad de ejecución más rápida para un programa. Las arquitecturas RISC comúnmente usan instrucciones de longitud fija, lo que simplifica la obtención y el análisis de las instrucciones. Sin embargo, las instrucciones de longitud fija limitan la flexibilidad del conjunto de instrucciones para cargar valores grandes en una sola operación. La mayoría de las arquitecturas RISC usan instrucciones de longitud fija de 32 bits. Una instrucción de 32 bits no puede cargar una dirección de 32 bits en un registro. Hay bits en la instrucción que identifican el código de operación de la instrucción y un registro de destino. Para compensar esta deficiencia, se necesitan dos o más instrucciones para cargar una dirección de 32 bits en un registro. Una instrucción puede cargar una parte inferior de la dirección y una segunda instrucción puede cargar una parte superior de la dirección. Cuando un programa realiza múltiples accesos de memoria que requieren direcciones de 32 bits, la velocidad de ejecución del programa puede verse obstaculizada por el número de instrucciones redundantes necesarias para acceder a estas ubicaciones de memoria.
El documento US 5,850,549 da a conocer un compilador de optimización que analiza los patrones de uso de variables globales y luego vuelve a asignar algunas de las variables globales como miembros de agregados globales. Esto permite que el compilador genere un código más eficiente para acceder a las variables globales en algunos sistemas. Por lo tanto, el documento US 5,850,549 proporciona un método para asignar de nuevo variables de datos globales durante la compilación de programa que comprende las etapas descritas a continuación. En primer lugar, se seleccionan variables de datos globales referenciadas en el programa. Posteriormente, un valor de peso, que representa un tamaño de byte de datos en dicha variable, se asigna a cada variable de datos global seleccionada. Además, las variables de datos globales seleccionadas se dividen en pares de variables a las que se accede en conjunto. A continuación, dichos pares se reordenan desde la frecuencia de acceso más alta hasta la más baja y las variables de datos globales seleccionadas se dividen en agrupaciones de agregados, por lo que cada agrupación tiene un valor de peso de agregado que no excede un límite preestablecido.
El documento US 2008/0288737 A1 da a conocer un dispositivo de procesamiento que incluye un optimizador para migrar objetos desde una memoria externa de un procesamiento de red al dispositivo de memoria local para registros conectados a un procesador. El optimizador alinea y elimina además el código de inicialización redundante de los objetos.
El documento de Grove R B et al.: “GEM optimizing compilers for Alpha AXP systems”, COMPCON SPRING WORK '93 se refiere a técnicas utilizadas para optimizar la ejecución solapada de instrucciones, problema de instrucción múltiple, y referencias de memoria en la tecnología de compilador.
Sumario
El objeto de la presente solicitud es proporcionar un sistema y método que permita un acceso más rápido a variables globales.
Este objeto se resuelve mediante la materia objeto de las reivindicaciones independientes.
Las realizaciones preferidas se definen por las reivindicaciones dependientes.
Este sumario se proporciona para introducir una selección de conceptos de una forma simplificada que se describen adicionalmente a continuación en la descripción detallada. Este sumario no se pretende que identifique características clave o características esenciales de la materia objeto reivindicada, ni se pretende que se use para limitar el alcance de la materia objeto reivindicada.
Un compilador genera instrucciones para una arquitectura basada en RISC que usa instrucciones de tamaño fijo que no son suficientes para abordar variables globales que tienen direcciones de 32 bits. El compilador analiza un programa para producir un gráfico de diseño que incluye las relaciones de llamada entre cada función en el programa y que calcula la frecuencia de uso de cada variable global en una función. El gráfico de diseño se usa para generar una lista de orden de variables globales que clasifica todas las variables globales en un orden que se usa para predecir qué variables globales se almacenarán en estrecha proximidad entre sí, tal como en la misma página de memoria. Esas variables globales que cumplen determinados criterios se agregan en un grupo que refleja esas variables globales que probablemente estén situadas en la misma página de memoria.
Una variable global en cada grupo se selecciona como la variable global de base cuya dirección está completamente resuelta. Las direcciones de las variables globales restantes en el grupo son relativas a la dirección de la variable global de base. Se genera un desplazamiento para cada variable global restante que se basa en la diferencia en la posición de cada variable global restante desde la posición de la variable global de base en la lista de orden de variables globales. El desplazamiento se añade a la dirección de la variable global de base para generar la dirección de la variable global restante.
Estas y otras características y ventajas serán evidentes a partir de una lectura de la siguiente descripción detallada y una revisión de los dibujos asociados. Debe entenderse que tanto la descripción general anterior como la siguiente descripción detallada son solo explicativas y no son restrictivas de los aspectos tal como se reivindican.
Breve descripción de los dibujos
La figura 1 ilustra un sistema a modo de ejemplo para generar un número reducido de instrucciones para cargar la dirección de una variable global.
La figura 2 es un diagrama de flujo que ilustra un método a modo de ejemplo para generar un gráfico de diseño de un programa y una lista de orden de variables globales.
La figura 3 es un diagrama a modo de ejemplo de un gráfico de diseño y una lista de orden de variables globales. La figura 4 es un diagrama de bloques que ilustra un método a modo de ejemplo para transformar código de lenguaje intermedio en código de objeto.
La figura 5 es un diagrama de bloques que ilustra un procedimiento a modo de ejemplo de un enlazador que transforma direcciones relativas en direcciones virtuales relativas.
La figura 6 es un diagrama de bloques que ilustra un primer entorno informático u operativo a modo de ejemplo. La figura 7 es un diagrama de bloques que ilustra un segundo entorno informático u operativo a modo de ejemplo. La figura 8 es un diagrama de bloques que ilustra un tercer entorno informático u operativo a modo de ejemplo.
Descripción detallada
Visión general
La materia objeto dada a conocer se refiere a una técnica que genera instrucciones para cargar la dirección de una variable global de una manera que minimiza el número de instrucciones que se generan para realizar esta operación. Un compilador traduce las instrucciones del programa de alto nivel en instrucciones de lenguaje máquina para un procesador objetivo. Para reducir el número de instrucciones que genera el compilador para cargar la dirección de una variable global en un registro, el compilador usa una técnica que estima las variables globales que probablemente estén ubicadas muy cerca entre sí en tiempo de ejecución, tal como en la misma página de memoria.
Se genera una única instrucción para todas las variables globales que probablemente estén ubicadas dentro de la misma página de memoria que sirve como dirección de base para esas variables globales dentro de la misma página de memoria. Una página o página de memoria es un bloque contiguo de longitud fija de memoria virtual. Se genera una instrucción adicional para cada variable global dentro de la misma página de memoria que incluye un desplazamiento que es relativo a la dirección de base. De esta manera, el compilador genera un número reducido de instrucciones para cargar una dirección, lo que da como resultado un archivo de imagen de menor tamaño. El archivo de imagen de menor tamaño se ejecuta más rápido y puede usarse en dispositivos informáticos con recursos de memoria limitados.
Un compilador analiza un programa y genera un gráfico de diseño que contiene las relaciones de llamada entre cada función en el programa y un recuento de la frecuencia con la que se usa una variable global en una función. El gráfico de diseño se usa para generar una lista de orden de variables globales. La lista de orden de variables globales es una lista de todas las variables globales usadas en un programa ordenadas según una o más reglas que el compilador usa para predecir qué variables globales se almacenarían dentro de la misma página de memoria. La lista de variables globales se ordena basándose en el peso, alineación, y tamaño de una variable global.
A continuación, el compilador usa la lista de orden de variables globales para agregar las variables globales en grupos. Se selecciona una variable global de base para cada grupo basándose en un criterio que incluye la frecuencia con la que se usa una variable global dentro de una función, una alineación de una variable global, y/o el tamaño de la variable global.
En otro aspecto, pueden recopilarse datos de perfil a partir de ejecuciones de muestra del programa que proporcionan la frecuencia de uso de cada variable global en cada función. Estos datos de perfil proporcionan pesos de tiempo de ejecución que pueden incluirse en el gráfico de diseño, o bien además de los recuentos estáticos proporcionados por el análisis estático del programa realizado por el compilador o bien en lugar de los recuentos estáticos.
En un aspecto, la técnica se aplica a arquitecturas que usan el modo de direccionamiento relativo de contador de programa (PC). El modo de direccionamiento de una arquitectura especifica cómo calcular la dirección de memoria efectiva de un operando, tal como una variable global, mediante el uso de datos almacenados en registros. En el modo de direccionamiento relativo a PC, las direcciones son relativas al valor actual almacenado en el contador de programa.
La tecnología presentada se describe con respecto a arquitecturas de máquina de tipo RISC avanzada (ARM) y ARM64 que utiliza el modo de direccionamiento relativo a PC. Sin embargo, debe indicarse que la tecnología dada a conocer en el presente documento no se limita a arquitecturas ARM y puede aplicarse a otras arquitecturas de procesador que usan direcciones de longitud fija y otras arquitecturas que utilizan múltiples instrucciones para cargar un valor en un único registro.
El conjunto de instrucciones de ARM64 usa instrucciones de longitud fija de 32 bits. Para cargar la dirección de una variable global en un registro, pueden usarse un par de instrucciones ADRP y ADD en la siguiente secuencia:
ADRP <Xd>, <label>
ADD <Xd>, <Xn>, PageOffset(label)
La instrucción ADRP calcula la dirección de memoria base de 20 bits de la página de 4KB donde se almacena la variable global se denomina <label> y su valor se escribe en el registro identificado por Xd. La instrucción ADRP calcula la dirección de memoria de 20 bits de la página de 4KB usando el valor actual del contador de programa y el desplazamiento, <label>, en la instrucción. La instrucción ADD añade la variable global o la posición de la página de 12 bits de la etiqueta, PageOffset(label), al registro identificado como Xn y escribe el resultado en el registro identificado por Xd.
En el escenario donde una función de un programa hace referencia a múltiples variables globales que residen en la misma página, habría múltiples pares de instrucciones ADRP/ADD. Sin embargo, los valores calculados por la instrucción ADRP serían los mismos ya que las variables globales dentro de la misma función a menudo están situadas en la misma página de memoria. En este caso, se necesitaría una instrucción ADRP y las instrucciones ADRP adicionales serían redundantes. En su lugar, el compilador genera un par de instrucciones ADRP y ADD para cargar la dirección de una variable global de base que es la primera variable global de un grupo. Las variables globales posteriores se direccionarían mediante una única instrucción que añade un desplazamiento a la dirección de la variable global de base. El desplazamiento sería la diferencia en los desplazamientos de página entre una variable global posterior y el símbolo de base.
Debe indicarse que la técnica descrita en el presente documento no se limita al par de instrucciones ADRP/ADD. Hay otras combinaciones de instrucciones que pueden usarse para cargar la dirección de una variable global, tal como un par de instrucciones ADRP/STR y un par de instrucciones ADRP/LDR.
El siguiente código a modo de ejemplo mostrado en las tablas uno, dos y tres ilustran la técnica descrita en el presente documento. La tabla uno muestra un programa de código fuente C a modo de ejemplo. La tabla 2 muestra la representación de código intermedio que un compilador tradicional genera y la tabla 3 muestra la representación de código intermedio que genera un compilador que utiliza las técnicas descritas en el presente documento.
Como se muestra en la tabla uno, la función main() inicializa cuatro variables globales, global_0, global_1, global_2, y global_3 en las líneas 3-6. La función initialize() usa estas cuatro variables globales y establece cada variable global con nuevos valores en las líneas 9 - 12.
La tabla dos muestra las instrucciones de lenguaje de código intermedio correspondientes que generaría un compilador tradicional. La línea 2 es una instrucción ADRP que calcula la dirección de memoria base de 20 bits de la página de 4KB donde se almacena la variable global denominada global_0 y su valor se escribe en el registro x9. La instrucción STR en la línea 4 añade el valor de PageOffset(global_0), que es la posición de 12 bits de la variable global, global_0, en la página de 4KB, con el valor almacenado en el registro x9. Por lo tanto, el registro x9 contiene la dirección de la variable global, global_0, usando dos instrucciones, el par de instrucciones ADRP/STR en las líneas 2 y 4.
Del mismo modo, la dirección de global_1 se almacena en el registro x10 usando un par de instrucciones ADRP/STR mostradas en las líneas 5 y 7. En la línea 5, la instrucción adrp x10, global_1, calcula la dirección de memoria base de 20 bits de la página de 4KB donde se almacena la variable global denominada global_1 y su valor se escribe en el registro x10. En la línea 7, la instrucción STR añade el valor de PageOffset(global_1), que es la posición de 12 bits de la variable global, global_1, en la página de 4KB, con el valor almacenado en el registro x10. Por lo tanto, el registro x10 contiene la dirección de la variable global, global_1, usando dos instrucciones, el par de instrucciones ADRP/STR en las líneas 5 y 7.
La dirección de global_2 se almacena en el registro x11 usando la instrucción ADRP en la línea 8 y la instrucción STR en la línea 13. En la línea 8, la instrucción adrp x11, global_2, calcula la dirección de memoria base de 20 bits de la página de 4KB donde se almacena la variable global denominada global_2 y su valor se escribe en el registro x11. En la línea 13, la instrucción STR añade el valor de PageOffset(global_2), que es la posición de 12 bits de la variable global, global_2, en la página de 4KB, con el valor almacenado en el registro x11. Por lo tanto, el registro x11 contiene la dirección de la variable global, global_2, usando dos instrucciones, el par de instrucciones ADRP/STR en las líneas 8 y 13.
La dirección de global_3 se almacena en el registro x12 usando la instrucción ADRP en la línea 9 y la instrucción STR en la línea 12. En la línea 9, la instrucción adrp x12, global_3, calcula la dirección de memoria base de 20 bits de la página de 4KB donde se almacena la variable global denominada global_3 y su valor se escribe en el registro x12. En la línea 12, la instrucción STR añade el valor de PageOffset(global_3), que es la posición de 12 bits de la variable global, global_3, en la página de 4KB, con el valor almacenado en el registro x12. Por lo tanto, el registro x12 contiene la dirección de la variable global, global_3, usando dos instrucciones, el par de instrucciones ADRP/STR en las líneas 9 y 12.
Figure imgf000005_0001
Figure imgf000005_0002
Como se muestra en la tabla dos, se usan cuatro instrucciones ADRP para formar la dirección de la misma página de 4KB donde están ubicada cada una de las variables globales. Por el contrario, el mismo programa que se muestra en la tabla uno se transforma en la representación de código intermedio que se muestra en la tabla tres donde solo se usa una instrucción ADRP para formar la dirección de la página de 4Kb común a todas las variables globales.
Como se muestra en la tabla tres, la instrucción ADRP en la línea 2 forma la dirección de la página de 4KB en el registro x8. La instrucción STR en la línea 5 añade el desplazamiento de página de global_0 al registro x8, formando de ese modo la dirección de global_0. La instrucción STR en la línea 6 añade un desplazamiento al registro x8 para formar la dirección de global_1 como la diferencia entre el desplazamiento de global_1 y el desplazamiento de global_0. De manera similar, la instrucción STR en la línea 9 añade un desplazamiento al registro x8 para formar la dirección de global_2 como la diferencia entre el desplazamiento de global_2 y el desplazamiento de global_0. La instrucción STR en la línea 10 añade un desplazamiento al registro x8 para formar la dirección de global_3 como la diferencia entre el desplazamiento de global_3 y el desplazamiento de global_0.
Como se muestra anteriormente en la tabla tres, las técnicas descritas en el presente documento eliminan instrucciones ADRP redundantes usadas para generar las direcciones de variables globales que residen dentro de la misma página de memoria.
Sistema de compilación
A continuación, se dirige la atención a la figura 1, que ilustra un sistema 100 a modo de ejemplo configurado para generar las direcciones de variables globales sin instrucciones redundantes. La figura 1 muestra una configuración a modo de ejemplo de un sistema 100 que incluye un compilador 102 de lenguaje, un compilador 104 de backend, y un enlazador 106. El sistema 100 utiliza un compilador 102 de lenguaje que transforma uno o más archivos 110 de código fuente escritos en un lenguaje de programación en un archivo 112 de ensamblado. El compilador 102 de lenguaje traduce las instrucciones escritas en un lenguaje de programación en un código de lenguaje intermedio (IR) basándose en la gramática asociada con el lenguaje de programación. Lenguajes de programación a modo de ejemplo incluyen, sin limitación, Visual Basic, Visual J#, C++, C#, APL, Cobol, Pascal, C, Java y similares. El código de lenguaje intermedio es una forma independiente del procesador de un programa que consiste en instrucciones binarias. Un código de lenguaje intermedio a modo de ejemplo es el lenguaje intermedio común (CIL) que se define por la infraestructura de lenguaje común usada por el mismo marco .NET, también conocido como lenguaje intermedio de Microsoft (MSIL). Otros códigos de lenguaje intermedio a modo de ejemplo incluyen códigos de bytes Java®, representación intermedia de Parrot, interfaz de máquina independiente de tecnología (TIMI), y similares. El código de lenguaje no intermedio son archivos que tienen formato como.txt, html, .xml, archivos de secuencia de comandos interpretados, y archivos de código fuente.
En un aspecto de la divulgación, el compilador 102 de lenguaje compila los archivos 110 de código fuente en un archivo 112 de ensamblado o ensamblado que está compuesto por metadatos y código de lenguaje intermedio. Los metadatos incluyen una tabla de símbolos (no mostrada) que incluye las variables usadas en el programa que incluyen las variables globales. Una variable global o símbolo global es una variable en un programa de código fuente que es visible en todo el programa, teniendo así un alcance global. El archivo 112 de ensamblado es un archivo binario que incluye una sección para las instrucciones o código de lenguaje intermedio y una sección de datos que incluye las variables globales.
El compilador 104 de back-end usa entonces el archivo 112 de ensamblado para generar instrucciones de máquina para un procesador seleccionado como objetivo en un archivo 114 de código de objeto. El compilador 104 de backend realiza el procesamiento que se relaciona con la arquitectura objetivo, tal como optimización de código, asignación de registros, y generación de código. El compilador 104 de back-end puede incluir un componente 116 de paso previo y un componente 118 de generación de código. El componente 116 de paso previo puede incluir un módulo lector 120 y un módulo analizador 122 que están configurados para generar una lista 124 de orden de variables globales. El módulo lector 120 lee en el archivo 112 de ensamblado de modo que el módulo analizador 122 puede generar el gráfico de diseño (no mostrado) y la lista 124 de orden de variables globales.
El componente 118 de generación de código incluye un módulo lector 125, un módulo de optimización de código 126, un módulo 128 de asignación de registros, y un módulo 130 generador de código. El módulo lector 125 lee la lista 124 de orden de variables globales y el archivo 112 de ensamblado de modo que el módulo 126 de optimización de código puede realizar optimizaciones en las instrucciones. El módulo 126 de optimización de código puede realizar una cualquiera o más de las optimizaciones de código bien conocidas, tales como, sin limitación, eliminación de ramas, colapso de bucle, combinación de instrucciones, plegado de constantes, propagación de constantes, eliminación de código no alcanzado, optimización de división de enteros, simplificación de expresión, fusión de bucles, inserción, eliminación de expresión invariante, reducción de intensidad, expansión de bucles, y así sucesivamente.
El módulo 128 de asignación de registros asigna variables a registros y gestiona la transferencia de datos dentro y fuera de los registros. El módulo 130 generador de código convierte el código de lenguaje intermedio optimizado en instrucciones de máquina para dar un archivo 114 de código de objeto.
El archivo 114 de código de objeto puede entonces vincularse con otros archivos de código de objeto (por ejemplo, bibliotecas) a través de un enlazador 106 en un archivo 132 de imagen correspondiente o archivo ejecutable. El enlazador 106 actualiza los archivos 114 de código de objeto con direcciones virtuales relativas que reemplazan las direcciones relativas, generando de ese modo el archivo 132 de imagen.
En otro aspecto, el sistema 100 puede incluir un compilador 107 de generación de perfiles y un motor de ejecución 109. El compilador 107 de generación de perfiles está configurado para construir un archivo ejecutable que incluye instrucciones para medir la frecuencia con la que se usa cada variable global en cada función. Este archivo ejecutable se ejecuta por el motor de ejecución 109 una o más veces para generar datos 113 de perfil que incluyen el uso de tiempo de ejecución de las variables globales en el programa. Estos datos 113 de perfil pueden entonces introducirse en el componente 116 de paso previo para su uso en el cálculo de los pesos del gráfico de diseño.
A continuación, se presta atención a las descripciones de los diversos métodos a modo de ejemplo que utilizan el sistema y los dispositivos dados a conocer en el presente documento. Pueden describirse además operaciones para los aspectos con referencia a diversos procedimientos a modo de ejemplo. Puede apreciarse que los métodos representativos no necesariamente tienen que ejecutarse en el orden presentado, o en cualquier orden particular, a menos que se indique de otro modo. Además, diversas actividades descritas con respecto a los métodos pueden ejecutarse en serie o en paralelo, o cualquier combinación de operaciones en serie y en paralelo. En uno o más aspectos, el método ilustra operaciones para los sistemas y dispositivos dados a conocer en el presente documento.
Volviendo a la figura 2, se muestra un método a modo de ejemplo para generar la lista 124 de orden de variables globales. En la fase de paso previo, el módulo lector 120 de paso previo lee en el código de lenguaje intermedio, la tabla de símbolos a partir de los metadatos, y/o los datos de perfil (colectivamente 202) (bloque 204). El módulo analizador 122 genera un gráfico de diseño a partir del cual se genera la lista de orden de variables globales (bloque 206). Un gráfico de diseño es un gráfico de flujo de control que representa las relaciones de llamada entre métodos (es decir, métodos, subrutinas) en un programa. Un nodo en el gráfico de diseño representa un método y el borde de un nodo a otro nodo representa la relación de llamada entre los dos métodos. Cada nodo en el gráfico está asociado con una lista de las variables globales usadas en el método junto con un peso para cada variable global. En un aspecto, el peso puede ser la frecuencia en la que se hace referencia a cada variable global en una función o método. Los pesos pueden incluir pesos estáticos a partir de un análisis estático del programa. Los pesos estáticos son los recuentos de la frecuencia de uso de cada variable global a partir de un análisis de código estático. Los análisis de código estático se realizan sin ejecutar el programa. Alternativamente, los pesos pueden incluir pesos de tiempo de ejecución obtenidos a partir de los datos de perfil y/o cualquier combinación de los pesos de tiempo de ejecución y los pesos estáticos.
El módulo analizador 122 usa el gráfico de diseño con los pesos para generar la lista 124 de orden de variables globales (bloque 208). Las variables globales se ordenan en una secuencia con la variable global con el peso más alto primero y con la variable global con el peso más bajo en último lugar. En el caso de que dos o más variables globales tengan el mismo peso, entonces la variable global con la alineación más alta precede a las otras variables globales con el mismo peso. En el caso de que dos o más variables globales tengan el mismo peso y alineación, entonces la variable global con el tamaño más pequeño tiene preferencia sobre las otras variables globales con el mismo peso y alineación. Por lo tanto, la lista de orden de variables globales es un orden clasificado de todas las variables globales en un programa basándose en el uso, alineación y el tamaño de una variable global.
El módulo analizador 122 entonces usa reglas o heurística para dividir la lista de orden de variables globales en grupos donde cada grupo contiene esas variables globales que es más probable que estén situadas en la misma página de memoria. En un aspecto, el módulo analizador 122 agrega variables globales en la lista de orden de variables globales dentro de la misma función en un grupo. El módulo analizador 122 verifica a continuación si las variables globales con un grupo necesitan dividirse en uno o más grupos adicionales, tal como cuando las variables globales dentro de un grupo pueden exceder un límite de página de memoria.
Por ejemplo, si la diferencia en los desplazamientos de dos variables globales consecutivas en la lista de orden de variables globales es de 12 bits o menos, entonces las dos variables globales consecutivas pueden permanecer en el mismo grupo. Esto se debe a que la instrucción ADD añade un desplazamiento de 12 bits a la dirección de base que tiene un rango de direcciones dentro de 4KB. Sin embargo, si se usa una instrucción LDR o STR, entonces el módulo analizador 122 determina si las variables globales consecutivas pueden permanecer en un grupo basándose en el tamaño de la variable global.
Con referencia a la figura 3, se muestra un gráfico 300 de diseño a modo de ejemplo, una lista 302 de orden de variables globales correspondiente, y los grupos 334 correspondientes a la lista de orden de variables globales. El gráfico 300 de diseño contiene un nodo para cada función y un borde de un nodo a otro nodo representa una relación de llamada entre las funciones conectadas. Como se muestra en la figura 3, el nodo 304 representa la función R. La función R 306 llama a la función S 312 en el nodo 310 y la función T 320 en el nodo 318. La función S 312 llama a la función X 328 en el nodo 326.
La función R 306 no hace referencia a ninguna variable global. La función S 312 usa dos variables globales, D y B, donde la variable global D se usa 3 veces 314 en la función S y la variable global B se usa 5 veces 316 en la función S. La función T 310 usa dos variables globales A y C, donde la variable global A se usa 6 veces 322 en la función T y la variable global C se usa 15 veces 324 en la función T. La función X 328 hace referencia a la variable global M 13 veces 330 y hace referencia a la variable global N 8 veces 332.
La lista 302 de orden de variables globales ordena todas las variables globales en todo el programa en un orden desde la variable global de más peso hasta la variable global de menos peso. Como se muestra en la figura 3, las variables globales se enumeran en el siguiente orden: C, M, A, N, B y D donde C tiene el peso 15, M tiene el peso 13, A tiene el peso 6, N tiene el peso 8, B tiene el peso 5, y D tiene el peso 3.
Asociado con cada variable global hay un desplazamiento que se basa en la posición de una variable global dentro de la lista 302 de orden de variables globales y el tamaño de la variable global. En el ejemplo mostrado en la figura 3, el tamaño de cada variable global es de 8 bytes. Los desplazamientos para las variables globales mostradas en la figura 3 se muestran en la línea 342. El desplazamiento para la variable global C es 0 bytes ya que es la primera variable global en el programa. El desplazamiento para cada variable global sucesiva en la lista 302 de orden de variables globales se basa en su distancia desde la primera variable global en la lista 302 de orden de variables globales y su tamaño. El desplazamiento para la variable global M es de 8 bytes, el desplazamiento para la variable global A es de 16 bytes, el desplazamiento para la variable global N es de 24 bytes, el desplazamiento para la variable global B es de 32 bytes, y el desplazamiento para la variable global D es de 40 bytes.
El tamaño de una variable global puede no ser siempre el mismo. Por ejemplo, si C es 8 bytes, M es 4 bytes, A es 32 bytes, N es 16 bytes, B es 80 bytes, y D es 4 bytes, el orden de las variables globales en la lista de orden de variables globales permanecería igual, pero los desplazamientos serían diferentes. La variable global C comenzaría en 0 bytes, la variable global M comenzaría en 8 bytes (8 bytes de desplazamiento), la variable global A comenzaría en 16 bytes (16 bytes de desplazamiento), la variable global N comenzaría en 48 bytes (48 bytes de desplazamiento), la variable global B comenzaría en 64 bytes (64 bytes de desplazamiento), y la variable global D comenzaría en 72 bytes (72 bytes de desplazamiento).
A continuación, las variables globales se agregan en grupos donde cada grupo contiene las variables globales usadas en una función. Como se muestra en la figura 3, hay tres grupos 336, 338 y 340. No hay ningún grupo asociado con la función R ya que la función R no contiene ninguna variable global. El grupo 336 contiene las variables globales asociadas con la función S. En la función S, la variable global B es la variable global de base ya que tiene un peso mayor que la variable global D. Como la variable global de base, la dirección de variable global D se resuelve completamente usando una instrucción ARDP para generar la dirección de base de su página de memoria. La dirección de la variable global B utilizaría un desplazamiento que es la diferencia entre la posición de la variable global D en la lista de orden de variables globales con respecto a la posición de la variable global B en la lista de orden de variables globales. En el ejemplo mostrado en la figura 3, el tamaño de cada variable global es de 8 bytes. El desplazamiento para la variable global sería de 40 bytes - 32 bytes u 8 bytes.
Para la función T, el grupo 338 incluiría la variable global C como la variable global de base ya que su peso es 15 que excede el peso de la variable global A cuyo peso está en 6. Existiría una instrucción ADRP generada para cargar la dirección de base de la página de memoria que contiene la variable global de base C. El desplazamiento usado en una instrucción ADD para la variable global A sería la diferencia en la posición de la variable global A en la lista de orden de variables globales con respecto a la posición de la variable global C en la lista de orden de variables globales que es de 16 bytes - 0 bytes o 16 bytes.
Para la función X, el grupo 340 incluiría la variable global M como la variable global de base ya que su peso es mayor que el de la variable global N. Existiría una instrucción ADRP generada para cargar la dirección de base de la página de memoria que contiene la variable global de base M. El desplazamiento usado en una instrucción ADD para la variable global N sería la diferencia en la posición de la variable global N en la lista de orden de variables globales con respecto a la posición de la variable global M en la lista de orden de variables globales que es de 24 bytes - 8 bytes o 16 bytes.
A continuación, la atención se dirige a la figura 4 que describe con más detalle el método 400 del componente 118 de generación de código. El módulo lector 124 del componente 118 de generación de código recibe el código 404 de lenguaje intermedio y la lista 406 de orden de variables globales (bloque 410). Para cada función, el módulo 126 de optimización de código realiza optimizaciones de código (bloque 412), el módulo 128 de asignación de registros realiza asignaciones de registros (bloque 414), y el módulo 130 generador de código genera instrucciones de máquina (bloque 416).
El módulo 130 generador de código usa la lista 406 de orden de variables globales para agrupar las variables globales dentro de la misma función en el orden de la lista de orden de variables globales. Se selecciona una única variable global como la variable global de base cuya dirección está completamente resuelta. Por ejemplo, para una arquitectura ARM64, el módulo generador de código generaría un par de instrucciones ADRP/ADD para cargar la dirección de la variable global de base. Para las variables globales restantes en el grupo, se generaría una instrucción ADD, STR o LDR que añade un desplazamiento a la dirección de la variable global de base. El desplazamiento es la diferencia entre la posición de la variable restante en la lista de orden de variables globales con respecto a la posición de la variable global de base en la lista de orden de variables globales. (colectivamente, bloque 416). Después de que se procesan todas las funciones, el módulo generador de código emite un archivo de código de objeto que incluye instrucciones de máquina con direcciones relativas (bloque 418).
Una dirección relativa es una dirección virtual de un objeto con respecto al inicio de la función donde se usa el objeto. El enlazador reemplaza entonces la dirección relativa con direcciones virtuales relativas que son relativas al inicio del archivo de imagen.
A continuación, la atención se dirige a la figura 5 que ilustra el funcionamiento del enlazador 500 que recibe uno o más archivos de objeto asociados con el programa y genera un archivo ejecutable denominado archivo de imagen. El archivo de imagen contiene direcciones virtuales relativas (RVA) que difieren de las direcciones virtuales estándar. Una dirección virtual relativa es relativa a dónde se cargará el archivo de imagen en la memoria en la máquina objetivo prevista. Una dirección virtual relativa es una dirección virtual de un objeto donde el archivo se cargará en la memoria del dispositivo objetivo menos la dirección de base del archivo de imagen.
El enlazador recibe uno o más archivos 502 de código de objeto asociados con un programa y agrega los archivos de código de objeto en un único ejecutable y configura un diseño de memoria para el archivo agregado (bloque 504). El enlazador reemplaza entonces las direcciones relativas en las instrucciones de máquina con direcciones virtuales relativas (bloque 506) y emite un archivo de imagen (etapa 508).
Efecto técnico
Aspectos de la materia objeto dada a conocer en el presente documento se refieren al problema técnico de reducir el número de instrucciones necesarias para generar las direcciones de variables globales. El problema es pertinente para arquitecturas basadas en RISC que utilizan instrucciones de 32 bits que no son suficientes para abordar variables globales que tienen direcciones de 32 bits. Las características técnicas asociadas con abordar este problema implican un compilador que analiza un programa generando un gráfico de diseño que incluye cada función en el programa y pesos para cada variable global usada en una función. El compilador usa el gráfico de diseño para generar una lista de orden de variables globales que enumera cada variable global en el programa en un orden específico. La variable global se agrega en grupos, donde cada grupo representa aquellas variables globales que es más probable que estén ubicadas en estrecha proximidad entre sí. Se selecciona una variable global de base del grupo cuya dirección está completamente resuelta. Las direcciones de las variables globales restantes en el grupo se configuran como desplazamientos que se basan en su posición en la lista ordenada de variables globales con respecto a una posición de la variable global de base. De esta manera, se genera una única instrucción para la dirección de base de una página de memoria común compartida por las variables globales dentro de un grupo.
Ejemplos de entornos informáticos adecuados
A continuación, la atención se dirige a una discusión de entornos operativos a modo de ejemplo. La figura 6 representa un primer entorno operativo a modo de ejemplo 600 que incluye un entorno de desarrollo integrado (“IDE”) 602 y un tiempo de ejecución de lenguaje común (“CLR”) 604. El IDE 602 (por ejemplo, Visual Studio, NetBeans, Eclipse, JetBrains, NetCode, etc.) puede permitir que un usuario (por ejemplo, desarrollador, programador, diseñador, codificador, etc.) diseñe, codifique, compile, someta a prueba, ejecute, edite, depure o construya un programa, conjunto de programas, sitios web, aplicaciones web, paquetes, y servicios web en un dispositivo informático. Programas de software incluyen el código fuente 610 creado en uno o más lenguajes de código fuente (por ejemplo, Visual Basic, Visual J#, C++. C#, J#, Java Script, APL, COBOL, Pascal, Eiffel, Haskell, ML, Oberon, Perl, Python, Scheme, Smalltalk y similares).
El IDE 602 puede proporcionar un entorno de desarrollo de código nativo o puede proporcionar un desarrollo de código gestionado que se ejecuta en una máquina virtual de lenguaje o puede proporcionar una combinación de los mismos. El IDE 602 puede proporcionar un entorno de desarrollo de código gestionado usando el marco NET que puede incluir una interfaz de usuario 606, un editor 608 de código fuente, y un compilador 612 de front-end o lenguaje. Un usuario puede crear y/o editar el código fuente según técnicas de programación de software conocidas y las reglas lógicas y sintácticas específicas asociadas con un lenguaje de origen particular a través de la interfaz de usuario 606 y el editor 608 de código fuente en el IDE 602. Posteriormente, el código fuente 610 puede compilarse a través de un compilador 612 de front-end, por lo que se crea una representación de código intermedio 616 del programa y los metadatos 614.
Se crean uno o más archivos 620 de código de objeto usando un compilador 612 de lenguaje específico a partir de la representación 614 de código intermedio y los metadatos 614 cuando se ejecuta el programa. En un aspecto, cuando se ejecuta la representación 616 de código intermedio, se compila mientras se ejecuta en el lenguaje máquina apropiado para la plataforma en la que está ejecutándose, haciendo de este modo que el archivo 624 de imagen sea portátil a través de múltiples plataformas. Alternativamente, en otros aspectos, los archivos 620 de código de objeto pueden compilarse al lenguaje máquina de código nativo y enlazarse para generar un archivo de imagen apropiado para su plataforma prevista.
En un aspecto de la invención, el IDE 602 puede operar en un primer dispositivo informático 630 y el CLR 604 puede operar en un segundo dispositivo informático 626 que es distinto del primer dispositivo informático 630. En otro aspecto de la invención, el IDE 602 y el CLR 604 pueden operar en el mismo dispositivo informático. Los dispositivos informáticos 626, 630 pueden ser cualquier tipo de dispositivo electrónico, tales como, sin limitación, un dispositivo móvil, un asistente digital personal, un dispositivo informático móvil, un teléfono inteligente, un teléfono móvil, un ordenador portátil, un servidor, una matriz de servidores o granja de servidores, un servidor web, un servidor de red, un servidor de tipo blade, un servidor de Internet, una estación de trabajo, un miniordenador, un ordenador central, un superordenador, un aparato de red, un aparato de web, un sistema informático distribuido, sistemas multiprocesador, o una combinación de los mismos.
El primer y segundo dispositivos informáticos 626, 630 pueden estar acoplado de manera comunicativa a través de un marco de comunicaciones 628. El marco de comunicaciones 628 facilita las comunicaciones entre los dispositivos informáticos. El marco de comunicaciones 628 puede incorporar cualquier técnica de comunicación bien conocida, tales como técnicas adecuadas para su uso con redes de conmutación de paquetes (por ejemplo, redes públicas tales como Internet, redes privadas tales como una intranet empresarial, y así sucesivamente), redes de conmutación de circuitos (por ejemplo, la red telefónica conmutada pública), o una combinación de redes de conmutación de paquetes y redes de conmutación de circuitos (con puertas de enlace y traductores).
Aunque el entorno operativo anterior se ha descrito con respecto al marco .NET, la tecnología descrita en el presente documento no está limitada a ningún marco de software, lenguaje de programación, colección de compiladores, sistema operativo, plataforma de sistema operativo, proyecto de infraestructura de compilador particular y similares. Las técnicas descritas en el presente documento pueden emplearse en la colección de compiladores GNU (GCC) y la infraestructura de compilador de máquina virtual de bajo nivel (LLVM) y otros compiladores y sistemas operativos.
A continuación, la atención se dirige a la figura 7 y una discusión de un segundo entorno operativo a modo de ejemplo. Debe indicarse que el entorno operativo 700 es a modo de ejemplo y no se pretende que sugiera ninguna limitación en cuanto a la funcionalidad de las realizaciones. Las realizaciones pueden aplicarse a un entorno operativo 700 utilizando al menos un dispositivo informático 702. El dispositivo informático 702 puede ser cualquier tipo de dispositivo electrónico, tales como, sin limitación, un dispositivo móvil, un asistente digital personal, un dispositivo informático móvil, un teléfono inteligente, un teléfono móvil, un ordenador portátil, un servidor, una matriz de servidores o granja de servidores, un servidor web, un servidor de red, un servidor de tipo blade, un servidor de Internet, una estación de trabajo, un miniordenador, un ordenador central, un superordenador, un aparato de red, un aparato de web, un sistema informático distribuido, sistemas multiprocesador, o una combinación de los mismos. El entorno operativo 700 puede configurarse en un entorno de red, un entorno distribuido, un entorno de múltiples procesadores, o un dispositivo informático independiente que tiene acceso a dispositivos de almacenamiento remotos o locales.
El dispositivo informático 702 puede incluir uno o más procesadores 704, una interfaz de comunicación 706, un dispositivo de almacenamiento 708, uno o más dispositivos de entrada 710, uno o más dispositivos de salida 716, y una memoria 714. Un procesador 704 puede ser cualquier procesador disponible comercialmente y puede incluir arquitecturas de múltiples procesadores y microprocesadores duales. La interfaz de comunicación 706 facilita las comunicaciones por cable o inalámbricas entre el dispositivo informático 702 y otros dispositivos. El dispositivo de almacenamiento 708 puede ser un medio legible por ordenador que no contiene señales de propagación, tales como señales de datos moduladas transmitidas a través de una onda portadora. Ejemplos del dispositivo de almacenamiento 708 incluyen, sin limitación, RAM, ROM, EEPROM, memoria flash u otra tecnología de memoria, CD-ROM, discos versátiles digitales (DVD), u otro almacenamiento óptico, casetes magnéticos, cinta magnética, almacenamiento en disco magnético, todos de los cuales no contienen señales de propagación, tales como señales de datos moduladas transmitidas a través de una onda portadora. Los dispositivos de entrada 710 pueden incluir un teclado, ratón, bolígrafo, dispositivo de entrada de voz, dispositivo de entrada táctil, etc., y cualquier combinación de los mismos. Los dispositivos de salida 716 pueden incluir un elemento de visualización, altavoces, impresoras, etc., y cualquier combinación de los mismos.
La memoria 714 puede ser cualquier medio de almacenamiento legible por ordenador no transitorio que pueda almacenar procedimientos ejecutables, aplicaciones, y datos. Los medios de almacenamiento legibles por ordenador no pertenecen a señales propagadas, tales como señales de datos moduladas transmitidas a través de una onda portadora. Puede ser cualquier tipo de dispositivo de memoria no transitorio (por ejemplo, memoria de acceso aleatorio, memoria de solo lectura, etc.), almacenamiento magnético, almacenamiento volátil, almacenamiento no volátil, almacenamiento óptico, DVD, CD, unidad de disquete, etc. que no pertenece a señales propagadas, tales como señales de datos moduladas transmitidas a través de una onda portadora. La memoria 714 también puede incluir uno o más dispositivos de almacenamiento externos o dispositivos de almacenamiento ubicados de manera remota que no pertenecen a señales propagadas, tales como señales de datos moduladas transmitidas a través de una onda portadora.
La memoria 714 puede contener instrucciones, componentes, y datos. Un componente es un programa de software que realiza una función específica y se conoce de otro modo como módulo, aplicación, y similares. La memoria 714 puede incluir un sistema operativo 720, un compilador 722 de lenguaje, un compilador 724 de back-end que tiene un componente 726 de paso previo y un componente 728 de generación de código, uno o más archivos 730 de código fuente, uno o más archivos 732 de ensamblado, un gráfico 734 de diseño, una lista 736 de orden de variables globales, uno o más archivos 738 de objeto, un enlazador 740, un archivo 742 de imagen, y diversas otras aplicaciones, componentes, y datos 744.
A continuación, la atención se dirige a la figura 8 y una discusión de un tercer entorno operativo 800 a modo de ejemplo. Debe indicarse que el entorno operativo 800 es a modo de ejemplo y no se pretende que sugiera ninguna limitación en cuanto a la funcionalidad de las realizaciones. La realización mostrada en la figura 8 pertenece a un servicio en la nube 802 que proporciona servicios de compilación bajo demanda para usuarios que interactúan con el servicio en la nube 802 desde una máquina cliente 804. En este entorno operativo, el servicio en la nube 802 puede realizarse como un centro de datos que tiene un grupo de máquinas informáticas físicas que se comunican a través de una red a una o más máquinas cliente. Alternativamente, el servicio en la nube 802 puede configurarse como un grupo de hardware (por ejemplo, recursos informáticos, recursos de red, recursos de almacenamiento) y recursos de software configurados para aprovisionar, crear y gestionar máquinas virtuales y sus sistemas operativos para proporcionar los servicios de compilación bajo demanda. El servicio en la nube 802 puede tener uno o más dispositivos informáticos 806, cada uno incluyendo uno o más procesadores 808, una memoria 810, y una interfaz de red 812. La memoria 810 puede almacenar un compilador de lenguaje 814, un compilador 816 de back-end, un enlazador 818, un compilador 820 de generación de perfiles, y un motor de ejecución 822 que opera como se ha descrito anteriormente.
Los servicios de compilación proporcionados por el servicio en la nube 802 pueden ser, sin limitación, generar un archivo de imagen o archivo de objeto que tiene instrucciones reducidas para cargar las direcciones de variables globales usando las técnicas descritas en el presente documento. El servicio en la nube 802 puede proporcionar cualquier número de una variedad de servicios, tales como, sin limitación, compilar archivos de código fuente en un archivo de código de objeto o archivo de imagen, crear un archivo de código de objeto o archivo de imagen a partir de un archivo de ensamblado, generar datos de perfil para un programa, compilar un archivo de ensamblado donde los archivos de origen se compilaron en la máquina cliente, y así sucesivamente. El servicio en la nube 802 puede recibir uno o más archivos de código fuente y/o un archivo de ensamblado desde una máquina cliente y puede devolver a la máquina cliente uno o más de un archivo de imagen, un archivo de código de objeto y/o datos de perfil.
El servicio en la nube 802 interactúa a través de una red 824 con una o más máquinas cliente 804, cuyos usuarios solicitan los servicios de compilación del servicio en la nube 802. La red 824 puede ser cualquier tipo de medio de comunicación tal como, sin limitación, redes de área local, redes de área amplia y puede utilizar cualquier tipo de protocolo de comunicación (es decir, por cable o inalámbrico). Los dispositivos informáticos 806 del servicio en la nube 802 y la máquina cliente 804 pueden consistir en un dispositivo móvil, un asistente digital personal, un dispositivo informático móvil, un teléfono inteligente, un teléfono móvil, un ordenador portátil, un servidor, una matriz de servidores o granja de servidores, un servidor web, un servidor de red, un servidor de tipo blade, un servidor de Internet, una estación de trabajo, un miniordenador, un ordenador central, un superordenador, un aparato de red, un aparato de web, un sistema informático distribuido, sistemas multiprocesador, o una combinación de los mismos.
Una máquina cliente 804 puede incluir uno o más procesadores 826, una memoria 828, y una interfaz de red 830 que permite comunicaciones entre el servicio en la nube 802 y la máquina cliente 804 como se describió anteriormente. En un aspecto, la memoria 828 de la máquina cliente 804 puede almacenar uno o más archivos 832 de código fuente, uno o más archivos 834 de ensamblado, un compilador 836 de back-end, un enlazador 838, un archivo 840 de imagen, un compilador 842 de lenguaje, un archivo 844 de código de objeto y datos 846 de perfil.
Según aspectos de la materia objeto descritos en el presente documento, un sistema informático puede incluir uno o más procesadores y una memoria conectada al uno o más procesadores. El sistema puede incluir un compilador que se ejecuta en el al menos un procesador que genera un orden clasificado de una o más variables globales en un programa basándose en el uso de la una o más variables globales en el programa, forma un grupo de variables seleccionadas de la una o más variables globales que se usan dentro de una misma función de un programa, selecciona una variable global de base a partir de un grupo que tiene la clasificación más alta en el orden clasificado, y genera una primera instrucción para cargar una dirección de base de una página de memoria de la variable global de base, una segunda instrucción para añadir un primer desplazamiento a la dirección de base para generar una dirección de la variable global de base, y una tercera instrucción para añadir un segundo desplazamiento a la dirección de la variable global de base para generar una dirección de una segunda variable global dentro de la misma función del programa.
En un aspecto, el uso de la una o más variables globales en el programa se determina a partir de un análisis estático del programa y, en otro aspecto, el uso de la una o más variables globales en el programa se determina a partir de datos de perfil de ejecuciones en tiempo de ejecución del programa. En un aspecto, el orden clasificado se basa en la alineación y el tamaño de la una o más variables globales. Cada variable global en el orden clasificado está asociada con una posición en el orden clasificado que representa una distancia desde una primera variable global en el orden clasificado. La distancia desde la primera variable global se basa en un tamaño y alineación de variables globales dentro del orden clasificado. El segundo desplazamiento se basa en una posición diferente de la segunda variable global en el orden clasificado con respecto a la posición de la primera variable global en el orden clasificado.
Un dispositivo puede incluir al menos un procesador y una memoria conectada al al menos un procesador. El dispositivo incluye un compilador que genera una pluralidad de instrucciones ejecutables que, cuando se ejecuta en el al menos un procesador, genera una dirección de una primera variable global usando una instrucción ADRP emparejada con una instrucción ADD correspondiente en un primer registro, la instrucción ADRP carga una dirección de base de una página de memoria de la primera variable global y la instrucción ADD correspondiente añade un desplazamiento que indica una posición de la primera variable global en la página de memoria, incluyendo el archivo ejecutable una instrucción ADD posterior configurada para añadir un desplazamiento al primer registro para generar una dirección de una segunda variable global dentro de la página de memoria.
La instrucción ADRP incluye una dirección de página de 20 bits común tanto a la primera variable global como a la segunda variable global y la instrucción ADD posterior añade un desplazamiento de 12 bits a la dirección en el primer registro para generar la dirección de la segunda variable global. Un desplazamiento de la instrucción ADD posterior se basa en una diferencia estimada en la posición de la primera variable global y una posición de la segunda variable global en una misma página de memoria. La diferencia estimada en la posición de la primera variable global y la posición de la segunda variable global se basa en posiciones respectivas en una lista de orden de variables globales, en donde la lista de orden de variables globales clasifica variables globales en un programa basándose en la frecuencia de uso. La frecuencia de uso es a partir de un análisis estático del programa y/o de datos de perfil. La primera variable global y la segunda variable global se usan en una misma función dentro de un programa.
Un método que usa un sistema y un dispositivo, tal como el sistema y el dispositivo descritos anteriormente, genera una dirección de una primera variable global usando una primera instrucción que carga una primera parte de la dirección de una primera variable global y una segunda instrucción que carga una segunda parte de la dirección de la primera variable global, determina que una segunda variable global reside en una misma página de memoria que la primera variable global; y genera una dirección de una segunda variable global usando una tercera instrucción añadiendo un desplazamiento a la dirección de la primera variable global, en donde el desplazamiento se basa en la distancia desde la segunda variable global con respecto a la primera variable global en una lista de orden de variables globales y la lista de orden de variables globales incluye un orden de variables globales usadas en un programa basándose en la frecuencia de uso.
En un aspecto, la primera parte de la dirección es una dirección de base de la misma página de memoria. La segunda parte de la dirección es una ubicación de la primera variable global dentro de la misma página de memoria. La primera instrucción, la segunda instrucción y la tercera instrucción son instrucciones de 32 bits y la dirección de la primera variable global y la dirección de la segunda variable global tienen 32 bits de longitud. La primera parte de la dirección es de 20 bits, la segunda parte de la dirección es de 12 bits, y el desplazamiento es de 12 bits. La frecuencia de uso de una variable global se basa en un análisis estático del programa y/o datos de perfil.
Aunque la materia objeto se ha descrito en un lenguaje específico para las características estructurales y/o acciones metodológicas, debe entenderse que la materia objeto definida en las reivindicaciones adjuntas no se limita necesariamente a las características o acciones específicas descritas anteriormente. En su lugar, las características y acciones específicas descritas anteriormente se dan a conocer como formas de ejemplo de implementación de las reivindicaciones.

Claims (8)

REIVINDICACIONES
1. Sistema (100), que comprende:
al menos un procesador y una memoria; y
un compilador (104), que se ejecuta en el al menos un procesador, que:
genera un orden clasificado (302) de una o más variables globales en un programa basándose en el uso de la una o más variables globales en el programa;
forma un grupo (334) de variables seleccionadas de la una o más variables globales que se usan dentro de una misma función (304, 310, 318, 326) de un programa;
selecciona una variable global de base del grupo (334), en el que la variable global de base tiene la clasificación más alta en el orden clasificado (302); y
genera una primera instrucción para cargar una dirección de base de una página de memoria de la variable global de base, una segunda instrucción para añadir un primer desplazamiento (342) a la dirección de base para generar una dirección de la variable global de base, y una tercera instrucción para añadir un segundo desplazamiento (342) a la dirección de la variable global de base para generar una dirección de una segunda variable global dentro de la misma función del programa, en el que el segundo desplazamiento (342) se basa en una distancia de la segunda variable global desde la variable global de base en el orden clasificado (302) de variables globales.
2. Sistema (100) según la reivindicación 1, en el que el uso de la una o más variables globales en el programa se determina a partir de un análisis estático del programa.
3. Sistema (100) según la reivindicación 1, en el que el uso de la una o más variables globales en el programa se determina a partir de datos de perfil de ejecuciones en tiempo de ejecución del programa.
4. Sistema (100) según la reivindicación 1, en el que el orden clasificado (302) se basa en la alineación y el tamaño de la una o más variables globales.
5. Sistema (100) según la reivindicación 1, en el que cada variable global en el orden clasificado (302) está asociada con una posición en el orden clasificado (302) que representa una distancia desde una primera variable global en el orden clasificado (302).
6. Método realizado por un compilador (104), que comprende:
generar un orden clasificado (302) de una o más variables globales en un programa basándose en la frecuencia de uso de la una o más variables globales en el programa;
formar un grupo (334) de variables seleccionadas de la una o más variables globales que se usan dentro de una misma función (304, 310, 318, 326) de un programa;
seleccionar una variable global de base del grupo (334), en el que la variable global de base tiene la clasificación más alta en el orden clasificado (302); y
generar una primera instrucción para cargar una dirección de base de una página de memoria de la variable global de base, una segunda instrucción para añadir un primer desplazamiento (342) a la dirección de base para generar una dirección de la variable global de base, y una tercera instrucción para añadir un segundo desplazamiento (342) a la dirección de la variable global de base para generar una dirección de una segunda variable global dentro de la misma función del programa, en el que el segundo desplazamiento (342) se basa en una distancia de la segunda variable global desde la variable global de base en el orden clasificado (302) de variables globales.
7. Método según la reivindicación 6, en el que la primera instrucción, la segunda instrucción, y la tercera instrucción son instrucciones de 32 bits y la dirección de la primera variable global y la dirección de la segunda variable global tienen 32 bits de longitud.
8. Método según la reivindicación 6, en el que la frecuencia de uso de una variable global se basa en un análisis estático del programa y/o datos de perfil.
ES18837138T 2018-01-08 2018-12-31 Instrucciones reducidas para generar direcciones de variables globales Active ES2908651T3 (es)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US15/865,148 US11321236B2 (en) 2018-01-08 2018-01-08 Reduced instructions to generate global variable addresses
PCT/US2018/068091 WO2019136014A1 (en) 2018-01-08 2018-12-31 Reduced instructions to generate global variable addresses

Publications (1)

Publication Number Publication Date
ES2908651T3 true ES2908651T3 (es) 2022-05-03

Family

ID=65139279

Family Applications (1)

Application Number Title Priority Date Filing Date
ES18837138T Active ES2908651T3 (es) 2018-01-08 2018-12-31 Instrucciones reducidas para generar direcciones de variables globales

Country Status (4)

Country Link
US (2) US11321236B2 (es)
EP (1) EP3738028B1 (es)
ES (1) ES2908651T3 (es)
WO (1) WO2019136014A1 (es)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11068281B2 (en) * 2018-03-02 2021-07-20 Fastly, Inc. Isolating applications at the edge
EP3961374B1 (en) * 2020-08-26 2023-03-01 Tata Consultancy Services Limited Method and system for automated classification of variables using unsupervised distribution agnostic clustering

Family Cites Families (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5175856A (en) * 1990-06-11 1992-12-29 Supercomputer Systems Limited Partnership Computer with integrated hierarchical representation (ihr) of program wherein ihr file is available for debugging and optimizing during target execution
CA2166254C (en) * 1995-12-28 2000-02-01 Robert James Blainey Improving memory layout based on connectivity considerations
CA2166252C (en) * 1995-12-28 1999-08-24 Robert James Blainey Global variable coalescing
US6862729B1 (en) * 2000-04-04 2005-03-01 Microsoft Corporation Profile-driven data layout optimization
US6535969B1 (en) * 2000-06-15 2003-03-18 Lsi Logic Corporation Method and apparatus for allocating free memory
US7069548B2 (en) * 2002-06-28 2006-06-27 Intel Corporation Inter-procedure global register allocation method
US7310799B2 (en) * 2002-12-31 2007-12-18 International Business Machines Corporation Reducing load instructions via global data reordering
US7765534B2 (en) * 2004-04-30 2010-07-27 International Business Machines Corporation Compiler with cache utilization optimizations
US7661102B2 (en) * 2004-08-20 2010-02-09 Smith Micro Software, Inc. Method for reducing binary image update package sizes
US7784042B1 (en) * 2005-11-10 2010-08-24 Oracle America, Inc. Data reordering for improved cache operation
US8185643B2 (en) * 2005-11-17 2012-05-22 Oracle International Corporation System and method for providing security in a communities framework
WO2007085122A1 (en) 2006-01-26 2007-08-02 Intel Corporation Optimizing memory accesses for network applications using indexed register files
US8656381B2 (en) * 2006-12-07 2014-02-18 International Business Machines Corporation Presenting machine instructions in a machine-independent tree form suitable for post-link optimizations
US9111108B2 (en) * 2008-02-25 2015-08-18 Telefonaktiebolaget L M Ericsson (Publ) System, method and program for controlling access rights
GB2488980B (en) * 2011-03-07 2020-02-19 Advanced Risc Mach Ltd Address generation in a data processing apparatus
CN102902568B (zh) * 2011-07-27 2016-08-17 国际商业机器公司 一种用于处理应用程序的内容表访问溢出的方法和系统
US8615745B2 (en) * 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US9329850B2 (en) * 2014-06-24 2016-05-03 International Business Machines Corporation Relocation of instructions that use relative addressing
US9600275B2 (en) * 2015-03-12 2017-03-21 International Business Machines Corporation Smart source code review system
US10175977B2 (en) * 2015-11-04 2019-01-08 International Business Machines Corporation User profile based code review
US10127019B2 (en) * 2017-03-08 2018-11-13 Hartford Fire Insurance Company System to coordinate source code module changes
US20190065199A1 (en) * 2017-08-31 2019-02-28 MIPS Tech, LLC Saving and restoring non-contiguous blocks of preserved registers
US11900667B2 (en) * 2021-04-28 2024-02-13 International Business Machines Corporation Parametric curves based detector network

Also Published As

Publication number Publication date
EP3738028A1 (en) 2020-11-18
EP3738028B1 (en) 2022-02-02
US11599478B2 (en) 2023-03-07
US11321236B2 (en) 2022-05-03
US20190213139A1 (en) 2019-07-11
WO2019136014A1 (en) 2019-07-11
US20220245068A1 (en) 2022-08-04

Similar Documents

Publication Publication Date Title
US8935683B2 (en) Inline function linking
JP5951022B2 (ja) デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのリンク
JP6044968B2 (ja) デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのコンパイル
US9928156B2 (en) Missing include suggestions for external files
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US20130283250A1 (en) Thread Specific Compiler Generated Customization of Runtime Support for Application Programming Interfaces
CN103858099A (zh) 用于在异构计算机上编译和运行高级程序的技术
US20170344349A1 (en) Sample driven profile guided optimization with precise correlation
JP4806060B2 (ja) コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム
US11599478B2 (en) Reduced instructions to generate global variable addresses
CN110058861B (zh) 源码处理方法及装置、存储介质、电子设备
Grosse-Kunstleve et al. Automatic Fortran to C++ conversion with FABLE
Kicherer et al. Seamlessly portable applications: Managing the diversity of modern heterogeneous systems
Eisl et al. Trace-based register allocation in a jit compiler
CN116830080A (zh) 经合并的机器级中间表示优化
Hong et al. Improving simd parallelism via dynamic binary translation
US9141356B2 (en) Process for generating dynamic type
US9135027B1 (en) Code generation and execution for dynamic programming languages
Ferrer et al. Mercurium: Design decisions for a s2s compiler
WO2021047662A1 (en) Method and apparatus for enabling autonomous acceleration of dataflow ai applications
Fumero et al. Using compiler snippets to exploit parallelism on heterogeneous hardware: a Java reduction case study
Jääskeläinen et al. Offloading C++ 17 parallel STL on system shared virtual memory platforms
CN113260976A (zh) 用于在编译源代码中调度指令技术
Weidendorfer et al. The case for binary rewriting at runtime for efficient implementation of high-level programming models in HPC
Horie et al. Optimization of X10 programs with ROSE compiler infrastructure