2014-12-06 3 views
0

Java에서 작동하도록 다중 스레드 행렬 곱셈을 시도하는 중입니다. 조작을 수행하기 위해 (m x n) 행렬, (n x k) 행렬 및 't'스레드가 제공됩니다.Java 다중 스레드 행렬 곱셈

행렬이 정사각형이고 t == n 일 때 내 프로그램이 작동합니다. t < n으로 실행하면 다른 스레드는 추가 작업을 수행하지 않으며 부분적으로 완료된 행렬을 반환합니다. 행렬이 정사각형이 아닌 경우 추가 스레드는 배열 범위를 벗어난 오류를 반환하고 실행하지 않습니다. 나는 정말로 조언을 해줄 것이다. 관련 코드 스 니펫은 다음과 같습니다

시작 스레드. multipliers는 나중에 정의 된 클래스 인 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(); 
    } 
나는 개인적으로 문 제를 생각하는 행렬 곱셈

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(); 
} 

}

을 정의

곱하기 클래스 e 거짓은 if (chance> = 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; 
     .... 
} 

run 메소드는 항목 컨테이너를 사용하여 결과 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. 당신은 여러 클래스가 더 이상

당신이 필요하지 않은 동기화 블록

  • 각 항목은 결과 행렬
  • 의 고유 한 행/열에 대한 답을 계산하는 사용하지 않는 그런 다음 항목 컨테이너의 각 항목을 처리하는 t 스레드를 만들고 항목 컨테이너가 비어있을 때 종료합니다.

    항목 컨테이너는 java.util.concurrent 패키지에서 사용할 수있는 동시 대기열 컨테이너 중 하나 여야합니다.

    나머지 작업은 rowcolumn 항목 컨테이너를 만드는 방법입니다.다음은 사용할 수있는 코드입니다.

    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)); 
        } 
    } 
    

    a 및 b는 mxn 및 nxk 행렬입니다.

    희망이 도움이됩니다.