Умножение матрицы Numba намного медленнее, чем NumPy

Я реализую простую функцию умножения матриц с помощью Numba и считаю, что она значительно медленнее, чем NumPy. В приведенном ниже примере Numba работает в 40 раз медленнее. Есть ли способ еще больше ускорить Numba? Заранее благодарим за отзыв.

import time
import numpy as np
import numba
from numba import njit, prange

@numba.jit('void(float64[:,:],float64[:,:],float64[:,:])', fastmath=True, parallel=True)
def matmul(matrix1,matrix2,rmatrix):
    a = matrix1.shape[0]
    b = matrix2.shape[1]
    c = matrix2.shape[0]
    for i in prange(a):
        for j in prange(b):
            for k in prange(c):
                rmatrix[i,j] += matrix1[i,k] * matrix2[k,j]

M = np.random.normal(0,10,(10,10))**2
N = np.random.normal(0,10,(10,10))**2
A = np.random.normal(0,10,(10,10))**2
matmul(M,N,A) #to make sure compiled

n = 3000
M = np.random.normal(0,10,(n,1000))**2
N = np.random.normal(0,10,(1000,n))**2
A = np.zeros((3000,3000))

t = time.time()
matmul(M,N,A)
print("Numba:", time.time()-t)

t = time.time()
np.dot(np.log(M),np.log(N))
print("NumPy:", time.time()-t)

person user8768787    schedule 11.02.2020    source источник
comment
Ответ @max9111 здесь объясняет, почему: BLAS (который реализован в машинном коде и который использует numpy.dot) значительно быстрее, чем скомпилированный c-код (который генерирует numba), если матрицы больше 20x20 или около того. Ваши намного крупнее. На самом деле это не обман, но любой ответ будет таким же или хуже этого, поэтому я укажу его там.   -  person Daniel F    schedule 11.02.2020
comment
Отвечает ли это на ваш вопрос? Минимизация накладных расходов из-за большого количества точек Numpy звонки   -  person Daniel F    schedule 11.02.2020
comment
Если вы заинтересованы в самостоятельной реализации матрично-матричного продукта, прочитайте gist.github.com/nadavrot/5b35d44e8ba3dd718e595e40184d03f0 было бы хорошим началом. Но в Numba нет некоторых функций (явной SIMD-векторизации), которые упрощают реализацию эффективного матричного умножения. Если вы хотите использовать реализацию BLAS (поддерживаются только float32 и float64), вы можете использовать np.dot в Numba или в Numpy.   -  person max9111    schedule 25.02.2020