Как ускорить умножение матриц в C ++?

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

По сравнению с моим первым решением со статическими массивами, оно в 4 раза медленнее. Что я могу сделать, чтобы ускорить доступ к данным? Я не хочу менять алгоритм.

 matrix mult_std(matrix a, matrix b) {
 matrix c(a.dim(), false, false);
 for (int i = 0; i < a.dim(); i++)
  for (int j = 0; j < a.dim(); j++) {
   int sum = 0;
   for (int k = 0; k < a.dim(); k++)
    sum += a(i,k) * b(k,j);
   c(i,j) = sum;
  }

 return c;
}


EDIT
Я исправил свой вопрос avove!

Я добавил полный исходный код ниже и попробовал некоторые из ваших советов:

  • поменяли местами k и j итераций цикла -> заявлено повышение производительности
  • dim () и оператор () () как встроенный -> улучшение производительности
  • передача аргументов по константной ссылке -> потеря производительности! почему? поэтому я не использую его.

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

Но у меня есть другая проблема: я получаю ошибку памяти в функции mult_strassen (...) . Почему?
terminate вызывается после создания экземпляра 'std :: bad_alloc'
what (): std :: bad_alloc


СТАРАЯ ПРОГРАММА

main.c http://pastebin.com/qPgDWGpW

c99 main.c -o matrix -O3


НОВАЯ ПРОГРАММА

matrix.h http://pastebin.com/TYFYCTY7
matrix.cpp http://pastebin.com/wYADLJ8Y
main.cpp http://pastebin.com / 48BSqGJr

g ++ main.cpp matrix.cpp -o matrix -O3 .


EDIT

Вот некоторые результаты. Сравнение стандартного алгоритма (std), перестановки j и k цикла (swap) и блокированного алгоритма с размером блока 13 (блок). alt text

17
задан Ciro Santilli 新疆改造中心法轮功六四事件 13 March 2017 в 09:30
поделиться