| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Распараллеливание алгоритма Гаусса |
| Автор: k0c9k 24.12.2006, 23:18 | ||
Товарищи ! нужно реализовать параллельный алгоритм нахождения обратной амтрицы методом Гаусса. Не поделитесь соображениями ? Просто не могу сообразить как его вообще можно распараллелить… Но можно: надыбал какой-то исходник решения СЛАУ методом Гаусса (сам разобраться в нем как-то немогу =( )
Помогите плиз ! |
| Автор: SoWa 25.12.2006, 05:03 |
| И ты хочешь, чтобы твой код разобрали? Нет. Лучше сам напиши. Не сложно ведь? Что касается алгоритма. Что значит параллельный? |
| Автор: k0c9k 25.12.2006, 10:00 |
| Не сложно. Почти написал. Такая шиза получилась. Кому интересно - могу выложить. Параллельный в смысле, что в несколько процессов выполняется. Реализован с помощью MPI Как доделаю расскажу свои домыслы. |
| Автор: V.A.KeRneL 25.12.2006, 10:46 |
Вообще, имхо, надо по дефолту выкладывать... Наверняка кому-нибудь в будущем пригодится! И не надо будет заново всё с нуля писать, а можно будет просто ссылочку сюда дать. А те, кто умеют пользоваться поиском по форуму, вообще новую тему создавать не станут!.. Так что, выкладывай, конечно! |
| Автор: SoWa 25.12.2006, 15:03 |
| Нет. Выкладывать не стоит. Кому надо- сами напишут. Или если уж совсем невтерпеж похвастаться- подредактируй свой первый пост и в нем выложи |
| Автор: k0c9k 26.12.2006, 06:41 |
| Пока исходник не отлажен расскажу что я сам надумал. Напомню, метод Гаусса нахождения обратной матрицы заключается в приписании к правой части единичной матрицы такой-же размерности. И с помощью перестановок сведением левой матрицы к единичной. Таким образом в правой части получается обратная. Сам процесс вычисления состоит в последовательном делении i-ой строки на элемент a[i,i] (имеется ввиду что на этом этапе все элементы a[i,k], k<i уже равны нулю). Элемент a[i,i] станет равным 1. после этого можно нужно будет из всех строк вычесть i-ю строку домноженную на a[k,i],k!=i. таким образом мы сводим левую (исходную) матрицу к единичной, а в правой части появится обратная. Теперь как я всё это дело решил запараллелить: В принципе, если у нас матрица больших размеров, самой трудоёмкой частью будет вычитание текущей строки из остальных строк. Поэтому решил что у всех процессов будет храниться своя часть матрицы. После того как диспетчерский процесс считает саму матрицу он поледовательно будет выдавать всем процессам по строке. В итоге получаем что у каждого процесса будет в среднем (размерность/кол-во потоков). Теперь диспетчерский процесс посылает остальным сообщение о том, что i-строка делится на a[i,i]. Тот процесс который понял что i-строка принадлежит ему производит деление строки, после чего отсылает её остальным процессам. Процессы вычитают из своих строк полученную. Цикл повторяется. По окончании цикла, все процессы отсылают диспетчерскому строки правой части. |
| Автор: Silver 26.12.2006, 09:05 |
| http://www.ssdonline.sscc.ru/korneev/Lab5%5Clab5_pexampl.htm |
| Автор: k0c9k 26.12.2006, 22:02 |
| Спасибо за хелп который здесь появился Программную реализацию выкладывать не буду, ИМХО нечитабельные исходники выкладывать бесполезно. Так что если комуто ОЧЕНЬ понадобится: стучите в ПМ. |
| Автор: maxim1000 28.12.2006, 12:55 |
| честно говоря, я вижу здесь одну вещь, котогрую можно распараллелить - вычитание одной строки из другой (ну и деление тогда же), каждая компонента векторов обрабатывается независимо, так что можно без проблем поручить это дело разным процессам но с другой стороны, ещё неизвестно какие накладные расходы вызовет такое мелкое деление... |
| Автор: k0c9k 28.12.2006, 13:28 |
| Да. у меня тоже была мысль ещё деление распределить, но из-за такой мелочи как-то не намного скорость я думаю увеличится. Да вообще лучше для подсчета обратной матрицы в несколько процессов использовать рекурсивный алгоритм (с кватернарными деревьями)! Вот он параллелится замечательно! А гаусс - так, по приколу |
| Автор: DENNN 28.12.2006, 13:51 |
| Угу. Мое скромное ИМХО, паралелльность нужна для независимых процессов/потоков. Когда получится сформулировать алгоритм Гаусса как набор нескольки независимых процессов, то решение о реализации будет очевидным )) |