Как сделать матричные вычисления максимально быстро - PullRequest
2 голосов
/ 30 октября 2019

Чисто для моих собственных знаний и понимания кода и компьютеров, я пытаюсь создать массив массивов / матриц с несколькими матричными функциями, которые затем я буду использовать в любых проектах, для которых мне нужен матрица или класс массивов. Наиболее важно, что я хотел бы создать библиотеку нейронных сетей, использующую этот класс матрицы / массива, и, следовательно, требовать, чтобы она была максимально быстрой.

Функция, которая мне нужна, чтобы быть быстрой, - это вычисление матричного произведения двухМатрицы, однако, мне немного не повезло, пытаясь ускорить этот расчет с помощью больших матриц.

Мой текущий метод вычисления точечного произведения:

Обратите внимание, этот код находится вPython, однако, если Python не является оптимальным языком, я могу использовать любой другой

a = [[1, 2, 3], [4, 5, 6]]
b = [[1], [2], [3]]

def dot(a, b):
    c = [[0 for j in range(len(b[i]))] for i in range(len(a))]

    for i in range(len(c)):
        for j in range(len(c[i])):
            t = 0
            for k in range(len(b)):
                t += a[i][k] * b[k][j]
            c[i][j] = t
    return c

print(dot(a, b))
# [[14], [32]]

Я изучил Intel MKL (у меня есть Intel Core i7) и другие реализации BLAS, такие как OpenBLASОднако я не смог получить никаких результатов, которые сработали, и никакое прибегание к гуглу не может заставить их работать, поэтому мой вопрос: каков самый быстрый способ вычисления точечного произведения двух матриц? (Использование процессора и памяти в настоящее время для меня не имеет большого значения, однако было бы неплохо быть более эффективным)

PS:

Я пытаюсь сделать все это без использования внешних библиотек (numpyНапример, в Python)

***** ОБНОВЛЕНИЕ *****

Я использую Mac

***** ОБНОВЛЕНИЕ 2 *****

Спасибо всем за вашу помощь, однако я не уверен, как реализовать эти методы вычисления точечного произведения, так как мои математические навыки еще недостаточно развиты, чтобы понять, что это значит (Я еще не начал свои GCSE), хотя я буду помнить эти идеи и буду экспериментировать с этими идеями далее.

Еще раз спасибо за помощь всем.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019
  1. Вы можете использовать графический процессор

    , как предложил Абдель Азиз Абдель Латеф в своем ответе. Однако это ограничивает использование вашей библиотеки на компьютерах с графическим процессором.

  2. Распараллелить точечные произведения для больших матриц

  3. используйте инструкции SIMD

  4. использование современных алгоритмов

    некоторые операции с большими наборами данных можно выполнять намного быстрее, используя более продвинутые методы, которые слишком медленны для небольших матриц ... обычно с использованием FFT или NTT ... Умножение матриц - это набор точечных произведений, а точечный продукт - это форма свертки, поэтому подход FFT должен быть применим, но никогда не делал этого для матриц / векторов ...

    Существуют также специальные алгоритмы, предназначенные исключительно для матриц, такие как Алгоритм Штрассена

    для степеней, которые вы можете использовать в квадрате, для sqr Я думаю, вы можете упростить еще больше, некоторые умножениябудь таким же ...

Python далеко не оптимален, так как он медленный, я бы сделал это в C ++ или даже в сочетании с asm, если есть необходимость в extremСкорость (как в инструкции SIMD). IIRC вы все еще можете использовать созданные на C ++ библиотеки в python (ссылка как DLL, obj, ...)

Однако, если вам нужна быстрая нейронная сеть, тогда используйте выделенный HW. Там также есть микросхемы обработки нейронных сетей.

0 голосов
/ 30 октября 2019

Если это возможно, вы можете использовать CUDA , чтобы использовать GPU для очень быстрых вычислений.

...