Exemplo n.º 1
0
        public override void main()
        {
            Trace.WriteLine(Rank + ": PARTITIONER (FETCH VALUES SOURCE) - START ");

            /* 1. Ler os elementos de Source_data, um a um, e copiar a chave (OMK) em Data_key.
             * 2. A cada chave de Source_data, chamar Partition_function.go();
             * 3. Enviar o resultado de Partition_function.go(), via MPI, para o gerente (unidade target).
             */

            int[] reducer_ranks = this.UnitRanks["reducer"];
            int   nr            = this.UnitSize["reducer"];

            Partition_function.NumberOfPartitions = nr;

            IIteratorInstance <IKVPair <OMK, OMV> > map_result_instance = (IIteratorInstance <IKVPair <OMK, OMV> >)Map_result.Instance;

            int count = 0;
            IKVPairInstance <OMK, OMV> last_item = null;

            object item_object;

            // 1. Ler os elementos de Source_data, um a um, e copiar a chave (OMK) em Data_key.
            while (map_result_instance.fetch_next(out item_object))
            {
                IKVPairInstance <OMK, OMV> item = (IKVPairInstance <OMK, OMV>)item_object;
                last_item = item;

                Data_key.Instance = item.Key;

                // 2. A cada chave de Source_data, chamar Partition_function.go();
                Partition_function.go();

                int i = (int)((IIntegerInstance)Partition_key.Instance).Value;

                Trace.WriteLine(Rank + ": PARTITIONER (FETCH VALUES SOURCE) LOOP - SEND TO " + reducer_ranks[i] + ", source rank is " + comm.Rank + ", count=" + (count++) + "i=" + i);

                comm.Send <IKVPairInstance <OMK, OMV> >(item, reducer_ranks[i], TAG_FETCHVALUES_OMV);
            }

            for (int i = 0; i < nr; i++)
            {
                comm.Send <IKVPairInstance <OMK, OMV> >(last_item, reducer_ranks[i], TAG_FETCHVALUES_OMV_FINISH);
            }


            Trace.WriteLine(Rank + ": PARTITIONER (FETCH VALUES SOURCE) - FINISH ");
        }
        public void sendORVsToTarget()
        {
            IIteratorInstance <ORV> source_data_instance = (IIteratorInstance <ORV>)Source_data.Instance;

            root = this.UnitRanks["target"][0];

            object orv, last_orv = null;

            Trace.WriteLine(WorldComm.Rank + ": START COMBINER SOURCE !!!");

            while (source_data_instance.fetch_next(out orv))
            {
                last_orv = orv;
                Trace.WriteLine(WorldComm.Rank + ": BEGIN SEND COMBINER SOURCE to " + root);
                comm.Send <object>(orv, root, TAG_COMBINER_ORV);
                Trace.WriteLine(WorldComm.Rank + ": END SEND COMBINER SOURCE to " + root);
            }

            Trace.WriteLine(WorldComm.Rank + ": BEGIN SEND FINISH COMBINER SOURCE to " + root);
            comm.Send <object>(last_orv, root, TAG_COMBINER_ORV_FINISH);
            Trace.WriteLine(WorldComm.Rank + ": END SEND FINISH COMBINER SOURCE to " + root);

            Trace.WriteLine(WorldComm.Rank + ": FINISH COMBINER SOURCE !!!");
        }
Exemplo n.º 3
0
        public override void main()
        {
            int count = 0;

            Trace.WriteLine(WorldComm.Rank + ": STARTING SCATTER SPLIT DATA SOURCE #1");

            Bin_function.NumberOfPartitions = this.UnitSize["target"];

            IIteratorInstance <IKVPair <IMK, IMV> > bins_instance = (IIteratorInstance <IKVPair <IMK, IMV> >)Bins.Instance;

            int[] rank_workers = this.UnitRanks["target"];

            Trace.WriteLine(WorldComm.Rank + ": STARTING SCATTER SPLIT DATA SOURCE #2");

            // 1. Ler os bins, um a um, do iterator, e enviá-los a cada mapper (unidades target) usando MPI.
            object bins_object;

            while (bins_instance.fetch_next(out bins_object))
            {
                Trace.WriteLine(WorldComm.Rank + ": LOOP BIN " + (bins_object == null));

                // Ler um bin.
                IKVPairInstance <IMK, IMV> bin = (IKVPairInstance <IMK, IMV>)bins_object;


                Trace.WriteLine(bin.Key.GetType() + " +++++ " + Key.Instance.GetType());

                // Recuperar a chave do bin.
                Key.Instance = bin.Key;

                // Descobre o rank do Mapper.
                Trace.WriteLine(WorldComm.Rank + ": BEFORE BIN FUNCTION " + bins_instance.GetHashCode());
                Bin_function.go();
                Trace.WriteLine(WorldComm.Rank + ": AFTER BIN FUNCTION");

                int i    = (int)((IIntegerInstance)Rank.Instance).Value;
                int rank = rank_workers[i];

                // Inicia o envio do bin para o Mapper.
                Trace.WriteLine(WorldComm.Rank + ": BEGIN SEND BIN KEY/VALUE to " + rank + "cont=" + (count++));
                comm.Send <object> (bin.Key, rank, TAG_SPLITTER_IMK);                 //Trace.WriteLine(WorldComm.Rank + ": SEND BIN KEY OK to " + rank);
                comm.Send <object> (bin.Value, rank, TAG_SPLITTER_IMV);               //Trace.WriteLine(WorldComm.Rank + ": SEND BIN VALUE OK to " + rank);
                Trace.WriteLine(WorldComm.Rank + ": END SEND BIN KEY/VALUE to " + rank + "cont=" + (count++));
            }

            Trace.WriteLine(Rank + ": FINISH LOOP SEND BINS !!!");

            // send "finish" message
            MPI.RequestList requests = new MPI.RequestList();

            foreach (int i in rank_workers)
            {
                Trace.WriteLine(WorldComm.Rank + ": BEGIN SEND BIN FINISH OK to " + i);
                MPI.Request request = comm.ImmediateSend <object> (0, i, TAG_SPLITTER_IMK_FINISH);
                Trace.WriteLine(WorldComm.Rank + ": END SEND BIN FINISH OK to " + i);

                requests.Add(request);
            }

            requests.WaitAll();
//			Trace.WriteLine(WorldComm.Rank + ": SEND BIN FINISH OK ALL ");

            //requestList.WaitAll();
        }