Skip to content

nestor711/Speedup_aplicacion_hibrida_Python-C

Repository files navigation

Profiling en Python e instrucciones AVX

Ejercicio de Multiplicación de un Vector por un Escalar, profiling sobre programas de python usando los módulos timeIt y cProfile. Determinación de tiempos de ejecución de programas en python usando librerias dinámicas de C y con instrucciones de AVX.

Grupo de Trabajo

  • Néstor David Heredia Gutierrez - 2058558
  • Brayan Camilo Urrea Jurado - 2410023
  • Kevin Alejandro Velez Agudelo - 2123281

Ejecución del Programa con Jupyter Notebook

El código fuente fue desarrollado en una máquina de la herramienta Google Colab, debido a que estás máquinas permiten la documentación y codificación de programas en Python y C simultáneamente. Se ha anexado el archivo Profiling en Python e instrucciones AVX.ipynb para su ejecución ya sea en una máquina de Google Colab o en el contenedor Jupyter recomendado por el docente John Sanabria.

El contenedor se llama jupyter/datascience-notebook, es un notebook de jupyter muy útil ya que en ella ya se tiene instalado muchas librerias orientados a la Ciencia de datos. Se presenta dos opciones para su instalación, teniendo en cuenta que ya se tiene Docker instalado previamente.

- Instalación desde la terminal de Comandos

Para descargar el jupyter notebook, se ejecuta lo siguiente en la terminal:

  docker pull jupyter/datascience-notebook

Luego, se ejecuta el siguiente comando para correr el contenedor y elegir su puerto de ejecución:

  docker run -p 8888:8888 jupyter/datascience-notebook

Después de esto, el contenedor se estará ejecutando en el localhost con el puerto especificado. Usualmente en la primera vez de ejecución, el notebook te pedirá un token y una contraseña para ejecutar y proteger el notebook. El token se encontrará en la consola durante la ejecución del contenedor o en el enlace del localhost. Una vez en la aplicación puedes importar cualquier archivo con terminación .ipynb o que procedan de Google Colab, y ejecutar bloques de código.

- Instalación por medio de Docker Desktop

La otra opción de instalción del jupyter notebook es por medio del programa de Docker, por medio de este se busca en la sección de contenedores al siguiente contenedor: jupyter/datascience-notebook:x86_64-ubuntu-22.04, será fácil de encontrar porque tiene 10 millones de descargas. Desde el programa de Docker seleccionas la opción PULL, esto descargará el contenedor. Se paciente porque el notebook pesa alrededor de 6 GB. Una vez descargado, se debe dirigir al apartado de Contenedores y allí aparecerá el contenedor anteriormente descargado. Posteriormente se ejecuta el contenedor por medio del botón RUN, se elige el puerto en el que correrá el contenedor, después se abrirá una línea de comandos que mostrará los logs del contenedor, aquí también se definirá el token. Por último, se abre el programa desde el localhost especificando el puerto denotado en el anterior paso.

Ejecución de los Programas localmente

Se debe tener en cuenta que los archivos de este repositorio ya deben estar en la máquina local. En la máquina se debe tener python instalado y las librerias numpy y ctypes. Estos se pueden instalar en un ambiente virtual de python. En caso del sistema operativo Windows, la máquina ya debe estar configurado para compilar y ejecutar programas en C.

1) Ejecución de las librerias Dinámicas

En este primer paso se llevaran a cabo la ejecución de dos programas en C, cada uno de estos programas calculan y retornan un vector multiplicado por un escalar. En todos los programas el tamaño del vector es de diez millones. Uno de estos programas tienen instrucciones AVX, que llaman a instrucciones específicas de los procesadores para resolver procesos con vectores, esto mejora los tiempos de ejecución. Primero se compilará y retornará una libreria del programa multescalar.c con el siguiente comando:

  gcc -shared -fpic -o libMultEscalar.so multescalar.c

Al ser ejecutado, se creará la libreria libMultEscalar.so que luego será usado por otro programa. Ahora se compilará el programa multescalar-avx.c, que tiene las instrucciones AVX, para la compilación de este programa se usa el siguiente comando dependiendo de la arquitectura de la máquina:

Para máquinas con arquitectura x86

  gcc -march=native -shared -fpic -o libMultEscalarAVX.so multescalar-avx.c

Para máquinas con arquitectura x64

  gcc -march=native -mavx -shared -fPIC -o libMultEscalarAVX.so multescalar-avx.c

Luego se ejecuta el siguiente comando para ver si las librerias se han creado correctamente, y para saber la ubicación de estas, en nuestro caso la ubicación retornada fue la siguiente: /home/kvelez/Documentos/Profiling y AVX/libMultEscalarAVX.so. La ubicación que sea retornada debe ser recordada para la modificación de otros programas.

  pwd && ls

2) Ejecución de los archivos Profiling

En esta segunda sección se ejecutarán dos programas en Python que multiplican un vector por un escalar, cada uno de estos programas retornan unos tiempos de ejecuci[on usando los módulos timeit y cProfile, de estos programas se retornarán unos tiempos promedio de ejecución. Estos programas ya están configurados para no tomar los tiempos mayor y menor, con el objetivo de eliminar estos límites y retornar un tiempo promedio sin sesgos. Se ejecutarán los programas profiling_Timeit.py y profiling_cProfile.py.

  python3 profiling_Timeit.py
  python3 profiling_cProfile.py

3) Ejecución del programa de Python con uso de libreria Dinámica con AVX

En esta tercer paso, se ejecutará el programa cProfile_AVX.py, este programa toma la libreria libMultEscalarAVX.so para ejecutar un programa de Python, al usar instrucciones AVX el tiempo de ejcución debe ser menor a los programas ejecutados en el paso anterior. Aquí se debe tomar en cuenta la ubicación de esta libreria y debe ser reemplazada en la línea 8 del código, en este caso específico nos quedó de la siguiente forma: lib = ctypes.CDLL("/home/kvelez/Documentos/Profiling y AVX/libMultEscalarAVX.so").

  python3 cProfile_AVX.py

4) Ejecución del programa de Python con Numpy y uso de libreria Dinámica

En este último paso se ejecutará un programa en python que usa la libreria Numpy para las ejecuciones lógicas y la libreria dinámica libMultEscalar.so. El objetivo de este programa es tomar su tiempo de ejecución y compararlo con los programas anteriormente ejecutados en los pasos anteriores. Nuevamente se debe tener en cuenta la ubicación de esta libreria y ser reemplazada en la línea 8, como se hizo en el anterior programa.

  python3 cProfile_Numpy.py

Conclusiones

Con la ejecución de todos estos programas se llegó a la conclusión que el programa de python que usa la libreria dinámica con AVX (paso 3) es almenos 2.2 veces mejor que el programa de python analógico (paso 2), el programa de python que usa la libreria Numpy y la libreria dinámica de C (paso 4) no alcanza a tener una mejora de tiempo frente al programa analógico (paso 2). Sin embargo, la ejecución de este programa en una máquina local, demuestra que el programa de pyhton con Numpy y uso de libreria dinámica (paso 4) es 1.8 veces más rápido a diferencia del programa analógico de python (paso 2).

About

Speedup para aplicación híbrida (Python + C)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published