Manualinux
http://www.nvu.com http://www.gimp.org InicioPresentaciónActualizacionesManualesDescargasNoticiasAgradecimientoEnlaces

Entornos GráficosAplicaciones

DesarrolloEmuladoresInternetJuegosMultimediaSistema

Compiladores Caché - CcacheCompiladores Caché - Sccache

Compiladores Caché - F90cache




Compiladores Caché - F90cache




Copyright

Copyright © José Luis Lara Carrascal  2012-2023   http://manualinux.es



Sumario

Introducción
Instalación
Configuración
Enlaces



 
Introducción

F90cache es la versión para Fortran del compilador caché, Ccache. Al igual que este último, puede llegar a acelerar hasta 10 veces la recompilación de cualquier programa cuyo código fuente esté escrito en Fortran. Soporta versiones superiores de GNU Gfortran, a la 4.3, además de otra serie de compiladores de otros desarrolladores o fabricantes de software.

En este manual trataremos su instalación desde código fuente y su configuración para que todos los procesos de compilación de código escrito en Fortran, que llevemos a cabo en nuestro sistema sean cacheados por F90cache.



Instalación

Dependencias

Herramientas de Compilación


Entre paréntesis la versión con la que se ha compilado F90cache para la elaboración de este documento.

* GCC - (13.2.0) o Clang - (17.0.3)
* Make - (4.4.1)
* Automake - (1.16.5)
* Autoconf - (2.71)



Descarga

f90cache-0.99c.tar.gz  |  patch-f90cache-0.patch

Optimizaciones

$ export {C,CXX}FLAGS='-O3 -march=znver3 -mtune=znver3'

Donde pone znver3 se indica el procesador respectivo de cada sistema seleccionándolo de la siguiente tabla:
Nota informativa sobre las optimizaciones para GCC
* La opción '-march=' establece el procesador mínimo con el que funcionará el programa compilado, la opción '-mtune=' el procesador específico para el que será optimizado. 

* Los valores separados por comas, son equivalentes, es decir, que lo mismo da poner '-march=k8' que '-march=athlon64'.

* En versiones de GCC 3.2 e inferiores se utiliza la opción '-mcpu=' en lugar de '-mtune='.
Nota informativa sobre las optimizaciones para Clang
* La opción '-mtune=' está soportada a partir de la versión 3.4 de Clang.

* Los valores de color azul no son compatibles con Clang.

* Las filas con el fondo de color amarillo son valores exclusivos de Clang y, por lo tanto, no son aplicables con GCC.
Valores CPU
Genéricos
Intel
AMD

Optimizaciones adicionales

Optimizaciones adicionales
GCC
Graphite
$ export {C,CXX}FLAGS+=' -ftree-loop-linear -floop-strip-mine -floop-block'
IPA
$ export {C,CXX}FLAGS+=' -fipa-pta'
LTO
$ export AR=gcc-ar RANLIB=gcc-ranlib NM=gcc-nm
$ export {C,CXX}FLAGS+=' -fuse-linker-plugin -flto=auto'
En versiones inferiores a GCC 10, sustituir auto por el número de núcleos que tenga nuestro procesador. Si sólo tiene uno, utilizar el parámetro -flto
Clang
Polly
$ export {C,CXX}FLAGS+=' -O3 -mllvm -polly -mllvm -polly-vectorizer=stripmine'
LTO
$ export {C,CXX,LD}FLAGS+=' -flto'
ThinLTO
$ export {C,CXX,LD}FLAGS+=' -flto=thin'
La aplicación de esta optimización es alternativa a la tradicional LTO, a partir de Clang 3.9 y, por lo tanto, no es combinable con la misma.
Unified LTO
LTO >> ThinLTO
$ export {C,CXX}FLAGS+=' -flto -funified-lto'
$ export LDFLAGS+=' -Wl,--lto=thin'
ThinLTO >> LTO
$ export {C,CXX}FLAGS+=' -flto=thin -funified-lto'
$ export LDFLAGS+=' -Wl,--lto=full'
La aplicación de esta optimización es aplicable, a partir de Clang 17, y sólo es combinable con LLD.

Parámetros adicionales

Parámetros adicionales de eliminación de avisos en el proceso de compilación
$ export {C,CXX}FLAGS+=' -w'

Establecer la ruta de búsqueda de directorios de librerías en sistemas de 64 bits multiarquitectura
$ export LDFLAGS+=" -L/usr/lib64 -L/usr/local/lib64 -L/opt/gcc13/lib64"

Establecer el uso de enlazador dinámico para Mold
$ export LDFLAGS+=' -fuse-ld=mold'

Establecer el uso de enlazador dinámico para LLD
Clang
$ export LDFLAGS+=' -fuse-ld=lld'
Optimizaciones complementarias LTO/ThinLTO de LLD
$ export LDFLAGS+=' -Wl,--lto-aa-pipeline=globals-aa -Wl,--lto-newpm-passes=memcpyopt'
Optimizaciones complementarias LTO de LLD
$ export LDFLAGS+=" -Wl,--lto-partitions=$(expr $(nproc) / 2)"
Optimizaciones complementarias ThinLTO de LLD
$ export LDFLAGS+=" -Wl,--thinlto-jobs=$(expr $(nproc) / 2"

Establecer la variable de entorno de uso de compilador para Clang
$ export CC=clang CXX=clang++

Extracción y Configuración  Bloc de Notas Información general sobre el uso de los comandos

$ tar zxvf f90cache-0.99c.tar.gz
$ cd f90cache-0.99c
$ patch -Np1 -i ../patch-f90cache-0.patch
$ ./configure --prefix=/usr

Explicación de los comandos

patch -Np1 -i ../patch-f90cache-0.patch : Aplicamos este parche proporcionado por la distribución Fedora, para poder utilizar F90cache, con versiones superiores a GCC 9.

--prefix=/usr : Instala F90cache en el directorio principal /usr.

Compilación

$ make

Parámetros de compilación opcionales

-j$(nproc) : Establece el número de procesos de compilación en paralelo, en función del número de núcleos e hilos de nuestro procesador, tomando como referencia la información mostrada por el sistema con el comando correspondiente. Si nuestro procesador es mononúcleo de un solo hilo, no añadir esta opción.

Instalación como root

$ su
# make install
# install -dm755 /usr/libexec/f90cache
# ln -s /usr/bin/f90cache /usr/libexec/f90cache/gfortran

Explicación de los comandos

install -dm755 /usr/libexec/f90cache : Crea el directorio de ubicación del enlace simbólico, cuya ubicación activaremos con el correspondiente alias global de bash.

ln -s /usr/bin/f90cache /usr/libexec/f90cache/gfortran : Crea el enlace simbólico correspondiente  a gfortran, apuntando al binario ejecutable f90cache.

Creación de un alias global de Bash

Para activar f90cache, cuando lo creamos conveniente, creamos el alias global de Bash correspondiente, que instalaremos en /etc/profile.d.

# cat > f90cache.sh << "EOF"
#!/bin/sh

alias f90="export PATH=/usr/libexec/f90cache:$PATH"
EOF
# install -m755 f90cache.sh /etc/profile.d

Ahora basta ejecutar f90, para activar el uso de F90Cache:

$ f90

Para comprobar que estamos utilizando este enlace simbólico, nada mejor que utilizar el programa which, que se encarga de buscar el binario que le indiquemos previamente. Por último recordar que la ejecución de F90cache es completamente transparente en los procesos de compilación, es decir, no vamos a notar que se está ejecutando cuando compilemos un programa, la única manera de saberlo es comprobar con cualquier administrador de archivos que el directorio de la caché, tiene actividad.

[jose@localhost ~]$ which gfortran
/usr/libexec/gfortran

Si lo queremos utilizar en combinación con Ccache, BuildCache o Sccache, no es necesario utilizar este alias, basta crear un enlace simbólico que apunte en cada uno de los directorios de ubicación de los enlaces que se incluyen en sus respectivos manuales:

De forma individual, un ejemplo con Ccache:

# ln -s /usr/bin/f90cache /usr/libexec/ccache/gfortran

O un comando de enlazado en grupo, para todos los compiladores caché que tengamos instalados en nuestro sistema, siguiendo sus respectivos manuales ubicados en la web:

# for i in /usr/libexec/{ccache,buildcache,sccache} ; do \
ln -s /usr/bin/f90cache $i/gfortran ; \
done

Cuando activemos cualquiera de estos compiladores caché con sus respectivos alias, ya quedará incluido también el uso de F90cache. Eso sí, es bueno mantener el alias por si, en una determinada compilación, queremos cachear el código escrito en Fortran, pero no queremos cachear el resto de código de un determinado paquete de código fuente.

Estadísticas de Compilación e Instalación de F90cache

Estadísticas de Compilación e Instalación de F90cache
CPU AMD Ryzen 5 5500
MHz 3593.250 (BoostMax=4457.000)
RAM 32 GB
Sistema de archivos XFS
Versión del Kernel 6.5.9-ml SMP PREEMPT x86_64
Modo de frecuencia de la CPU powersave (balance performance)
Planificador de CPU BORE+EEVDF
Versión de Glibc 2.38
Enlazador dinámico LLD 17.0.3
Compilador Clang 17.0.3
Parámetros de optimización -03 -march=znver3 -mtune=znver3 -mllvm -polly -mllvm -polly-vectorizer=stripmine -flto -funified-lto -Wl,--lto=thin -Wl,--thinlto-jobs=6 -Wl,--lto-new-pass-manager -Wl,--lto-aa-pipeline=globals-aa -Wl,--lto-newpm-passes=memcpyopt
Parámetros de compilación -j12
Tiempo de compilación 1"
Archivos instalados 2
Mostrar/Ocultar la lista de archivos instalados
Enlaces simbólicos creados 1
/usr/libexec/f90cache/gfortran
Ocupación de espacio en disco 88 KB

Desinstalación como root

1) MODO TRADICIONAL

Este programa no tiene soporte para desinstalación con el comando 'make uninstall'

2) MODO MANUALINUX

El principal inconveniente del comando anterior es que tenemos que tener el directorio de compilación en nuestro sistema para poder desinstalar el programa. En algunos casos esto supone muchos megas de espacio en disco. Con el paquete de scripts que pongo a continuación logramos evitar el único inconveniente que tiene la compilación de programas, y es el tema de la desinstalación de los mismos sin la necesidad de tener obligatoriamente una copia de las fuentes compiladas.

f90cache-0.99c-scripts.tar.gz

$ su 
# tar zxvf f90cache-0.99c-scripts.tar.gz
# cd f90cache-0.99c-scripts
# ./Desinstalar_f90cache-0.99c

Copia de Seguridad como root

Con este otro script creamos una copia de seguridad de los binarios compilados, recreando la estructura de directorios de los mismos en un directorio de copias de seguridad (copibin) que se crea en el directorio /var. Cuando se haya creado el paquete comprimido de los binarios podemos copiarlo como usuario a nuestro home y borrar el que ha creado el script de respaldo, teniendo en cuenta que si queremos volver a restaurar la copia, tendremos que volver a copiarlo al lugar donde se ha creado.

$ su 
# tar zxvf f90cache-0.99c-scripts.tar.gz
# cd f90cache-0.99c-scripts
# ./Respaldar_f90cache-0.99c

Restaurar la Copia de Seguridad como root

Y con este otro script (que se copia de forma automática cuando creamos la copia de respaldo del programa) restauramos la copia de seguridad como root cuando resulte necesario.

$ su 
# cd /var/copibin/restaurar_copias
# ./Restaurar_f90cache-0.99c



Configuración de F90cache  

1) El directorio por defecto de ubicación de la caché
2) Establecer un directorio único de caché para todos los usuarios
3) Limpiar la caché
4) Estadísticas de uso
5) Uso de otras versiones de GFortran con F90cache
6) Desactivar el uso de F90cache
7) Volver a almacenar una compilación determinada (sobrescribir la caché)
8) Saber en todo momento, qué hace F90cache


1) El directorio por defecto de ubicación de la caché

~/.f90cache

Tanto en nuestro directorio personal, como en el directorio del root, el tamaño máximo definido por defecto de la caché es de 1 GB, tamaño que podemos modificar desde la línea de comandos, con el siguiente comando, un ejemplo estableciéndola en 500 MB.

[jose@localhost ~]$ f90cache -M 500M
Set cache size limit to 512000k

También podemos utilizar G (para GB) y K (para KB), otro ejemplo, esta vez la pongo en 2 GB.

[jose@localhost ~]$ f90cache -M 2G
Set cache size limit to 2097152k

2) Establecer un directorio único de caché para todos los usuarios  

La única condición que debe de tener este directorio es que sea accesible para lectura y escritura por todos los usuarios. La ventaja mayor es que nos ahorramos una duplicación de directorios, el del root y el nuestro propio. Lo primero que debemos de hacer es crear el directorio con los permisos correspondiente de acceso y escritura.

$ su -c "install -dm777 /.f90cache"

Luego, movemos como usuario, el contenido de la caché ubicada en nuestro directorio personal, al nuevo directorio.

$ mv ~/.f90cache/* /.f90cache

La que tengamos en el directorio del root, que siempre será de menor tamaño, simplemente la borramos.

$ su -c "f90cache -C"

Editamos el archivo f90cache.sh que hemos creado en la instalación del programa y añadimos lo que está en rojo:

#!/bin/sh

alias f90="export PATH=/usr/libexec/f90cache:$PATH"
export F90CACHE_DIR=/.f90cache
export F90CACHE_UMASK=000

Mi recomendación personal es utilizar un directorio en otro disco duro y, a ser posible, en una partición XFS o EXT4, dado el mínimo nivel de fragmentación que poseen estos sistemas de archivos. Un tamaño de 15 o 20 GB no es nada descabellado, si tenemos pensado utilizar F90Cache por defecto para compilar todos los paquetes de código fuente escritos en Fortran. 

3) Limpiar la caché

 Para ajustar el tamaño de la caché al máximo establecido en su configuración, ejecutamos el siguiente comando, aunque esto no es necesario hacerlo ya que el programa lo hace de forma automática.

$ f90cache -c

Para borrarla por completo, el siguiente:

$ f90cache -C

4) Estadísticas de uso

Como cualquier aplicación caché que se precie, F90cache también nos muestra estadísticas de uso, con el siguiente comando,

$ f90cache -s

Y yo en estos momentos las tengo así,

[jose@localhost .f90cache]$ f90cache -s
cache directory                     /home/jose/.f90cache
cache hit                             10
cache miss                          1014
called for link                       74
no input file                        117
files in cache                       392
cache size                           788 Kbytes
max cache size                    1024.0 Mbytes

Lo único que nos debe de interesar de todo esto, son los dos últimos datos, cache size, que nos indica el espacio que está ocupando en estos momentos, y max cache size, que nos indica el tamaño máximo que tenemos configurado. Para poner a cero las estadísticas, ejecutamos el siguiente comando,

$ f90cache -z

5) Uso de otras versiones de GFortran con F90cache

Además de leernos el correspondiente manual acerca de la instalación de otras versiones de GCC en nuestro sistema, la forma de hacer funcionar F90cache con otras versiones de GFortran es muy simple, ejecutando la correspondiente variable de entorno, que antepone el PATH establecido en la misma, al PATH que tengamos configurado en nuestro sistema. Un ejemplo:

$ export F90CACHE_PATH=/opt/gcc6/bin

Como la versión instalada de forma alternativa, tiene el nombre de gfortran6, creamos un enlace simbólico en el mismo directorio de ubicación de esta:

$ su -c "ln -s gfortran6 /opt/gcc6/bin/gfortran"

Ahora ejecutamos gfortran --version y comprobamos que nos sale la versión que le hemos pasado mediante la variable de entorno anteriormente ejecutada.

[jose@localhost ~]$ gfortran --version
GNU Fortran (GCC) 6.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
Esto es software libre; vea el código para las condiciones de copia.  NO hay
garantía; ni siquiera para MERCANTIBILIDAD o IDONEIDAD PARA UN PROPÓSITO EN
PARTICULAR

6) Desactivar el uso de F90cache

Esto es útil si por ejemplo, queremos saber el tiempo real de compilación de un paquete determinado. Con la siguiente variable de entorno, Ccache actuará como un simple intermediario sin almacenar dato alguno del proceso de compilación en curso.

$ export F90CACHE_DISABLE=true

7) Volver a almacenar una compilación determinada (sobrescribir la caché)  

La siguiente variable de entorno es similar a la anterior, en lo que respecta al tiempo real de compilación. La diferencia radica en que en este caso, sí se almacenan los datos del proceso de compilación en curso, empezando desde cero, y sobrescribiendo los que hubiera en la caché relativos al paquete en cuestión.

$ export F90CACHE_RECACHE=true

8) Saber en todo momento, qué hace F90cache

Esto es útil para comprobar cómo se comporta F90cache en el proceso de compilación. Nos permite también averiguar errores del mismo. Con la correspondiente variable de entorno, establecemos un archivo de registro de las tareas que realiza el programa. Como no es nada recomendable que lo haga por defecto, porque como es lógico, añade una sobrecarga al mismo, nos creamos un alias de bash, para utilizarlo cuando lo creamos oportuno y lo añadimos al final del archivo que estamos utilizando para configurar el programa:

#!/bin/sh

alias f90="export PATH=/usr/libexec/f90cache:$PATH"
export F90CACHE_DIR=/.f90cache
export F90CACHE_UMASK=000

alias f90l="export F90CACHE_LOGFILE='$HOME/f90cache.log'"
alias nof90l="export F90CACHE_LOGFILE=; rm -f $HOME/f90cache.log"

Con f90l activamos el archivo de registro en la raíz de nuestro directorio personal, con el nombre f90cache.log y con nof90l lo desactivamos y borramos el archivo creado.



Enlaces


http://people.irisa.fr/Edouard.Canot/f90cache >> La web de F90cache.


Foro Galería Blog


Actualizado el 26-10-2023

Compiladores Caché - F90cache

Compiladores Caché - CcacheCompiladores Caché - Sccache