コード例 #1
0
        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);
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
            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);
            }
コード例 #4
0
        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);
        }
コード例 #5
0
        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");
        }
コード例 #6
0
        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);
        }