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