2011-12-08 6 views
0

해결하는 데 더 간단한 문제가 필요합니다. 1000 개의 무작위 X 값과 1000 개의 무작위 Y 값의 병렬 합계를 해결해야합니다. 나는 자바의 병렬 ForkJoin 프레임 워크를 사용하고있다. 단일 계산 방법을 사용하면 완전히 다른 경로에서 X 값과 Y 값의 합계를 계산할 수 없습니다.둘 이상의 사용 방법 Javaello의 ForkJoin Framework에서 계산 방법을

이상 나는 X * Y, 즉 Σxiyi의 합계를 계산해야합니다. 하나의 단일 스레드에서 가로 지르는 X 값은 별도의 작업을 할당하고 Y는 스레드 풀에 별도의 작업으로 삽입됩니다. 그렇다면 어떻게 X와 Y 값을 동시에 곱할 수 있습니까? 즉, X * Y ==> (X = 100, Y = 150)입니까? 첫 번째 스레드는 Y.에 X 및 초에 작동

코드 :

공용 클래스 RegressionLineForkJoin {

//private static final ForkJoinPool forkJoinPool = new ForkJoinPool(2);   // use only 2 processors 

private static Random r = new Random();  
private static final int NR_OF_VALUES = 1000;  // X & Y VALUES 
private static final int THRESHOLD = 100; // need to calculate Threshold value. 

    private static class RegressionLineForkJoinTask extends RecursiveTask<Integer> 
    { 
     private int m_Start; 
     private int m_End; 

     public RegressionLineForkJoinTask(int a_start,int a_end) 
     { 
      this.m_Start = a_start; 
      this.m_End = a_end; 
     } 
     public Integer compute() 
     {  
      Integer Sum = 0; 
      if(this.m_End - this.m_Start < THRESHOLD) 
      { 
       calculateSum(this.m_Start,this.m_End); 
      } 
      else 
      { 
       int split = (this.m_Start + this.m_End)/2; 

       RegressionLineForkJoinTask oRegressionLineTask_1 = new RegressionLineForkJoinTask(this.m_Start , split); 
       RegressionLineForkJoinTask oRegressionLineTask_2 = new RegressionLineForkJoinTask(split+1 , this.m_End); 

       // Invoke the tasks in parallel 
       invokeAll(oRegressionLineTask_1,oRegressionLineTask_2); 

       Sum += oRegressionLineTask_1.join(); 
       Sum += oRegressionLineTask_2.join(); 

       //Sum 

      }//end of else 
      return Sum; 
     } 
     public static void main(String[ ] args) 
     { 
      RegressionLineForkJoinTask oRegressionLineForkJoinTask_X = new RegressionLineForkJoinTask(0,NR_OF_VALUES); 
      RegressionLineForkJoinTask oRegressionLineForkJoinTask_Y = new RegressionLineForkJoinTask(0,NR_OF_VALUES); 

      Integer Sum_X_Values = forkJoinPool.invoke(oRegressionLineForkJoinTask_X); 
      Integer Sum_Y_Values = forkJoinPool.invoke(oRegressionLineForkJoinTask_Y); 

      System.out.println("in main after forkjoin.invoke()"); 
     } 
     private static double nextRandomFunctionValue(int a_startInex,int a_endIndex) 
     { 
      double randomValue = 0.0; 
      randomValue = a_startInex + (a_endIndex - a_startInex) * r.nextDouble(); 

      return randomValue; 

     }//end of nextRandomFunctionValue 
     private static double calculateSum(int a_startIndex, int a_endIndex) 
     { 
      double sumValue = 0.0; 
      double RandomeValue = 0.0; 

      for(int index = a_startIndex; index< a_endIndex; index++) 
      {     
       RandomeValue = nextRandomFunctionValue(a_startIndex,a_endIndex); 
       sumValue += RandomeValue; 

      }//end of for 
      return sumValue; 
     }  
    } 

}

답변

0

당신은 xsys 작성하여 2 개 INT 배열을 가져야한다 귀하의 작업 외부에서 귀하의 작업에 매개 변수로 제공됩니다. 그래서 생성자

RegressionLineForkJoinTask(int a_start,int a_end) 는 벡터 xs 또는 ys 인과 RegressionLineForkJoinTask(int a_start,int a_end, int[] vector) 될 것이다. RegressionLineForkJoinTask(int a_start,int a_end, int[] vectorA, int[] vector B)

이 계산 방법 :

public Integer compute() {  
    int sum = 0; 
    if(this.m_End - this.m_Start < THRESHOLD) { 
     for (int i = this.m_Start; i < this.m_End; i++) 
     sum += this.m_vectorA[i] * this.m_vectorB[i]; 
    } /* else split task as before */ 
} 
이 생성자 두 벡터와 함께 작업 ProductRecursiveForkJoinTask을 가질 수 있습니다 동일한 기준에 그런

public Integer compute() {  
    int sum = 0; 
    if(this.m_End - this.m_Start < THRESHOLD) { 
     for (int i = this.m_Start; i < this.m_End; i++) 
     sum += this.m_vector[i]; 
    } /* else split task as before */ 
} 

: 그들은 그런 식으로 vector 사용합니다