Ejemplo n.º 1
0
        public override int go()
        {
            int rank = comm.Rank;

            //Console.Error.WriteLine(rank + ": shift to left begin");
            requestList.WaitAll();
            //Console.Error.WriteLine(rank + ": shift to left end");

            return(0);
        } // end activate method
Ejemplo n.º 2
0
        static List <Timetable> generateTimetable(Intracommunicator comm)
        {
            RequestList           requestList = new RequestList();
            List <ReceiveRequest> reqs        = new List <ReceiveRequest>();

            var classes = System.IO.File.ReadAllLines("input.txt").OfType <string>().Select(line =>
            {
                var l = line.Trim().Split(';');
                return(new Class(l[1], l[0]));
            }).ToList();


            int id = 1;


            foreach (Class c in classes)
            {
                if (id == comm.Size)
                {
                    id = 1;
                }

                Timetable t = new Timetable();
                t.Table[Day.MONDAY][8].Add(c);

                var clone = copy(classes);
                clone.Remove(c);

                comm.Send(false, id, 1);
                comm.Send(new Payload {
                    timetable = t.toList(), classes = clone, day = Day.MONDAY, hour = 8
                }, id, 0);
                reqs.Add(comm.ImmediateReceive <List <Pair <Day, List <Pair <int, List <Class> > > > > >(id++, 0));
                requestList.Add(reqs.Last());
            }

            requestList.WaitAll();

            for (int i = 1; i < comm.Size; i++)
            {
                comm.Send(true, i, 1);
            }

            return(reqs.Select(r =>
            {
                r.Wait();
                return new Timetable((List <Pair <Day, List <Pair <int, List <Class> > > > >)r.GetValue());
            }).Where(t => t.Table.Count != 0).ToList());
        }
Ejemplo n.º 3
0
        public void invoke(object action_id)
        {
            object invoke_lock;

            if (!action_lock.TryGetValue(action_id, out invoke_lock))
            {
                invoke_lock             = new object();
                action_lock [action_id] = invoke_lock;
            }

            lock (invoke_lock)
            {
                Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE SYNC " + action_id + " BEFORE LOCK");
                RequestList request_list = synchronize_action(action_id);

                Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE SYNC " + action_id + " BEFORE WAIT ALL");
                request_list.WaitAll();
                Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE SYNC " + action_id + " AFTER WAIT ALL");
            }
        }
        public override int go()
        {
            int rank = comm.Rank;
            int w1   = Shift_x_east.Cell.predecessor;   //X.predecessor;
            int e1   = Shift_x_east.Cell.successor;     //X.successor;
            int n1   = Shift_y_south.Cell.predecessor;  //Y.predecessor;
            int s1   = Shift_y_south.Cell.successor;    //Y.successor;
            int t1   = Shift_z_bottom.Cell.predecessor; //Z.predecessor;
            int b1   = Shift_z_bottom.Cell.successor;   //Z.successor;

            int e2 = Shift_x_west.Cell.predecessor;     //X.predecessor;
            int w2 = Shift_x_west.Cell.successor;       //X.successor;
            int s2 = Shift_y_north.Cell.predecessor;    //Y.predecessor;
            int n2 = Shift_y_north.Cell.successor;      //Y.successor;
            int b2 = Shift_z_top.Cell.predecessor;      //Z.predecessor;
            int t2 = Shift_z_top.Cell.successor;        //Z.successor;

            //   Console.Error.WriteLine(rank + ": interact begin 1 - " + w1 + e1 + n1 + s1 + t1 + b1);
            //   Console.Error.WriteLine(rank + ": interact begin 2 - " + w2 + e2 + n2 + s2 + t2 + b2);
            //   Console.Error.WriteLine(rank + ": interact begin 3 - " + (Shift_x_east.Cell == Shift_y_south.Cell));
            requestList.WaitAll();
            //   Console.Error.WriteLine(rank + ": interact end");
            return(0);
        }
Ejemplo n.º 5
0
    static void TestRequests(Intracommunicator comm, RequestList requestList)
    {
        int datum         = comm.Rank;
        int expectedDatum = (comm.Rank + comm.Size - 1) % comm.Size;

        int[]    intArraySendBuffer = new int[comm.Rank + 1];
        string[] strArraySendBuffer = new string[comm.Rank + 1];
        for (int i = 0; i <= comm.Rank; ++i)
        {
            intArraySendBuffer[i] = i;
            strArraySendBuffer[i] = i.ToString();
        }

        int[]     intArrayRecvBuffer = new int[expectedDatum + 1];
        string[]  strArrayRecvBuffer = new string[expectedDatum + 1];
        Request[] requests           = new Request[8];
        requests[0] = comm.ImmediateReceive <int>(Communicator.anySource, 0);
        requests[1] = comm.ImmediateReceive <string>(Communicator.anySource, 1);
        requests[2] = comm.ImmediateReceive(Communicator.anySource, 2, intArrayRecvBuffer);
        requests[3] = comm.ImmediateReceive(Communicator.anySource, 3, strArrayRecvBuffer);
        requests[4] = comm.ImmediateSend(datum, (comm.Rank + 1) % comm.Size, 0);
        requests[5] = comm.ImmediateSend(datum.ToString(), (comm.Rank + 1) % comm.Size, 1);
        requests[6] = comm.ImmediateSend(intArraySendBuffer, (comm.Rank + 1) % comm.Size, 2);
        requests[7] = comm.ImmediateSend(strArraySendBuffer, (comm.Rank + 1) % comm.Size, 3);

        if (requestList == null)
        {
            // Complete all communications manually
            bool allDone = false;
            while (!allDone)
            {
                allDone = true;
                for (int i = 0; i < requests.Length; ++i)
                {
                    allDone = allDone && requests[i].Test() != null;
                }
            }
        }
        else
        {
            // Use the request list to complete all communications
            for (int i = 0; i < requests.Length; ++i)
            {
                requestList.Add(requests[i]);
            }
            requestList.WaitAll();
        }

        ReceiveRequest  intRecv   = (ReceiveRequest)requests[0];
        CompletedStatus intStatus = intRecv.Wait();

        if ((int)intRecv.GetValue() != expectedDatum ||
            intStatus.Source != expectedDatum ||
            intStatus.Tag != 0)
        {
            System.Console.Error.WriteLine("error in non-blocking receive of integer: got " + (int)intRecv.GetValue() + " from "
                                           + intStatus.Source + " on tag " + intStatus.Tag + ", expected " + expectedDatum);
            MPI.Environment.Abort(-1);
        }

        ReceiveRequest  strRecv   = (ReceiveRequest)requests[1];
        CompletedStatus strStatus = strRecv.Wait();

        if ((string)strRecv.GetValue() != expectedDatum.ToString() ||
            strStatus.Source != expectedDatum ||
            strStatus.Tag != 1)
        {
            System.Console.Error.WriteLine("error in non-blocking receive of string: got " + strRecv.GetValue() + " from "
                                           + strStatus.Source + " on tag " + strStatus.Tag + ", expected " + expectedDatum);
            MPI.Environment.Abort(-1);
        }

        ReceiveRequest  intArrayRecv   = (ReceiveRequest)requests[2];
        CompletedStatus intArrayStatus = intArrayRecv.Wait();

        if (intArrayRecv.GetValue() != intArrayRecvBuffer ||
            intArrayStatus.Source != expectedDatum ||
            intArrayStatus.Tag != 2)
        {
            System.Console.WriteLine("error: received into the wrong integer array");
            MPI.Environment.Abort(-1);
        }
        for (int i = 0; i <= expectedDatum; ++i)
        {
            if (intArrayRecvBuffer[i] != i)
            {
                System.Console.WriteLine("error: intArrayRecv[" + i + "] is " + intArrayRecvBuffer[i] + ", expected " + i);
                MPI.Environment.Abort(-1);
            }
        }

        ReceiveRequest  strArrayRecv   = (ReceiveRequest)requests[3];
        CompletedStatus strArrayStatus = strArrayRecv.Wait();

        if (strArrayRecv.GetValue() != strArrayRecvBuffer ||
            strArrayStatus.Source != expectedDatum ||
            strArrayStatus.Tag != 3)
        {
            System.Console.WriteLine("error: received into the wrong string array");
            MPI.Environment.Abort(-1);
        }
        for (int i = 0; i <= expectedDatum; ++i)
        {
            if (strArrayRecvBuffer[i] != i.ToString())
            {
                System.Console.WriteLine("error: strArrayRecv[" + i + "] is " + strArrayRecvBuffer[i] + ", expected " + i.ToString());
                MPI.Environment.Abort(-1);
            }
        }
    }