реализация умножения матрицы вектора в сборке - PullRequest
0 голосов
/ 22 августа 2011

У меня есть алгоритм, который делает шаги дерева линейной алгебры снова и снова,

loop{
  first I multiply a Vector and a Matrix, 
  Second I calculate the sum of elements in the Vector 
  and Thirdly I scale the vector using the sum, making sure the vectors elements scale to one.
}

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

У кого-нибудь есть опыт оптимальной реализации этих вызовов, моя матрица составляет около 100 * 100, а вектор содержит 100 элементов.

Я думаю, что вектор может вписаться во что-то вроде 8 128-байтовых регистров mmx. Делать умножения довольно быстро, есть идеи?

1 Ответ

5 голосов
/ 22 августа 2011

Оптимизированная библиотека BLAS - очень сложный код, и вы вряд ли добьетесь большего успеха, если вы не являетесь экспертом в программировании asm и не разбираетесь в производительности кэш-памяти вашего ЦП и готовы потратить много времени на тестирование различных подходов,Если вы хотите увидеть, как это делается, вы можете скачать и посмотреть исходный код GOTO BLAS (реализован в asm, да).

Я не уверен, как провести существенную оптимизацию вашего кода.Я подозреваю, что уже при N = 100 O (N ^ 2) матрично-векторного произведения будет доминировать во время выполнения, а второй и третий этапы вашего алгоритма довольно незначительны.Поэтому попытка объединить все три шага не выглядит такой полезной.

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


double my_sum = sum(my_vector);
double tmp = 1 / my_sum;
for (i=...) {
   my_vector[i] *= tmp;
}

...