Производительность scipy.weave.inline - PullRequest
2 голосов
/ 22 октября 2011

Я новичок в Python, который пытается немного узнать об этом фантастическом языке программирования.Я попытался использовать scipy.weave.inline, чтобы ускорить некоторые вычисления.Просто чтобы немного узнать, я попытался реализовать умножение матриц, используя scipy.weave.inlineЯ не включил обработку ошибок - просто попробовал это, чтобы лучше понять это.Код выглядит следующим образом:

import scipy.weave
def cmatmul(A,B):
    R = numpy.zeros((A.shape[0],B.shape[1]))
    M = R.shape[0]
    N = R.shape[1]
    K = A.shape[1]

    code = \
    """
    for (int i=0; i<M; i++)
        for (int j=0; j<N; j++)
            for (int k=0; k<K; k++)
                R(i,j) += A(i,k) * B(k,j);
    """
    scipy.weave.inline(code, ['R','A','B','M','N','K'], \
                       type_converters=scipy.weave.converters.blitz, \
                       compiler='gcc')
    return R

Когда я сравниваю с numpy.dot, я обнаруживаю, что версия weave.inline занимает примерно 50 раз больше времени, чем numpy.dot.Я знаю, что NumPy очень быстро, когда его можно применить.Разница наблюдается даже для больших матриц, таких как размер 1000 x 1000.

Я проверил как numpy.dot, так и scipy.weave.inline, и оба, кажется, используют одно ядро ​​100% при вычислениях.Numpy.dot обеспечивает 10,0 GFlops по сравнению с теоретическими 11,6 GFlops моего ноутбука (двойная точность).В одной точности я измеряю двойную производительность, как и ожидалось.Но scipy.weave.inline далеко позади.В 1/50 раза выше этого показателя для scipy.weave.inline.

Ожидается ли эта разница?Или что я делаю не так?

1 Ответ

7 голосов
/ 23 октября 2011

Вы реализовали простой алгоритм умножения матриц, который scipy.weave компилируется в быстрый машинный код.

Однако существуют неочевидные, более эффективные кэш-память ЦП алгоритмы умножения матриц (которые обычно разбивают матрицу на блоки и имеют дело с ними), и дополнительная скорость может быть достигнута с помощью специфичных для CPU оптимизаций.Numpy по умолчанию использует оптимизированную библиотеку BLAS для этой операции, если она у вас установлена.Эти библиотеки, скорее всего, будут быстрыми по сравнению со всем, что вы можете написать самостоятельно, не занимаясь исследованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...