0

もっと簡単な問題を解決する必要があります。1000 個のランダムな X 値と 1000 個のランダムな Y 値の並列合計を解く必要があります。JavaのParallel ForkJoinフレームワークを使用しています。単一の計算方法を使用すると、まったく異なるルートで X 値と Y 値の合計を計算することはできません。

さらに、X * Y の合計を計算する必要があります。つまり、Σxiyi ですが、1 つのスレッドがトラバースする X 値は別のタスクを割り当て、Y は別のタスクとしてスレッドプールに挿入されます。では、X と Y の両方の値を同時に乗算するにはどうすればよいでしょうか。つまり、X * Y ==> (X = 100, Y = 150) のようになります。最初のスレッドは X で動作し、2 番目のスレッドは Y で動作します。

コード:

public class 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;
        }       
    }

}

4

1 に答える 1

0

2 つの int 配列xsを用意ysし、タスクの外部で作成して、タスクのパラメーターとして指定する必要があります。だからあなたのコンストラクタ

RegressionLineForkJoinTask(int a_start,int a_end)またはRegressionLineForkJoinTask(int a_start,int a_end, int[] vector)であるベクトル となります 。彼らはそのように使用します:xsysvector

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 */
}

次に、同じ基準ProductRecursiveForkJoinTaskで、このコンストラクターを使用して 2 つのベクトルを操作 できます。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 */
}
于 2012-08-21T12:22:36.593 に答える