Многопоточность исключения Гаусса - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь создать параллельную программу для исключения Гаусса с Java.

Я делаю 2 случайных матрицы A и B в начале, и я не использую поворот.

Мой код, когда я создаю темы:

  GaussianElimination threads[] = new GaussianElimination[T];
        long startTime = System.currentTimeMillis();

    for (int k = 0; k < N; k++) {


        /**This for statement creates threads that behave like objects
         * With the start() method we execute the run() proccess .And with
         * Join() the main thread wait for all the other threads to finish
         */
        for (int i = 0; i < T; i++) {
            threads[i] = new GaussianElimination(T, k, i, A, B);

            threads[i].start();
        }
        for (int i = 0; i < T; i++) {
            try {
                threads[i].join();
            } catch (InterruptedException e) {
                System.err.println("this should not happen");
            }
        }
    }


    long endTime = System.currentTimeMillis();
    float time = (endTime - startTime) / 1000.0f;
    System.out.println("Computation time: " + time);

После этого метод запуска:

class GaussianElimination extends Thread {
    private int myid;
    private double[] B;
    private double[][] A;
    int k;
    int threads;


GaussianElimination(int threads, int k, int myid, double[][] A, double[] B) {
    this.A = A;//Matrix A
    this.B = B;//Matrix B
    this.myid = myid;//Id of thread
    this.k = k;//k value from exterior loop
    this.threads = threads; //size of threads
}

/**Method run() where the threads are running .
 *
 * The distribution of the data are in cyclic mode.
 * e.g. For 3 threads the operation of each thread will be distribute like this:
 * thread 1 = 1,4,7,10...
 * thread 2= 2,5,8,11...
 * thread 3 =3,6,9,12...
 */
public void run() {
    int N = B.length;
    long startTime = System.currentTimeMillis();//Clock starts
    for (int i = myid + k + 1; i < N; i += threads) {
        double factor = A[i][k] / A[k][k];
        B[i] -= factor * B[k];
        for (int j = k; j < N; j++)
            A[i][j] -= factor * A[k][j];
        long endTime = System.currentTimeMillis();
        float time = (endTime - startTime) ;//clock ends
        System.out.println("Computation time of thread: " + time);
    }
  }
}

После этого я делаю серию обратной замены, и я печатаю решение.

Итак, программа работает, но не работает параллельно. Я пытался проверить время между каждым потоком, но оно не пришло к решению.

Я не смог найти много примеров в java для подобных проблем, поэтому я спрашиваю здесь.

Это плохая архитектура и логика или есть какие-либо ошибки кодирования в моей программе?

Также вот серийный код, который я использовал https://www.sanfoundry.com/java-program-gaussian-elimination-algorithm/

Спасибо за сотрудничество!

...