Матрица Python предоставляется с помощью numpy.dot()

Во время моего знакомства с CUDA в Python (numba lib) я реализовал методы предоставления матриц:

  • Только что с numpy.dot()
  • Алгоритм Штрассена с numpy.dot()
  • Метод блоков на GPU
  • Алгоритм Штрассена на графическом процессоре

Поэтому я протестировал его на двух типах данных:

  • numpy.random.randint(0, 5, (N, N)) # with int32 elements
  • numpy.random.random((N, N)) # with float64 elements

Для int32 я получил ожидаемый результат, когда мои алгоритмы GPU работали лучше, чем CPU с numpy: введите описание изображения здесь

Однако на типе float64 numpy.dot() превзошел все мои методы GPU: введите описание изображения здесь

Итак, вопрос: Почему numpy.dot() так быстро работает с массивами float64, и использует ли numpy GPU?


person Mikhail    schedule 29.04.2015    source источник


Ответы (2)


Типичная установка numpy будет динамически связана с библиотекой BLAS, которая предоставляет процедуры для матрицы-матрицы. и умножение матрицы на вектор. Например, когда вы используете np.dot() для пары массивов float64, numpy вызовет BLAS dgemm процедура в фоновом режиме. Хотя эти библиотечные функции выполняются на процессоре, а не на графическом процессоре, они часто являются многопоточными и очень точно настроены для повышения производительности. Хорошая реализация BLAS, например MKL или OpenBLAS, вероятно, будет трудно превзойти по производительности даже на графическом процессоре*.

Однако BLAS поддерживает только типы с плавающей запятой. Если вы вызовете np.dot() для целочисленных массивов, numpy вернется к использованию очень простая внутренняя реализация C++, которая является однопоточной и намного медленнее, чем точка BLAS на двух массивах с плавающей запятой.

Не зная больше о том, как вы проводили эти тесты, я готов поспорить, что простой вызов numpy.dot также легко превзойдет ваши другие 3 метода для массивов float32, complex64 и complex128, которые являются другими 3 типами, поддерживаемыми BLAS.


* Один из возможных способов превзойти стандартный BLAS — использовать cuBLAS, который представляет собой реализацию BLAS, которая будет работать на графический процессор NVIDIA. Библиотека scikit-cuda, кажется, предоставляет для нее привязки Python, хотя я никогда не использовал ее сам.

person ali_m    schedule 29.04.2015

Я понимаю, что numpy будет автоматически использовать несколько процессоров, где у него скомпилированы библиотеки. Для некоторых функций (и я думаю, что dot() была одной из них, хотя сейчас я не могу найти ссылку). Я подозреваю, что это то, что происходит. Я не знаю ни о каких попытках получить серверную часть numpy gpu http://www.reddit.com/r/Python/comments/1mw9mb/is_there_a_gpu_backend_for_numpyscipy_money_is_no/

person paddyg    schedule 29.04.2015