быстрое умножение матриц в Matlab

Мне нужно сделать матричное/векторное умножение в Matlab очень больших размеров: «A» - это 655360 на 5 матриц с действительными значениями, которые не обязательно являются разреженными, а «B» - это 655360 на 1 действительный вектор. Мой вопрос заключается в том, как эффективно вычислить: B'*A.

Я заметил небольшое улучшение времени, вычислив вместо этого A'*B, что дает вектор-столбец. Но все равно он довольно медленный (мне нужно несколько раз проделать эту операцию в программе).

Немного поискав, я нашел интересный набор инструментов Matlab MTIMESX Джеймса Турсы, который, как я надеялся, улучшит приведенную выше производительность матричного умножения. После нескольких испытаний я могу получить лишь очень незначительный выигрыш по сравнению с собственным матричным умножением Matlab.

Любые предложения о том, как мне переписать A'*B, чтобы операция была более эффективной? Спасибо.


person Cowboy    schedule 04.10.2011    source источник
comment
Я думаю, что для матричных операций производительность Matlab уже близка к лучшей из возможных, поскольку матричные операции уже оптимизированы и распараллелены.   -  person jpjacobs    schedule 04.10.2011
comment
Как многие здесь упоминали, у Matlab не должно возникнуть проблем с обработкой такого матричного умножения. Однако ваш вопрос предполагает, что с вашим кодом или вашей системой что-то очень и очень не так: умножение векторов такого размера на моей машине i7 занимает около 0,003 секунды. Даже если предположить, что старые машины в 300 раз медленнее, вычисления должны занимать меньше секунды! Также не должно быть проблем с памятью, поскольку матрице A требуется всего 26 МБ памяти.   -  person Yanir Kleiman    schedule 03.01.2013


Ответы (5)


Смысл существования Matlab заключается в матричных вычислениях. Я был бы очень удивлен, если бы вы могли значительно превзойти его встроенное матричное умножение с помощью инструментов, созданных вручную. Прежде всего, вы должны убедиться, что ваше умножение действительно может быть выполнено значительно быстрее. Вы можете сделать это, реализовав аналогичное умножение в C++ с помощью Eigen.

person thiton    schedule 04.10.2011

У меня были хорошие результаты с умножением матриц Matlab с использованием GPU

person Maurits    schedule 04.10.2011
comment
Параллельная вычислительная мощность, кажется, была интегрирована в новую версию Matlab с некоторой функцией, такой как gpuArray. - person Cowboy; 04.10.2011

Чтобы избежать операции транспонирования, вы можете попробовать:

sum(bsxfun(@times, A, B), 2)

Но я был бы удивлен, что это было быстрее, чем прямая версия. См. ответ @thiton.

Также посмотрите на http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html, чтобы понять, почему версия на основе векторов-столбцов работает быстрее, чем версия на основе векторов-строк.

person Nzbuu    schedule 04.10.2011
comment
Спасибо. Действительно, очень сложно превзойти родное матричное умножение Matlab. Требуется больше времени, если я использую bsxffun вместе с суммой - person Cowboy; 04.10.2011

Matlab построен с использованием довольно оптимизированных библиотек (BLAS и т. д.), поэтому вы не можете легко улучшить его из Matlab. Где вы можете улучшить, так это получить лучший BLAS, например, оптимизированный для вашего процессора - это позволит лучше использовать кэши, получая блоки данных соответствующего размера из основной памяти. Попробуйте создать собственные скомпилированные версии ATLAS, ACML, MKL и Goto BLAS.

Я бы не стал решать это конкретное умножение, если только оно вас не убивает. Замена BLAS, скорее всего, приведет к более удачному решению, особенно если вы в настоящее время не используете многоядерные процессоры.

person Iterator    schedule 06.10.2011
comment
Не могли бы вы рассказать об этом немного подробнее? Как мне получить лучший BLAS, а затем сказать Matlab использовать его? Если доступен лучший BLAS, почему Matlab его еще не использует? - person littleO; 13.01.2016

Ваш вариант № 1, если это ваше узкое место, — пересмотреть свой алгоритм. См. этот вопрос Оптимизация кода MATLAB для отличного примера того, как выбор другого алгоритма сократил время выполнения на три порядка. величина.

person Marc    schedule 04.10.2011