public Thread invoke(object action_id, Action reaction, out IActionFuture future) { int partner_size = channel.RemoteSize; int value = ActionDef.action_ids[action_id]; MPI.RequestList request_list = new MPI.RequestList(); for (int i = 0; i < partner_size; i++) { MPI.Request req = channel.ImmediateSend <object>(value, i, value); request_list.Add(req); } for (int i = 0; i < partner_size; i++) { MPI.ReceiveRequest req = channel.ImmediateReceive <object>(i, value); request_list.Add(req); } ManualResetEvent sync = new ManualResetEvent(false); ActionFuture future_ = new ActionFuture(request_list, sync); future = future_; Thread t = new Thread(new ThreadStart(() => handle_request(future_, sync, reaction))); t.Start(); return(t); }
public override void main() { int remote_size = channel.RemoteSize; while (true) { MPI.RequestList reqList = new MPI.RequestList(); int operation_tag = channel.Receive <int> (0, OPERATION_TAG); for (int client = 0; client < remote_size; client++) { MPI.ReceiveRequest req = channel.ImmediateReceive <Tuple <int, int, int, int, int, int> > (client, operation_tag); reqList.Add(req); } IList <MPI.Request> reqList_complete = reqList.WaitAll(); switch (operation_tag) { case OPERATION_1: handleOperation1(reqList_complete); break; case OPERATION_2: handleOperation2(reqList_complete); break; case OPERATION_3: handleOperation3(reqList_complete); break; case OPERATION_4: handleOperation4(reqList_complete); break; case OPERATION_5: handleOperation5(reqList_complete); break; case OPERATION_6: handleOperation6(reqList_complete); break; case OPERATION_7: handleOperation7(reqList_complete); break; } } }
private int[] takeResults(IList <MPI.Request> reqList_complete) { int[] result_values = new int[channel.RemoteSize]; foreach (MPI.Request req in reqList_complete) { if (req is MPI.ReceiveRequest) { MPI.ReceiveRequest recv_req = (MPI.ReceiveRequest)req; MPI.CompletedStatus status = recv_req.Wait(); int value = (int)recv_req.GetValue(); result_values [status.Source] = value; } } return(result_values); }
void handleOperation4(IList <MPI.Request> reqList_complete) { int[] arg1_values = new int[channel.RemoteSize]; int[] arg2_values = new int[channel.RemoteSize]; int[] arg3_values = new int[channel.RemoteSize]; int[] arg4_values = new int[channel.RemoteSize]; int[] arg5_values = new int[channel.RemoteSize]; int[] arg6_values = new int[channel.RemoteSize]; foreach (MPI.Request req in reqList_complete) { MPI.ReceiveRequest recv_req = (MPI.ReceiveRequest)req; MPI.CompletedStatus status = recv_req.Test(); Tuple <int, int, int, int, int, int> value = (Tuple <int, int, int, int, int, int>)recv_req.GetValue(); arg1_values [status.Source] = value.Item1; arg2_values [status.Source] = value.Item2; arg3_values [status.Source] = value.Item3; arg4_values [status.Source] = value.Item4; arg5_values [status.Source] = value.Item5; arg6_values [status.Source] = value.Item6; } IGather <int> arg1 = Gather <int> .create(channel, arg1_values); IReduce <int> arg2 = Reduce <int> .create(channel, arg2_values, sum, 0); IScan <int> arg3 = Scan <int> .create(channel, arg3_values, sum, 0); IGather <int> arg4 = Gather <int> .create(channel, arg4_values); IReduce <int> arg5 = Reduce <int> .create(channel, arg5_values, sum, 0); IScan <int> arg6 = Scan <int> .create(channel, arg6_values, sum, 0); int result = service.some_method_4(arg1, arg2, arg3, arg4, arg5, arg6); int[] broadcast_result = new int[channel.RemoteSize]; for (int i = 0; i < broadcast_result.Length; i++) { broadcast_result [i] = result; } returnResult(broadcast_result, OPERATION_4); }
public void invoke(object action_id) { int partner_size = channel.RemoteSize; int value = ActionDef.action_ids[action_id]; MPI.RequestList request_list = new MPI.RequestList(); for (int i = 0; i < partner_size; i++) { MPI.Request req = channel.ImmediateSend <object>(value, i, value); request_list.Add(req); } for (int i = 0; i < partner_size; i++) { MPI.ReceiveRequest req = channel.ImmediateReceive <object>(i, value); request_list.Add(req); } Console.WriteLine(channel.Rank + ": BEFORE WAIT ALL"); request_list.WaitAll(); Console.WriteLine(channel.Rank + ": AFTER WAIT ALL"); }
void handleOperation1(IList <MPI.Request> reqList_complete) { int[] arg1_values = new int[channel.RemoteSize]; int[] arg2_values = new int[channel.RemoteSize]; int[] arg3_values = new int[channel.RemoteSize]; int[] arg4_values = new int[channel.RemoteSize]; int[] arg5_values = new int[channel.RemoteSize]; int[] arg6_values = new int[channel.RemoteSize]; foreach (MPI.Request req in reqList_complete) { MPI.ReceiveRequest recv_req = (MPI.ReceiveRequest)req; MPI.CompletedStatus status = recv_req.Test(); Tuple <int, int, int, int, int, int> value = (Tuple <int, int, int, int, int, int>)recv_req.GetValue(); arg1_values [status.Source] = value.Item1; arg2_values [status.Source] = value.Item2; arg3_values [status.Source] = value.Item3; arg4_values [status.Source] = value.Item4; arg5_values [status.Source] = value.Item5; arg6_values [status.Source] = value.Item6; } IGather <int> arg1 = Gather <int> .create(channel, arg1_values); IReduce <int> arg2 = Reduce <int> .create(channel, arg2_values, sum, 0); IScan <int> arg3 = Scan <int> .create(channel, arg3_values, sum, 0); IGather <int> arg4 = Gather <int> .create(channel, arg4_values); IReduce <int> arg5 = Reduce <int> .create(channel, arg5_values, sum, 0); IScan <int> arg6 = Scan <int> .create(channel, arg6_values, sum, 0); service.some_method_1(arg1, arg2, arg3, arg4, arg5, arg6); }