/// <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);
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)}"); } }); }