Я написал две программы Matrix Multiplications в С++: Regular MM (источник) и Strassen MM (источник), оба из которых работают на квадратных матрицах размеров 2 ^ kx 2 ^ k (другими словами, квадратные матрицы четного размера).
Результаты просто ужасны. Для матрицы 1024 x 1024, Regular MM принимает 46.381 sec
, а Strassen MM принимает 1484.303 sec
(25 minutes
!!!!).
Я попытался сохранить код как можно более простым. Другие примеры Strassen MM, найденные в Интернете, не так сильно отличаются от моего кода. Одна проблема с кодом Штрассена очевидна - у меня нет точки отсечки, которая переключается на обычный MM.
Какие еще проблемы имеет мой код Штрассена MM?
Спасибо!
Прямые ссылки на источники
http://pastebin.com/HqHtFpq9
http://pastebin.com/USRQ5tuy
Edit1. Кулак, много замечательных советов. Спасибо, что нашли время и обмен знаниями.
Я внедрил изменения (сохранил весь свой код), добавил точку отсечения. MM матрицы 2048x2048, с отсечкой 512 уже дает хорошие результаты. Обычный MM: 191.49s Strassen MM: 112.179s Значительное улучшение. Результаты были получены на доисторическом Lenovo X61 TabletPC с процессором Intel Centrino, используя Visual Studio 2012. Я сделаю больше проверок (чтобы убедиться, что у меня есть правильные результаты), и опубликую результаты.