Jak zrównoleglić mój program?

0

Witam wszystkich. Mam pewien problem. Mam do napisania program, który za pomocą algorytmu Gaussa / Gaussa-Jordana rozwiąże układ równań liniowych. Mój problem leży w tym, że dodatkowym punktem zadania jest to, by obliczenia wykonywały się w sposób równoległy. Nie bardzo wiem w jaki sposób to mogę zrobić. W sensie wiem jak skorzystać z wątku , czy to przez rozszerzenie klasy Threadem, czy poprzez Runnable, ale nie bardzo mam pomysł na zrobienie tego w kontekście tego zadania... Może ktoś pomoże mi wpaść na jakiś pomysł :)

Program jest gotowy i działa prawidłowo, algorytm przedstawia się następująco:

 public class Gauss_Jordan 
{

	 public double[] GaussElimination(long[][] A, long[] b, int n)
     {
         double[] x = new double[n];

         double[][] tmpA = new double[n][n + 1];

         for (int i = 0; i < n; i++)
         {
             for (int j = 0; j < n; j++)
             {
                 tmpA[i][j] = A[i][j];
             }
             tmpA[i][n] = b[i];
         }

         double tmp = 0;

         for (int k = 0; k < n - 1; k++)
         {
             for (int i = k + 1; i < n; i++)
             {
                 tmp = tmpA[i][k] / tmpA[k][k];
                 for (int j = k; j < n + 1; j++)
                 {
                     tmpA[i][j] -= tmp * tmpA[k][j];
                 }
             }
         }

         for (int k = n - 1; k >= 0; k--)
         {
             tmp = 0;
             for (int j = k + 1; j < n; j++)
             {
                 tmp += tmpA[k][j] * x[j];
             }
             x[k] = (tmpA[k][n] - tmp) / tmpA[k][k];
         }
         

         return x;
     }


 }
	


Jako parametry podajemy współczynniki przy niewiadomych (long[][] A) , wartości po prawej stronie równania (long b[]), oraz pomocniczo ilość niewiadomych (int n).

0

Jesteś pewien? Bo da się co prawda zrobić równoległą/współbieżną eliminacje Gaussa ale to jest nietrywialny algorytm. Poczytaj sobie http://www.netlib.org/lapack/lawnspdf/lawn280.pdf

0

Noo, nie wygląda to za ciekawie. zastanawiałem się raczej nad takim rozwiązaniem, żeby tą macierz wejściową podzielić na jakieś mniejsze. Wtedy równolegle liczone są "ćwiartki" macierzy, ale przecież wtedy wyniki kompletnie się rozjadą. Bo nie wiem w jaki inny sposób mogę to zrobić równolegle , skoro tak na prawdę każdy krok jest zależny od poprzedniego. W sensie na przykład dla macierzy 6x6 wątek 1 nie może wykonywać liczenia x1 x2 x3 , a wątek 2 x4, x5, x6 ...

0

Ale ty w ogóle czytałeś to co podlinkowałem? Albo jakikolwiek artykuł na ten temat? Tego się nie da tak na pałe ani na chłopski rozum zrobić. To nie jest merge sort tylko dość złożony problem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1