Умножение двух матриц 100х100 (многопоточность)

Столкнулся с такой задачей: нужно умножить две матрицы размером 100х100, при этом используя метод синхронизации потоков - СЕМАФОР. Не до конца понял как нужно работать с семафором. Смог переделать свой код для умножения матриц. Но вопрос остается открытый: как к этому добавить многопоточность.

import numpy as np

a = np.arange(0, 10000).reshape(100, 100)
b = np.arange(10000, 20000).reshape(100, 100)
print(np.dot(a, b))

Прошу, подскажите, как можно реализовать такое?


Ответы (1 шт):

Автор решения: eri

Вот так можно распаралелить первый цикл на каноничном алгоритме:

import numpy as np
import multiprocessing as mp
import os

a = np.arange(0, 10000).reshape(100, 100)
b = np.arange(10000, 20000).reshape(100, 100)

N = 100
c = np.zeros((N,N))

def forcolumn(i):
    row = np.zeros((1,N))
    for j in range(N):
        row[0,j] = sum(a[i, k] * b[k, j] for k in range(N))
    return i,row

pool = mp.Pool()

for i,row in pool.imap_unordered(forcolumn, range(N), N//os.cpu_count()//2):
   c[i,:] = row[0,:]

print(c)

Семафор воткнуть некуда.

→ Ссылка