WhatsApp

  
¿Qué es la programación en paralelo ?
"threads" (hilos)
¿Qué es la programación en paralelo ( "multithreading ") ? 

La programación en paralelo o multithreading es una técnica en la que realizamos múltiples tareas de forma simultanea.  

La programación en paralelo es útil para mejorar el rendimiento, aprovechar al máximo los recursos computacionales, escalar programas para manejar grandes cargas de trabajo y proporcionar una experiencia de usuario más receptiva en una variedad de aplicaciones y escenarios.

                                     white and green hard disk drive

En este modelo de programación, se utilizan recursos computacionales distribuidos, como múltiples núcleos de CPU, unidades de procesamiento gráfico (GPU) o incluso múltiples dispositivos o sistemas computacionales, para llevar a cabo tareas de manera simultánea. 

Conceptos básicos de la programación en paralelo.

Algunos de los conceptos mas usados en paralelismo son los siguientes:

  • Paralelismo: Es la ejecución simultánea de múltiples tareas para mejorar la eficiencia del procesamiento.
  • Tarea: Una tarea es una unidad de trabajo que puede ser ejecutada de manera independiente. En paralelismo, estas tareas se pueden ejecutar al mismo tiempo en diferentes procesadores o núcleos.
  • Thread: Un thread es una secuencia de instrucciones que puede ejecutarse de forma independiente de otras secuencias de instrucciones. Los threads son la unidad básica de ejecución en paralelo dentro de un programa.
  • Concurrencia: La concurrencia se refiere a múltiples tareas que se inician, ejecutan y finalizan en un período de tiempo solapado. No necesariamente significa que las tareas se estén ejecutando al mismo tiempo, pero pueden estar en progreso simultáneo.
  • Paralelismo a Nivel de Instrucción (ILP): Se refiere a la ejecución simultánea de múltiples instrucciones dentro de una única tarea, aprovechando la capacidad de los procesadores modernos para ejecutar instrucciones de forma paralela.
  • Paralelismo a Nivel de Datos (DLP): Implica la división de datos en partes más pequeñas para procesarlas simultáneamente. Esto se utiliza comúnmente en operaciones de procesamiento de matrices y vectores.
  • Paralelismo a Nivel de Tarea (TLP): Se refiere a la ejecución simultánea de múltiples tareas independientes. Estas tareas pueden ser parte del mismo programa o pueden ser programas separados ejecutados en paralelo.
  • Descomposición de Tareas: Consiste en dividir un problema en partes más pequeñas y manejables que pueden ejecutarse en paralelo. Esta es una estrategia común para aprovechar el paralelismo en la resolución de problemas complejos.
  • Comunicación y Sincronización: En entornos de programación paralela, es importante que las tareas paralelas se comuniquen entre sí y se sincronicen adecuadamente para garantizar resultados correctos. Esto implica el intercambio de datos y la coordinación de la ejecución de las tareas.
  • Escalabilidad: La escalabilidad se refiere a la capacidad de un programa para aprovechar eficientemente un número creciente de recursos de hardware, como núcleos de CPU, procesadores o nodos de un clúster, sin degradación significativa del rendimiento.
Implementación en Python. 

A manera de ejemplo se mutra el siguiente ejemplo donde se realiza la suma de los cuadrados utilizando programación en paralelo en Python. 

Código:

import multiprocessing

def calcular_suma_cuadrados(numeros, resultado):
suma = 0
for num in numeros:
suma += num * num
resultado.put(suma)

if __name__ == "__main__":

# Lista de números
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


# Creamos una cola para almacenar los resultados

resultado = multiprocessing.Queue()

# Dividimos la lista de números en partes iguales
num_procesos = 4
trozos = [numeros[i::num_procesos] for i in range(num_procesos)]


# Creamos procesos para calcular la suma de los cuadrados en paralelo

procesos = []

for trozo in trozos:
proceso = multiprocessing.Process(target=calcular_suma_cuadrados, args=(trozo, resultado))
procesos.append(proceso)
proceso.start()

# Esperamos a que todos los procesos terminen
for proceso in procesos:
proceso.join()

# Recopilamos los resultados de la cola
suma_total = 0

while not resultado.empty():
suma_total += resultado.get()

print("La suma total de los cuadrados es:", suma_total)

 
Explicación del código 

1. El primer paso es importar el módulo "multiprocessing" , que nos permite crear y controlar procesos en Python.

import multiprocessing

2. Definimos la función calcular_suma_cuadrados, que toma una lista de números y una cola resultado como argumentos. Esta función calcula la suma de los cuadrados de los números en la lista y coloca el resultado en la cola resultado. 

def calcular_suma_cuadrados(numeros, resultado):
suma = 0
for num in numeros:
suma += num * num
resultado.put(suma)

3. Esta es una construcción típica en Python que se utiliza para garantizar que el código solo se ejecute si este archivo es ejecutado como un script principal, no como un módulo importado.

if __name__ == "__main__":

4. Creamos una lista de números sobre la cual queremos calcular la suma de los cuadrados.

    # Lista de números
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

5. Creamos una cola (Queue) para que los procesos puedan compartir los resultados de sus cálculos.

    # Creamos una cola para almacenar los resultados
resultado = multiprocessing.Queue()

6. Dividimos la lista de números en partes iguales, donde el número de partes está determinado por num_procesos. En este caso, dividimos la lista en 4 partes.

    # Dividimos la lista de números en partes iguales
num_procesos = 4
trozos = [numeros[i::num_procesos] for i in range(num_procesos)]

7. Creamos un proceso para cada trozo de la lista de números. Cada proceso ejecutará la función calcular_suma_cuadrados con su trozo de números como argumento. Los resultados de cada proceso se almacenarán en la cola resultado.

    # Creamos procesos para calcular la suma de los cuadrados en paralelo
procesos = []
for trozo in trozos:
proceso = multiprocessing.Process(target=calcular_suma_cuadrados, args=(trozo, resultado))
procesos.append(proceso)
proceso.start()

8. Esperamos a que todos los procesos creados terminen su ejecución antes de continuar.

    # Esperamos a que todos los procesos terminen
for proceso in procesos:
proceso.join()

9. Recopilamos los resultados de la cola resultado sumando todos los valores que han sido colocados en ella por los procesos.

    # Recopilamos los resultados de la cola
    suma_total = 0
    while not resultado.empty():
        suma_total += resultado.get()

10. Finalmente, imprimimos la suma total de los cuadrados de los números de la lista.

    print("La suma total de los cuadrados es:", suma_total)

Resultado: 

     La suma total de los cuadrados es: 385    


 







En resumen, las listas y las tuplas son estructuras de datos importantes en Python, cada una con sus propias características y casos de uso. La elección entre una lista y una tupla dependerá de los requisitos específicos del programa y la naturaleza de los datos que se están manipulando.
Daniel Ixbalanque 1 abril, 2024
Compartir


Iniciar sesión dejar un comentario

  
¿Qué es el algoritmo de BucketSort?
Ordenamiento por Botes o Casilleros.