Как быстро производить матричные операции?
Встала проблема по максимально возможному ускорению таких операций:
- перемножение, сложение матриц 2х2, 4х4; умножение такой матрицы на вектор (вычисления интеграла методом Симпсона). Числа комплексные, double.
- произведение векторов. Один -- набор констант, другой -- вычисляется некоторой функцией. Числа вещественные, double.
Компилирую с помощью gcc 4.4.3 при опции O2. Параметр -msse4.2 скорость не изменяет... Стоит вопрос, что можно сделать:
- Boost?
- STL?
- GSL?
- Явным образом переписать с использованием SSE?
- Иное? :)
С уважением, V_oron.
По поводу быстрого переумножения квадратных матриц могу предложить алгоритм Штрассена. Сам не пробовал, так что ищи сам.
В универе как-то делал похожую лабу, средней паршивости. Какие алгоритмы - хз, просто описанные в задаче формулы реализовал. Надеюсь, поможет =)
И, не могу не поделиться, что оказывается ключи O0, O1, O2 в таком порядке соответствуют уменьшению времени тестовой программы вычисления скалчрного произведения двух векторов, от каждого из которого предварительно берется тригонометрическая функция. А вот самая высокая оптимизация O3 вызывает резкое падение скорости :)
И еще маленький нюанс: работа с типом double оказывается быстрее, чем с float! Сперва долго этому удивлялся, но старшее поколение и Зубков объяснили, что FPU-сопроцессор-то 80-битный...