//by andrew fiade 26 oktober 2008 //mpi di visual c# menggunakan alchemi //tapi belum selesai baru 80 % using System; using Alchemi.Parallel; using Environment = Alchemi.Parallel.Environment; namespace ConsoleApplication1 { class Program { private int[] data3 = new int[10]; static void Main(string[] args) { int size, rank, i, j,s,p,r,n; object data; Program sort = new Program(); DateTime tmenow = DateTime.Now; int mls = tmenow.Millisecond; Random rndnumber = new Random(mls); MPI mpi = Alchemi.Parallel.Environment.GetInstance().GetMPI; mpi.Init(); mpi.Comm_Size(out size); mpi.Comm_Rank(out rank); MPI_Comm comm = new MPI_Comm("Andrew"); MPI_Status status = new MPI_Status(); int[] data1,temp; n= Int32.Parse(args[1]); data1 = new int[n]; sort.data3 = new int[n]; temp = new int[n]; // data1[1] = 13; data1[2] = 16; data1[3] = 14; r = n % size; if (rank == 0) { s = n / size; int numWorkers = size - 1; Console.WriteLine("dikasih kesiapa ???jumlah prosesor {0}= {1}={2}={3}", numWorkers,s,size,rank); for (i = 0; i < n; i++) data1[i] = rndnumber.Next(0, 999);/* kriim ke pekerja */ for (int d = 1; d <= numWorkers; d++) { for (i = d * s; i < (s * (d + 1)); i++) { mpi.Send(data1[i], d, 0, comm); } } /* terima dari pekerja*/ Object offsetArray; int dest; Console.WriteLine("untuk dikerjakan proseor 0"); for (int yi = 0; yi < s; yi++) { //untuk id =0 sort.data3[yi] = data1[yi]; Console.WriteLine("data ke {0} = {1}", yi, sort.data3[yi]); } sort.sortArray(s); Console.WriteLine("============"); int tambah; tambah = s; for (int d = 1; d <= numWorkers; d++) { mpi.Recv(out offsetArray, d, 0, comm, status); temp = (int[])offsetArray; for (i = d * s; i < (s * (d + 1)); i++) { sort.data3[i] = temp[i]; } } sort.sortArray(n-1); for (i = 0; i < n; i++) { Console.WriteLine("nilai awal {0}={1}", i, sort.data3[i]); } ; } else { Object payload; int[] nilai; int nilaidata; int[] nilai2; s = n / size; nilai2 = new int[n]; nilai = new int[n]; /* receive data from master */ //terima dari master int id; id = rank-1; //karena di prosesor 0 dikirim melalui id=0 //maka dibuat id=0 int tampung; // nilai2 = new int[s + 2]; int kk = s; Console.WriteLine("identifikasi pekerje = {0} ",rank); // for (i = 0; i < s ; i++) int d = rank; for (i = d * s; i = 0; i--) { siftDown(i, x); } for (i = x - 1; i >= 1; i--) { temp = data3[0]; data3[0] = data3[i]; data3[i] = temp; siftDown(0, i - 1); } } public void siftDown(int root, int bottom) { bool done = false; int maxChild; int temp; while ((root * 2 data3[root * 2 + 1]) maxChild = root * 2; else maxChild = root * 2 + 1; if (data3[root] < data3[maxChild]) { temp = data3[root]; data3[root] = data3[maxChild]; data3[maxChild] = temp; root = maxChild; } else { done = true; } } } } }