Нахождение обратной матрицы методом вращений.

Olenenok

Задолбался! Пишу уже месяц, собственно, написал дня за три включая оптимизацию (блочный метод, развёртка циклов). Но достигнуть нужной скорости не могу - нужно считать на P4 2400 или AXP 2500 матрицу порядка 2000x2000 примерно за 20 секунд, но как я ни старался, быстрее чем за 36 у меня не получается. Дайте советы по алгоритму!

rosali

Компилятор?

Helga87

Вариант использовать из проги Матлаб не катит? Там все алгоритмы уже написаны и работают со всеми возможными оптимизациями.

Olenenok

MSVC из 2005 и GCC. Дают примерно одинаковую скорость.

Olenenok

Это мне по учёбе, так что не катит.

Werdna

gprof делал? где затык?
еще бы код сюда кинул

Olenenok

Что такое gprof не знаю, затык в методе вращений, версия, что я сейчас выложил, работает медленее чем 36 сек., но это легко исправляется путём замены аргументов в вызове нескольких функций, т.е. сам метод вращения что и в последнем варианте (который я только что испортил исправлениями).

rosali

Под PIV Надо icc попробовать...

Chupa

36 секунд это что?
на Athlon XP 2500+ она выдаёт следующее и подвисает (не дождался ответа в течении двух минут):

Inversion: clocks: 7160000, seconds: 7.160000
Multiplication: clocks: 1990000, Seconds: 1.990000
Residual norm: 4.383545e-10

Olenenok

Это scanf, чтобы увидеть (ну не догадался я консоль запускать) Не забудь изменить константу N, сейчас она равно 1000, в файле Bogachev.cpp - это размерность матрицы.

Olenenok


(1) Диагонализуем главный минор какого-то порядка (небольшого вычисляем соотв. матрицу вращений
(2) Умножаем эту матрицу на полосу A_0 справа от минора
(3) Делим матрицу ниже полосы, в которой лежит главный минор на полосы A_1, ..., A_n
(4) Обнуляем первые n столбцов текущей полосы, находим соотв. м-цу вращений и умножаем её на полосы A_0 A_k, которые мы считаем склееными в одну матрицу, так пробегаем все полосы

mira-bella

Задолбался! Пишу уже месяц, собственно, написал дня за три включая оптимизацию (блочный метод, развёртка циклов). Но достигнуть нужной скорости не могу - нужно считать на P4 2400 или AXP 2500 матрицу порядка 2000x2000 примерно за 20 секунд, но как я ни старался, быстрее чем за 36 у меня не получается. Дайте советы по алгоритму!
а переделай ка ты свою программку на C вместо C++ (уж надеюсь ты знаешь как это сделать)
у C компиляторов вполне может оптимизатор быть гораздо качественнее.
И перекомпили GCC с опцией -O3 (если ты умудрился раньше не включить оптимизацию)
MSVC - отстой
ICC - хорош, так что если юзать MSVS, то с ICC
ну ты конечно, надеюсь, сам догадался в MSVC выбрать Release, вместо Debug (который по умолчанию).
вообще не понимаю почему твоя программа на плюсах, а не на сях, когда ты не используешь ООП и вообще вся программа с стиле C, что для плюсов является паршивым стилем.

Olenenok

MSVC давал код чуть быстрее чем у GCC, естественно, все оптимизации были включены как у того, так и другого. А вот C - попробую.

nawok

Попробуй использовать уже написанные алгоритмы. Вроде бы здесь есть все необходимое тебе.

Ivan8209

Study FAQ?
---
...Я работаю антинаучным аферистом...

rosali

MSVC - отстой
Сотри и не позорься. GCC проигрывает студии по качеству оптимизации.

mira-bella

Сотри и не позорься. GCC проигрывает студии по качеству оптимизации.
видать у вас была галимая версия GCC (а если вы лично не проверяли с нужными опциями оптимизации, то вообще не о чем говорить) - какая-нибудь 3.0, 3.1.
GCC (ясно последние версии, либо 2.95.3) совершенно определенно не проигрывает MSVC6 (а очень даже выигрывает) - из личного опыта измерений производительности и просмотра ассемблерного кода.
VC7, VC8 - не проверял, проверю
ICC оптимизирует хорошо - это да.

otets-mihail

вы ведь уже по этому вопросу

mira-bella

вы ведь уже спорили по этому вопросу
разве ж это спор
каждый высказал по мнению и все
да и смысл как бы не в споре, а в том, чтобы опытом поделиться

rosali

с нужными опциями оптимизации
Ну если тюнить GCC как-то помимо -O3, то и студию надо тюнить, чтобы сравнивать. Я пользуюсь 3.4, (4.0 со своим буквальным пониманием стандарта идет лесом ). Я конечно систематического исследования никакого не проводил, но вот совсем недавно проверяли, gcc не смог свернуть for(...){a[i]=b[i];} в rep movsb, а студия сворачивает. Не знаю, может сейчас такие процессоры пошли, что movsb медленне чем цикл но memcpy работал вдвое быстрее чем то, что нагенерил gcc, а на студии не было разницы. Такая мелочь, конечно, не показатель, но нексолько похожих примеров и сформировали мое мнение...

Olenenok

Он сказал, что проверял на VC6, а я пользовался VC2003 и VC2005. 2003, по моему, чуть побыстрее, но они оба быстрее чем GCC, причем иногда очень значительно, порядка 15% (6.6 сек на GCC и 5.8-6 на 2005).
Оставить комментарий
Имя или ник:
Комментарий: