Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как быстро производить матричные операции?

3.1K
19 августа 2011 года
V_oron i
108 / / 01.12.2004
Доброго времени суток!

Встала проблема по максимально возможному ускорению таких операций:
  1. перемножение, сложение матриц 2х2, 4х4; умножение такой матрицы на вектор (вычисления интеграла методом Симпсона). Числа комплексные, double.
  2. произведение векторов. Один -- набор констант, другой -- вычисляется некоторой функцией. Числа вещественные, double.
На данный момент все матрицы и вектора хранятся в простых массивах. Пункт 1 реализую с помощью простейших и очевидных самописных макросов (по определению операций). Пункт 2 выполняю в цикле.
Компилирую с помощью gcc 4.4.3 при опции O2. Параметр -msse4.2 скорость не изменяет... Стоит вопрос, что можно сделать:
  • Boost?
  • STL?
  • GSL?
  • Явным образом переписать с использованием SSE?
  • Иное? :)
К сожалению, не могу понять, используют ли упомянутые библиотеки SSE-инструкции, и вообще на сколько это будет оптимальнее, чем моя реализация. Экспериментов с использованием различных методов пока не проводил... Надеюсь на пинок консультирующего свойства от знающего человека :)

С уважением, V_oron.
445
20 августа 2011 года
Charley
176 / / 16.08.2011
По поводу быстрого переумножения квадратных матриц могу предложить алгоритм Штрассена. Сам не пробовал, так что ищи сам.
244
20 августа 2011 года
UAS
2.0K / / 19.07.2006
В универе как-то делал похожую лабу, средней паршивости. Какие алгоритмы - хз, просто описанные в задаче формулы реализовал. Надеюсь, поможет =)

http://zalil.ru/31580355
3.1K
21 августа 2011 года
V_oron i
108 / / 01.12.2004
Спасибо за советы и информацию! :)
И, не могу не поделиться, что оказывается ключи O0, O1, O2 в таком порядке соответствуют уменьшению времени тестовой программы вычисления скалчрного произведения двух векторов, от каждого из которого предварительно берется тригонометрическая функция. А вот самая высокая оптимизация O3 вызывает резкое падение скорости :)
И еще маленький нюанс: работа с типом double оказывается быстрее, чем с float! Сперва долго этому удивлялся, но старшее поколение и Зубков объяснили, что FPU-сопроцессор-то 80-битный...

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог