Я выполняю умножение матриц с помощью этого простого алгоритма. Для большей гибкости я использовал объекты для матриц, которые содержат динамически создаваемые массивы.
По сравнению с моим первым решением со статическими массивами, оно в 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;
}
Я добавил полный исходный код ниже и попробовал некоторые из ваших советов:
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
.
Вот некоторые результаты. Сравнение стандартного алгоритма (std), перестановки j и k цикла (swap) и блокированного алгоритма с размером блока 13 (блок).