jueves, 13 de julio de 2017

Ejemplo de programación multithread en Python

Como anexo a la entrada anterior, pongo un ejemplo del mismo programa pero en Python utilizando el módulo threadings. En este programa hago un cambio importante, estoy utilizando un producto punto del módulo numpy, una operación que está optimizada y escrita en C lo que me da tiempos de ejecución menores que los del programa anterior [Ref]:

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 12 21:54:43 2017
@author: rodolfo
"""
import numpy as np
import threading
num_of_threads = 4
n= 16
A = np.random.randint(0,9,size = (n,n))
B = np.random.randint(0,9,size = (n,n))
#C = np.matmul(A,B)
m = n
Cp = np.zeros([m,n])
def matmul(tid):
global Cp
rows_per_thread = m/num_of_threads
start_index = tid*rows_per_thread
end_index = (tid+1)*rows_per_thread
for i in range(start_index,end_index):
for j in range(n):
Cp[i][j] = np.dot(A[i,0:m],B[0:m,j])
#Creación de threads
threads = []
for tid in range(num_of_threads):
t = threading.Thread(target = matmul, args=(tid,))
threads.append(t)
t.start()
#Unión de threads
for th in threads:
th.join()
#print(" Resultado: ")
#print(Cp)
Ejecutamos y medimos el tiempo de ejecución con:

time (python MatMulThreads.py)

Estos fueron los tiempos de ejecución en una Raspberry Pi 3 para matrices de 2000x2000:

Debe tomarse en cuenta que a pesar de que ambos programas son semanticamente iguales, su implementación no lo es. Es de notarse que en este caso no hay tanta mejoría entre 2 y 4 threads.

No hay comentarios: