/// <summary>
 ///
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="src"></param>
 /// <param name="sorter"></param>
 /// <param name="isFirst"></param>
 /// <returns></returns>
 public static IQueryable <T> ApplyOrderBy <T>(this IQueryable <T> src, QSorter sorter, bool isFirst = true) => src.ApplyOrderBy(sorter.PropName, sorter.IsAscending, isFirst);
Beispiel #2
0
        private static void MultiThreadedVol2(string[] args)
        {
            MPI.Environment.Run(ref args, communicator =>
            {
                //Initialize
                var inputFile  = args[0];
                var outputFile = args[1];

                var sorter    = new QSorter(communicator);
                var isManager = communicator.Rank == 0;

                int[] result = null;

                //Send array parts to workers
                if (isManager)
                {
                    var array   = ReaderWriter.Read(inputFile);
                    var qsArray = new QSArray(array);

                    sorter.InitializeWithData(qsArray);
                }
                else
                {
                    sorter.InitializeWithData(null);
                }

                //Parallel QSort
                using (var performanceCounter = new PerformanceCounter($"Execution time [{communicator.Rank}]: "))
                {
                    while (true)
                    {
                        if (sorter.LastInGroup)
                        {
                            sorter.Sort();
                            break;
                        }

                        sorter.PivotBroadcast();
                        sorter.PartitionAndPartsExchange();
                        sorter.GroupHalfToSubGroup();
                    }

                    sorter.SendWorkResult();

                    //Collect all parts together
                    if (isManager)
                    {
                        result = sorter.MergeDataFromWorkers();
                    }
                }

                //Write to output file
                if (isManager)
                {
                    var list = result.ToList();
                    ReaderWriter.Write(outputFile, list);

                    //Console.WriteLine($"Verified: {Verify(list, inputFile)}");
                }
            });
        }