es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué mi proceso de multiproceso de Python3 funciona más lento que sin él para cálculos de matrices complejas?

Estoy intentando hacer lo siguiente: XX + XX^t + 4yy. Aquí está mi código:

He creado matrices primero, luego comencé a calcular el tiempo que tarda el proceso en completarse sin la multiprocesamiento. Luego introduje la multiprocesamiento y calculé el tiempo nuevamente.

#!/usr/bin/env python3
from multiprocessing import Process
import numpy as np
import random
import time

def createMatrices(n):
    global x,y
    for i in range(n):
        row = []
        for j in range(n):
            row.append(random.randint(0, 256))
        x[i] = row

    for i in range(n):
        row = []
        for j in range(n):
            row.append(random.randint(0, 256))
        y[i] = row

def transposeMatrix(X):
    result = X.transpose()
    return result

def mat_mul(mat1, mat2,n):
    res = np.dot(mat1,mat2)
    return res

if __name__ == '__main__':
    for x in (2*p for p in range(3, 15)):
        n = x
        x = np.empty([n,n])
        y = np.empty([n,n])
        createMatrices(n)
        '''
        print("-"*50)
        print(x)
        print("-"*50)
        print("-"*50)
        print(y)
        print("-"*50)
        '''
        total_time=0
        sum = []
        #X*X
        start = time.time()
        sum.append(mat_mul(x,x,n).tolist())

        #X*XT
        sum.append(mat_mul(x, transposeMatrix(x),n))

        #4*y*y
        sum.append(4*mat_mul(y,y,n).tolist())
        end = time.time()

        total_time = end-start
        '''
        print("1st: ")
        print(total_time)
        '''

        total_time2 = 0
        start2 = time.time()
        p1 = Process(target = mat_mul, args=(x,x,n))
        p1.start()
        p2 = Process(target = mat_mul, args=(x, transposeMatrix(x), n))
        p2.start()
        p3 = Process(target = mat_mul, args=(y,y,n))
        p3.start()


        p1.join()
        p2.join()
        p3.join()
        end2 = time.time()
        total_time2 = end2-start2

        '''
        print("2nd:")
        print(total_time2)
        '''

        print(n,total_time,total_time2)

Este es mi resultado de ejecución

8 9.059906005859375e-06 0.28221797943115234
16 8.511543273925781e-05 0.3175086975097656
32 8.7738037109375e-05 0.34047412872314453
64 0.00018310546875 0.33080291748046875
128 0.012358903884887695 0.28963184356689453
256 0.003584146499633789 0.3264491558074951
512 0.026476621627807617 0.2882118225097656
1024 0.08968615531921387 0.40580010414123535
2048 0.5845317840576172 1.2362430095672607
4096 3.2829248905181885 4.272820949554443
8192 21.27417492866516 32.87949204444885

2^14 tarda una eternidad en ejecutarse.

¿Estoy haciendo algo mal al usar la multiprocesamiento? ¿Hay algo que hacer con mi máquina en sí? Estoy usando MacBook Air M1. ¿Cómo me corrijo? Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según los resultados de su ejecución, parece que el uso del multiprocessing en realidad está ralentizando el proceso en lugar de acelerarlo. Esto probablemente se debe al hecho de que la creación y el inicio de nuevos procesos lleva tiempo y recursos, lo que puede superar cualquier ganancia en velocidad al ejecutar los cálculos en paralelo.

    Además, el chip Apple M1 tiene una arquitectura diferente a la de la mayoría de los procesadores tradicionales, lo que significa que el multiprocessing puede comportarse de manera diferente en esta máquina que en otras.

    Para mejorar el rendimiento de su código, podría intentar optimizar los propios cálculos (por ejemplo, utilizando un algoritmo diferente para la multiplicación de matrices) o explorar otros métodos de procesamiento en paralelo, como multithreading. También podría experimentar con diferentes tamaños de entrada y ver si hay un punto óptimo en el que el multiprocessing proporcione una mejora significativa en la velocidad.

    Finalmente, para determinar si hay algo específico en su máquina que esté causando problemas con el multiprocessing, podría intentar ejecutar el código en una máquina diferente con especificaciones similares y comparar los resultados.

Comments are closed.