Реализованные модели
Реализацию моделей и алгоритмов можно посмотреть в приложении 3.
Модель квадратной матрицы
Шаблонный класс Matrix – математическая модель матрицы, с помощью которого осуществлялось тестирование скоростей работы классического алгоритма и алгоритма Штрассена.
Над матрицами определены операции:
classicProduct – умножение двух матриц по классическому алгоритму;
shtrassenProduct – умножение двух матриц по алгоритму Штрассена;
operator + – операция сложения двух матриц;
operator - – операция разности двух матриц.
Вышеописанные методы общедоступны, принимают в качестве параметра указатель на матрицу, а возвращают указатель на новую матрицу – результат работы метода.
Вспомогательные для алгоритма Штрассена методы (они скрыты):
getNormalized – возвращает расширенную до следующей степени двойки матрицу. Принимает целое число – следующая степень двойки;
isNormalSize – возвращает 0, если размер матрицы кратен степени двойки, в противном случае, возвращает следующую степень двойки. Принимает указатель на матрицу;
decomposeMatrix – разбивает матрицу на четыре равных блока. Принимает указатель на матрицу. Возвращает массив с четырьмя указателями на матрицы-блоки;
buildMatrix – построение матрицы из четырёх её блоков. Принимает массив с четырьмя указателями на матрицы-блоки;
sp – рекурсивная составляющая алгоритма Штрассена. Принимает два указателя на матрицы, а возвращает указатель на матрицу – результат умножения;
isNull – проверяет, нулевая ли это матрица.
Экспериментальная часть
План эксперимента
Провести вычислительный эксперимент для определения времени выполнения алгоритмов для умножения матриц. Использовать одинаковые матрицы-сомножители.
Эксперимент проводить в два этапа:
Первый этап: размер матрицы изменять от 100 до 1200 с шагом 10;
Второй этап: размер матриц изменять от 500 до 4500 с шагом 500.
На каждом шаге запускать алгоритмы умножения 5 раз, для того, чтобы уменьшить влияние операционной системы.
Условия проведения экспериментов
Характеристики компьютера:
Процессор: Pentium® Dual-Core CPU T4400 @ 2.20GHz 2.20GHz;
Оперативная память: 3.00 GB;
Операционная система: Windows 7 Максимальная Service Pack 1.
Описание входных параметров
Для исследования алгоритмов использовались квадратные матрицы, плотно заполненные целыми числами от 0 до 32767.
Результаты экспериментов
В этом разделе представлены результаты проведения экспериментов. Численные данные представлены в таблицах приложения 1 и приложения 2. На рисунке 1 изображён график, полученный после проведения первого этапа эксперимента.
Рисунок
1. Время выполнения, замеры от размерности
100 до 1200 с шагом 10.
На рисунке 2 изображён график, полученный после проведения второго этапа эксперимента.
Рисунок 2. Время
выполнения, замеры от размерности 500 до
4500 с шагом 500.
Выводы
Проведённые опыты показали следующее:
Скорость работы классического алгоритма резко падает при увеличении размерности сомножителей;
Нельзя сказать о явном преимуществе алгоритма Штрассена над классическим алгоритмом при умножении матиц небольших размеров;
Алгоритм Штрассена эффективен только при размерности множителей близкой к степени двойки;
С увеличением размерностей матриц увеличивается диапазон размерностей между степенями двойки, при которых алгоритм Штрассена работает эффективней;
Попытка ускорить алгоритм Штрассена введением нулевой матрицы (предложение 1) не дала ожидаемых результатов.
Алгоритм Штрассена обладает преимуществом над классическим алгоритмом при умножении матриц больших размеров. Это преимущество появляется из-за сокращения арифметических операций на каждом этапе рекурсии, причём увеличение размерностей матриц влечёт увеличение числа «сэкономленных» арифметических операций.
Применение алгоритма Штрассена для умножения матриц небольших размеров неэффективно, так как умножение сводится к разбиению матриц на меньшие блоки и применению к ним классического алгоритма. Классический алгоритм не производит разбиение, т.е. не тратит время, на матрицах небольшого размера это даёт небольшой выигрыш в скорости.
Ускорение алгоритма Штрассена за счёт введения нулевой матрицы (предложение 1) не дало преимущества, так как при таком подходе необходимо проверять количество ненулевых строк и столбцов, кроме того, необходимо при каждом разбиении вычислять количество непустых строк и столбцов – это влечёт увеличение количества арифметических операций, и, как следствие, увеличение временных затрат.
Резюме
Алгоритм Штрассена достаточно эффективен, но это преимущество над классическим алгоритмом проявляется при использовании его для умножения матриц больших размеров, говоря точнее, алгоритм Штрассена эффективен, когда размерность сомножителей стремится к бесконечности.
