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
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()); }
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); }
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); } } }