Diferencia entre revisiones de «Instalacion y Compilacion de Software»

De NLHPC
 
Línea 196: Línea 196:
 
  library(AlgunPaquete)
 
  library(AlgunPaquete)
 
  require(AlgunPaquete)
 
  require(AlgunPaquete)
 +
 +
Instalación local de paquetes
 +
 +
Primero debe estar cargada la última versión de R
 +
 +
ml R/4.0.0
 +
 +
En el home del usuario se debe correr el siguiente comando:
 +
 +
R CMD INSTALL -l /home/miusuario/carpetadedestino/library myRPackage.tar.gz
 +
 +
Para cargar el paquete instalado localmente:
 +
 +
library("myRPackage", lib.loc="/home/miusuario/carpetadedestino/library")
 +
 +
Esto permitirá ejecutar cualquier función de tu paquete en cualquier nodo del clúster.
  
 
== References ==
 
== References ==

Revisión actual del 21:06 6 may 2020

Un compilador es un programa de computadora que traduce código de un lenguaje a otro.

Primeras Nociones de Compilación

General

Cuando las personas escriben aplicaciones, generalmente emplean un editor de texto y un lenguaje de alto nivel como C/C ++ o Fortran para producir código que se parece a esto:

#include <stdio.h>

int main()
{
   printf("Hola, Mundo!\n");
   return 0;
}

Esto es fácil de escribir, comprender y mantener para los humanos. Sin embargo, dado que una computadora solo comprende 0s y 1s, esto no se puede ejecutar directamente. Un compilador traduce este código en un archivo binario, que puede ejecutarse.

Con la aparición de lenguajes de programación de nivel superior, la barrera de entrada a la programación se reduce significativamente. Esto facilita la creación de programas más complejos que los humanos no pueden (fácilmente) escribir en términos de 0s y 1s.

Uso básico

Usualmente usas un compilador llamándolo desde shell:

$ icc hello_world.c -o hello_world.o

donde lo alimentas con el archivo hello_world.c y lo dejas crear el archivo de salida binario hello_world.o, que luego puedes ejecutar llamando

$ ./hello_world.o

produciendo la salida deseada

¡Hola Mundo!

En la mayoría de los compiladores hay flags de optimización como -O3 (que generalmente van de 0 a 3), donde el compilador intenta averiguar qué está haciendo su programa y si hay una forma más eficiente de hacerlo. Cuando el proceso de desarrollo está a punto de finalizar y comienza a utilizar su programa de manera productiva, la optimización debe activarse para garantizar que el software se ejecute lo más rápido posible. En Guacolda-Leftraru para las compilaciones de codigos fuentes se utilizan por lo general las siguientes Flags:

-O3 -axCORE-AVX512,AVX,SSE4.2 -ipo -no-prec-div -static-intel -fPIC -qopenmp

Al compilar una aplicación (target) a partir de múltiples archivos, uno podría necesitar usar otro programa llamado linker para unir las diferentes partes. Una herramienta útil para automatizar el proceso de compilación y vinculación es un sistema de compilación, como make, que gestiona las dependencias de compilación entre diferentes unidades de compilación. Cuando se trata de aplicaciones más complejas, los generadores de sistemas de compilación, como Autotools o CMake, pueden resultar valiosos para manejar tales dependencias.

Compilador Intel

Intel Compiler (icc) es un compilador escrito por Intel y optimizado para utilizar las características de sus microprocesadores en toda su extensión, lo que a veces resulta en un rendimiento significativamente mayor en comparación con otras alternativas de compilación.

$ mpiicc [archivos] [opciones]

Compilador MPI

MPI ("Message Passing Interface", Interfaz de Paso de Mensajes) es un estándar que define la sintaxis y la semántica de las funciones contenidas en una biblioteca de paso de mensajes diseñada para ser usada en programas que exploten la existencia de múltiples procesadores.

El paso de mensajes es una técnica empleada en programación concurrente para aportar sincronización entre procesos y permitir la exclusión mutua, de manera similar a como se hace con los semáforos, monitores, etc.

Su principal característica es que no precisa de memoria compartida, por lo que es muy importante en la programación de sistemas distribuidos. Esta sección le dará una visión general de cómo compilar y ejecutar un programa que ha sido paralelizado con MPI. Muchas de las opciones enumeradas a continuación son las mismas para Open MPI e Intel MPI, sin embargo, tenga cuidado y busque si realmente se comportan de la misma manera.

Cómo compilar el código MPI

Hay varios llamados "compiler wrappers" de MPI, ej: mpicc. Estos se encargan de incluir las bibliotecas MPI correctas para el lenguaje de programación que está utilizando. Pero comparten la mayoría de las opciones de línea de comandos. Dependiendo de si su código está escrito en C, C ++ o Fortran, siga las instrucciones en una de las tablas a continuación. Asegúrese de reemplazar los argumentos dentro de <…> con valores específicos.

Open MPI

Use el siguiente comando para especificar el programa que desea compilar (reemplace <src_file> con una ruta a su código, por ejemplo, ./mi_progama.c).

Languaje Comando
C $ mpicc <src_file> -o <nombre_del_ejecutable>
C++ $ mpicxx <src_file> -o <nombre_del_ejecutable>
Fortran $ mpifort <src_file> -o <nombre_del_ejecutable>

También puede escribir el comando $ mpicc [opciones], $ mpicxx [opciones] o $ mpifort [opciones]. Hay algunas opciones que vienen con Open MPI, sin embargo, las opciones son más importantes para ejecutar su programa. Las opciones del compilador pueden ser útiles para obtener más información sobre el módulo Open MPI que está utilizando.

Opciones Funcion
-showme:help imprime un breve mensaje de ayuda sobre el uso y enumera todas las opciones del compilador
-showme:version muestre la versión abierta de MPI

En lugar de escribir el compiler wrapper mpicc, mpicxx o mpifort explícitamente, en la mayoría de los sistemas hay variables de entorno definidas, que puede usar para llamar al compilador MPI de una manera más general. Uso simple $MPICC, $MPICXX o $MPIFC para el compilador que desea usar y deje que el sistema de módulos maneje los detalles sucios del uso del comando apropiado

Intel MPI

Use el siguiente comando para especificar el programa que desea compilar (reemplace <src_file> con una ruta a su código, por ejemplo, ./mi_progama.c ).

Driver Compilador C C++ Fortran
GCC $ mpicc <src_file> -o <name> $ mpicpc <src_file> -o <name> $ mpifort <src_file> -o <name>
Intel $ mpiicc <src_file> -o <name> $ mpiicpc <src_file> -o <name> $ mpiifort <src_file> -o <name>

También puede escribir el comando $ mpicc [opciones] <src_file> -o <nombre> etc., donde [opciones] puede reemplazarse por uno o más de los a continuación. Intel MPI viene con opciones de compilación bastante avanzadas, que apuntan principalmente a la optimización y análisis de su código con la ayuda de las herramientas de Intel.

Opciones Funcion
-g habilitar la información de depuración
-OX habilitar la optimización del compilador, donde X representa el nivel de optimización y es uno de 0, 1, 2, 3
-v imprima la versión del compilador

En lugar de escribir el compiler wrapper mpicc, mpicxx o mpifort explícitamente, en la mayoría de los sistemas hay variables de entorno definidas, que puede usar para llamar al compilador MPI de una manera más general. Uso simple $MPICC, $MPICXX o $MPIFC para el compilador que desea usar y deje que el sistema de módulos maneje los detalles del uso del comando apropiado.

Cómo ejecutar un ejecutable MPI

Asegúrese de que esté cargado el módulo MPI correcto. Una vez más, las opciones de línea de comando difieren ligeramente entre Intel MPI y Open MPI.

Para iniciar cualquier programa MPI, escriba el siguiente comando donde <executable> especifica la ruta a su aplicación:

$ mpirun -n <procesadores_num> [opciones] <ejecutable>

Tenga en cuenta que mpiexec y mpirun son sinónimos en Open MPI, en Intel MPI es y mpirun.

Nuestra arquitectura

Familia de instrucciones Intel AVX-512

Las instrucciones Intel AVX-512 ofrecen un conjunto completo de funcionalidades y un rendimiento superior que las familias de instrucciones Intel AVX e Intel AVX2.

Puede usar las siguientes opciones del compilador Intel para crear un ejecutable para la generación de código Intel AVX-512:

La opción del compilador –axcode

La forma general es –axcode en Linux, donde el argumento es el código. Esta opción se utiliza para múltiples rutas de código de envío automático para funciones específicas para procesadores Intel y genera una ruta de código de línea de base (ruta de código genérico IA). La "baseline-code" se utilizará cuando la plataforma de hardware no sea compatible con el ISA específico. Puede usar el siguiente argumento para nuestra arquitectura:

-axCORE-AVX512: use esta opción para generar AVX-512F, AVX-512CD, AVX-512BW, AVX-512DQ y AVX-512VL; También se genera una ruta de "baseline-code".

Esta opción del compilador es útil cuando intenta construir un binario que pueda ejecutarse en múltiples plataformas.

La opción del compilador –xHost

La forma general es -xHost en Linux. Esta opción se utiliza para el conjunto más alto de instrucciones disponible en el procesador host de compilación.

$ icc –xHost application.c

Instalacion de modulos con Python

Python cuenta con una gran variedad de librerias y modulos que pueden ser utilizado para el proposito el cual usted lo necesite. Para esto, es posible realizar una instalacion local de la libreria o modulo en la misma cuenta del cluster, previamente cargado el modulo de Python en la version en la que este trabajando. Revisar pagina de Lmod

Para esta tarea utilizaremos pip, la documentacion oficial nos indica lo siguinte: "pip es el instalador del paquete para Python. Puede usar pip para instalar paquetes desde el índice de paquetes de Python y otros índices."

Corriendo pip

pip es un programa de línea de comando. Se puede ejecutar desde el símbolo del sistema de la siguiente manera:

$ pip <opciones>

Instalando Paquetes

Para instalar mediante pip, primero se debe verificar cual es paquete que se desea utilizar y luego buscarlo mediante el comando pip search, el comando arrojara una lista con programas con el nombre el cual se este buscando en sus repostiorios, el comando se expresa de la siguiente manera:

$ pip search <paquete>

Ejemplo:

 $ pip search jupyter-math
	jupyter-math (0.0.4)                  - display and evaluate math on jupyter notebook
	math-addition (3.0)                   - Math Addition
	NlpToolkit-Math (1.0.6)               - Math library
	animals-math (0.0.7)                  - A package for animals and their math
	some-math (0.0.3)                     - some math routines
	pycopy-math (0.0.0)                   - Dummy math module for Pycopy

Una vez encontrado el paquete se debe instalar con el siguiente comando:

$ pip install <AlgunPaquete> --no-binary :all: --user

Ejemplo:

 $ pip install jupyter-math --no-binary :all: --user

Instalacion de paquetes con R

R al igual que Python tiene como una gran ventaja ampliar sus funcionalidades mediante la instalacion de paquetes o librerias

Instalacion normal

install.packages("AlgunPaquete")

Instalacion normal con dependencias

install.packages("AlgunPaquete", dependencies = T)

Al finalizar la instalacion del o los paquetes, debes cargarlo para poder utilizar las funciones que este contiene:

Cargar:

library(AlgunPaquete)
require(AlgunPaquete)

Instalación local de paquetes

Primero debe estar cargada la última versión de R

ml R/4.0.0

En el home del usuario se debe correr el siguiente comando:

R CMD INSTALL -l /home/miusuario/carpetadedestino/library myRPackage.tar.gz

Para cargar el paquete instalado localmente:

library("myRPackage", lib.loc="/home/miusuario/carpetadedestino/library")

Esto permitirá ejecutar cualquier función de tu paquete en cualquier nodo del clúster.

References

Intel Compilers

Intel MPI compiler options

Manual page for Open MPI's mpiexec