配列を 2 つのリストに分割する並列アルゴリズムを C# で作成しました。1 つは特定の述語を満たす要素を含み、もう 1 つは述語を満たさない要素を含みます。これは順序保存アルゴリズムです。
以下のように書いていますが、ハードウェアの同時実行性から利益を得る機会を最大化する方法を知りたいです。
static void TestPLinqPartition(int cnt = 1000000)
{
Console.WriteLine("PLINQ Partition");
var a = RandomSequenceOfValuesLessThan100(cnt).ToArray();
var sw = new Stopwatch();
sw.Start();
var ap = a.AsParallel();
List<int> partA = null;
List<int> partB = null;
Action actionA = () => { partA = (from x in ap where x < 25 select x).ToList(); };
Action actionB = () => { partB = (from x in ap where !(x < 25) select x).ToList(); };
Parallel.Invoke(actionA, actionB);
sw.Stop();
Console.WriteLine("Partion sizes = {0} and {1}", partA.Count, partB.Count);
Console.WriteLine("Time elapsed = {0} msec", sw.ElapsedMilliseconds);
}