2014-12-06 3 views
0

Попытка получить многопоточное матричное умножение для работы на Java. Для выполнения операции дается матрица (m x n), матрица (n x k) и «t».Многопоточная матричная мультипликация Java

Моя программа работает, когда матрицы квадратные и t == n. При работе с t < n другие потоки не подбирают дополнительные операции и возвращают частично заполненную матрицу. Когда матрицы не квадратные, дополнительные потоки возвращают массив за пределы ошибок и не запускаются. Я был бы очень признателен за любые советы. Вот соответствующие фрагменты кода

Начальные темы. множители - это массив MatrixMultiplier, класс, определенный позже.

Multiply multiply = new Multiply(cols_mat,rows_mat2); 

    for (int i = 0; i < threads ; i ++){ 
     multipliers[i] = new MatrixMultiplier(multiply); 
    } 

    for (int i = 0; i < threads; i++){ 
     my_threads[i] = new Thread(multipliers[i]); 
    } 

    for (int i = 0; i < threads; i++){ 
     my_threads[i].start(); 
    } 

    for (int i = 0; i < threads ; i++){ 
     my_threads[i].join(); 
    } 

Multiply класс, который определяет матричное умножение

class Multiply extends MatrixMultiplication{ 

private int i; 
private int j; 
private int chance; 

public Multiply(int i, int j){ 
    this.i=i; 
    this.j=j; 
    chance=0; 
} 

public synchronized void multiplyMatrix(){ 

    int sum=0; 
    int a=0; 
    for(a=0; a<i; a++){ 
     sum = 0; 
     for (int b = 0; b<j; b++){ 
      sum=sum+mat[chance][b]*mat2[b][a]; 
     } 
     result[chance][a]=sum; 
    } 

    if(chance >=i) 
     return; 
    chance++; 
} 

}

и матрица мультипликатор

class MatrixMultiplier implements Runnable { 

private final Multiply mul; 

public MatrixMultiplier(Multiply mul){ 
    this.mul=mul; 
} 

@Override 
public void run(){ 
    mul.multiplyMatrix(); 
} 

}

Где я лично думаю, что ISSU e лежит с if (шанс> = i) return; но я не нашел способ включить обязанности столбца потока с программой, все еще работающей. Снова, любой совет, указывающий мне в правильном направлении, будет очень признателен. Спасибо

ответ

0

С кодом есть несколько проблем.

Поля t предполагают, что для получения матрицы результатов требуется только умножение t. Это не так, если m! = K или t! = M или t! = K. Нити - это рабочие потоки, которые будут обрабатывать ваши запросы. Я хотел бы подумать о том, чтобы каждый MatrixMultiplier имел доступ к матрицам mxn, nxk, mxk и контейнеру записей rolcolumn.

class MatricMultiplier { 
     private double a[][], b[][], results[][]; 
     private Queue<..> entries; 
     .... 
} 

Метод запуска затем будет использовать контейнер ввода для вычисления суммы для данной записи полученной матрицы mxk. Метод прогона может стать следующим:

run() { 
     for(Entry entry = entries.poll() ; entry != null ; entry = entries.poll()) { 
      int row = entry.row; 
      int col = entry.col; 
      double sum = 0.0; 
      for(int i = 0 ; i < a[row].length ; i++) { 
       sum += a[row][i] * b[i][col]; 
      } 
      results[row][col] = sum; 
     } 
    } 

Здесь есть три вещи, которые отличаются от того, что у вас есть.

  1. вы не используете блок синхронизации
  2. каждый элемент вычисляет ответ для уникальной строки/столбца результата матрицы
  3. Множественное класс не требуется больше

Вы затем может создавать t потоков, которые обрабатывают каждую запись в контейнере записей и выходят, когда контейнер записей пуст.

Обратите внимание, что контейнер записей должен быть одним из контейнеров параллельной очереди, доступных в пакете java.util.concurrent.

Оставшаяся задача заключается в создании контейнера записей строки.Вот код, который вы можете использовать:

Queue<..> entries = new Concurrent...<..>(); 
int rowSize = a.length; 
int colSize = b[0].length; 
for(int row = 0 ; row < rowSize ; row++) { 
    for(int col = 0 ; col < colSize ; col++) { 
     entries.add(new RowColumnEntry(row,col)); 
    } 
} 

отмечая, что а и Ь MXN и nxk матрицы.

Надеюсь, это поможет.

Смежные вопросы