Я выполняю матричное умножение с помощью этого простого алгоритма. Чтобы быть более гибким, я использовал объекты для матриц, которые содержат динамически созданные массивы.
Сравнивая это решение с моим первым со статическими массивами, оно в 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()
иoperator()()
какinline
→ улучшение производительности - передача аргументов по ссылке const → потеря производительности! почему? поэтому я не использую его.
Теперь производительность почти такая же, как и в старой папке. Может быть, должно быть немного больше улучшения.
Но у меня есть еще одна проблема: я получаю ошибку памяти в функции mult_strassen(...)
. Зачем? terminate called after throwing an instance of '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 (блок).