-2

アレイ用{ 24 48 27 1 5 30 40 27 31 36 29 45 45 43 10 15 50 35 40 47 }

index  0- 3 ---> processor 0,  
index  4- 7 ---> processor 1,
index  8-11 ---> processor 2,
index 12-15 ---> processor 3,
index 16-19 ---> processor 4,

そして、マスターの合計を返し、すべてを合計します。

簡単に実行できるようにコーディングするにはどうすればよいですか???

import java.util.Random;
import mpi.*;

public class Aznin {

    public static void main(String args[]) throws Exception {
            Random randomNumbers = new Random();            
            MPI.Init(args);
            int my_rank = MPI.COMM_WORLD.Rank();
            int size = MPI.COMM_WORLD.Size();
            MPI.COMM_WORLD.Barrier();
            int[] n = new int[100];
            int[] my_sum = new int[1];
            int blockNum, start, end;
            int finalSum = 0;

            // master initialize random integers and stores them
            if (my_rank == 0)   {
                System.out.println("");
                    //for 20 values produced by Random number function; but you can declare an array of 20 values; other option can read values from the file--- OK Dear Students :)                

            //how many valus you want to distribute e.g. 20 
            for (int i = 0; i < 20; i++)    {
                    n[i] = 1 + randomNumbers.nextInt(50);
                    System.out.printf("%d| ", n[i]);
                }
                System.out.printf("\n");
            }

            //Broadcast n from master processor to all available processors
            MPI.COMM_WORLD.Bcast(n, 0, 20, MPI.INT, 0);

            // Each processor calculates the result
            my_sum[0] = 0;
            blockNum = 20/size;     // calculates number of data blocks--- using how many CPUs i.e. Size
            start = my_rank * blockNum; // calculates for starting index for particular processor
            end = start + blockNum; // calculates for ending index for particular processor

            //Keep in mind; your approach can vary from my approach; you can create lists at run time as well --OK
            for (int i = start; i < end; i++)   {
                my_sum[0] = my_sum[0] + n[i];
            }
            System.out.println("Result from processor " +my_rank+ " = " +my_sum[0]);

            if (my_rank == 0)   {   // master processor waits for result from workers
                finalSum = my_sum[0];
                //master processor recieves result from all available worker prosessors
                for (int wproc = 1; wproc < size; wproc++)  {
                    MPI.COMM_WORLD.Recv(my_sum, 0, 1, MPI.INT, MPI.ANY_SOURCE,99);
                    finalSum = finalSum + my_sum[0];
                }
            }
            else    {   // worker processors
                // send result to master processor
                MPI.COMM_WORLD.Send(my_sum, 0, 1, MPI.INT, 0, 99);
            }

            // master processor prints final result
            if (my_rank == 0)   {
                System.out.println("Result = " + finalSum);
            }

            MPI.Finalize();
    }
}
4

2 に答える 2

0

あなたの要件は私には明確ではありません。なぜC++とjavascriptの両方が必要なのかわかりません。とにかく、これがjavscriptで似たようなことをする方法です。

var data = [ 24, 48, 27, 1, 5, 30, 40, 27, 31, 36,
             29, 45, 45, 43, 10, 15, 50, 35, 40, 47 ];

function totalInChunks(d, n) {
  var result = [];
  var i = 0, j, len = d.length, t;
  do {
    for (t=0, j=0; j<n; j++) {
      t += d[i++];
    }
    result.push(t);
  } while (i<len)

  return result;
}

totalInChunks(data, 4); // 100,102,141,113,172

それが役に立つかどうかはわかりません。計算されている場所でtは、データまたはオブジェクトをグループ化して別のプロセッサに送信し、最後に結果を収集して最終結果を照合することができると思います。ただし、javascriptはシングルスレッドであるため、 setTimeoutを使用して設定することはできますが、JavaScriptを非同期で実行することはあまり重要ではありません。

非同期処理を調整するための演習として以外は、要点を理解するのは難しいです。

于 2012-04-20T07:07:26.153 に答える
0

MapReduce を使用して、マルチスレッドの方法で配列を合計できます。そのためのコードがネット上を飛び回っています。それらを採用するだけです:

http://pages.cs.wisc.edu/~gibson/mapreduceexample/main.C.html

于 2012-04-20T06:48:12.800 に答える