# Livermore

Livermore es un benchmark que consiste en una serie de rutinas computacionales desarrolladas por el Laboratorio Nacional de Lawrence Livermore (Livermore, California), y es utilizado para probar el rendimiento de sistemas en cuanto a aritmética de coma flotante escalares y vectoriales. Fue introducido originalmente en 1970, cuando estaba compuesto de 14 kernels de aplicaciones numéricas de coma flotante escritas en Fortran (aunque hoy existe una traducción a C); luego este número fue elevado a 24 en la década de 1980.

## Los orígenes

El motivo de su desarrollo fue que en este laboratorio les era imposible realizar benchmarks con programas que formen parte de su carga de trabajo normal. Estas aplicaciones reales normalmente excedían las 100.000 líneas de código, tenían muchas rutinas orientadas a hardware específico (lo que complica su portabilidad) y además la gran mayoría de este software es secreto. Dada la situación, resolvieron crear un benchmark con aplicaciones que fueran representativas de su carga de trabajo.
El resultado fue un benchmark que sirve para medir la capacidad del procesador en supercomputadoras. No es un benchmark sintético, ya que sus módulos provienen de partes de computaciones reales (a diferencia del Whetstone y el Dhrystone, que intentaban reproducir proporcionalmente las instrucciones más usadas por los programas de la época).

## El programa

El código fuente es un programa de un solo nivel contenido en un único archivo fuente que es fácilmente compilado y enlazado. La única función dependiente del sistema es la que llama al reloj del sistema para poder obtener la medición (en segundos). Si bien es necesaria la biblioteca de funciones matemáticas estándar, la ejecución de estas no insume la mayor parte del tiempo como sucede con otros benchmarks.
Ciertos kernels son vectorizables, y la reprogramación para aprovechar esta característica es permitida siempre y cuando su uso sea solamente para la demostración de las capacidades de una determinada tecnología.
Los resultados deben ser enviados al ASCI (Accelerated Strategic Computing Iniciative o Iniciativa de Computación Estratégica Acelerada) del Laboratorio Lawrence Livermore, quienes se encargan de poner las reglas y verificar los resultados que son publicados.

## Resultado

La medida de rendimiento está en término de Millones de Operaciones de Punto Flotante Por Segundo o MFLOPS. El programa además chequea la precisión computacional de los resultados (realiza una suma de comprobación y determina cuánto se aleja del estándar de punto flotante IEEE 754). Una de sus características es que no produce comparaciones de performance con un solo número, sino que ejecuta los 24 kernels en tres distintos bucles que producen 3 distintas medidas de rendimiento: para vectores cortos, medios y largos. Otorga también una serie de medidas generales, que consisten en la media aritmética, media geométrica y media armónica, mínimo y máximo de los resultados.

## Kernels que lo componen

Algunos kernels representan computaciones genéricas ampliamente usadas, como por ejemplo: producto puntual y matricial, polinomios, sumas y diferencias, recurrencias de primer orden, resolutores de matrices y buscadores de arreglos. Algunos kernels tipifican construcciones frecuentemente usadas y otras contienen construcciones que son difíciles de compilar en código de máquina eficiente.
* Kernel 1: un extracto de un código hidrodinámico.
* Kernel 2: un extracto de un código de un Gradiente Conjugado de Cholesky Incompleto.
* Kernel 3: la función estándar de Productor Interior del álgebra lineal.
* Kernel 4: un extracto de una rutina de Ecuaciones Lineales Coligadas.
* Kernel 5: un extracto de una rutina de Eliminación Tridiagonal.
* Kernel 6: un ejemplo de una ecuación de recurrencia lineal general.
* Kernel 7: un fragmento de Ecuación de Estado.
* Kernel 8: un extracto de un código de Dirección Alternativa e Integración Implícita.
* Kernel 9: un código de Predictor de Integración.
* Kernel 10: un código de Predictor de Desfase.
* Kernel 11: una Suma Primaria.
* Kernel 12: una Resta Primaria.
* Kernel 13: un extracto de un código de Partícula en Celda de 2 Dimensiones.
* Kernel 14: un extracto de un código de Partícula en Celda de 1 Dimensión.
* Kernel 15: un ejemplo de cómo puede ser escrito FORTRAN casual.
* Kernel 16: un bucle de búsqueda de un código de Monte Carlo.
* Kernel 17: un ejemplo de computación condicional implícita.
* Kernel 18: un extracto de un código de Hidrodinámica Explícita en 2 Dimensiones.
* Kernel 19: una Ecuación general de Recurrencia Lineal.
* Kernel 20: un extracto de un programa de Transporte Ordinario Discreto.
* Kernel 21: un cálculo de un producto de matrices.
* Kernel 22: un procedimiento de Distribución Planckiana.
* Kernel 23: un extracto de Hidrodinámica Implícita de 2 Dimensiones.
* Kernel 24: encuentra la ubicación del primer mínimo de X.