быстрый алгоритм для вычисления умножения матриц - PullRequest
7 голосов
/ 06 июня 2011

В середине кода на c ++, eclipse, мне нужно вычислить множитель матриц A и B размером 2400 * 3600 (поэтому размеры не совпадают).Матрицы хранятся в двумерных массивах с плавающей точкой. Они не редкие, без ограничений.

Каждое умножение занимает так много времени (несколько минут), и мне серьезно нужно его уменьшить, потому что у меня есть цикл, который повторяет 50миллион раз.и каждый раз новые A и B должны быть умножены.Любая рекомендация приветствуется, чтобы уменьшить сложность времени.(даже изменить структуру хранения данных, если вы думаете, что это может помочь).Например, что если я сохраню данные в одномерных массивах?Или использовать векторы вместо массивов?

В одном конкретном случае первый столбец всегда равен 1, а значения - 1, -1 или ноль.Есть идеи для этого случая?
В других случаях значения могут быть любыми.** одним из этих умножений является X, умноженное на его транспонированное.Есть ли какие-либо рекомендации по этому конкретному вопросу?

Ответы [ 4 ]

13 голосов
/ 06 июня 2011

Я не стал бы дурачиться, пытаясь написать свой собственный: Google для LAPACK или BLAS, два проверенных временем пакета для численных вычислений, оба оптимизированы до N-й степени. Оба имеют C API, которые вы можете использовать.

9 голосов
/ 06 июня 2011

Это определенно поможет сохранить вашу вторую матрицу транспонированной, чтобы столбцы соответствовали строкам кэша, а не строкам. Разница во времени доступа между кэш-памятью L2 и основной памятью составляет около 10 раз.

2 голосов
/ 06 июня 2011

Вы можете попробовать Eigen .

1 голос
/ 06 июня 2011

Если вы говорите о миллионах умножений, первое, что я хотел бы сделать, - это обратиться к чему-то вроде CUDA или DirectCompute, чтобы перегрузить работу на GPU, которая лучше подходит для такого рода вещей. Это то, что сделал MATLAB, даже если ускорение графического процессора не является обязательным.

Существует множество примеров умножения матриц с GPU-ускорением, поэтому ваша работа не должна быть слишком сложной.

...