Как сделать умножение распределенной матрицы в numpy / ipython.parallel?
Я видел учебник о том, как сделать распределенный расчет:
def parallel_dot(dview, A, B):
dview.scatter('A', A)
dview['B'] = B
dview.execute('C = numpy.dot(A, B)')
return dview.gather('C')
np.allclose(parallel_dot(dview, A, B),
np.dot(A, B))
Почему в учебнике используется прямой просмотр? Как это будет реализовано в представлении с балансировкой нагрузки?
Я сделал несколько тестов, чтобы попытаться выяснить, насколько хорошо это работает.
t1 = []
t2 = []
for ii in range(10, 1000, 10):
A = np.random.rand(10000, ii).astype(np.longdouble).T
B = np.random.rand(10000, 100).astype(np.longdouble)
t_ = time.time()
parallel_dot(dview, A, B).get()
t1.append(time.time() - t_)
t_ = time.time()
np.dot(A, B)
t2.append(time.time() - t_)
plt.plot( range(10, 1000, 10), t1 )
plt.plot( range(10, 1000, 10), t2 )
результат довольно ужасный (синий параллельный, зеленый последовательный):
1 ответ
Это вряд ли достойная нагрузка. Сначала вы делаете векторное умножение, а не умножение матрицы на матрицу. Попробуйте сказать, о 10000x10000 матриц. Если у вас есть несколько ядер, я думаю, вы можете начать видеть некоторые различия.