Пример #1
0
        // Check that some queries run in parallel by default, and some require forcing.
        public static void WithExecutionMode(Labeled <ParallelQuery <int> > labeled, int count,
                                             Labeled <Action <ParVerifier, ParallelQuery <int> > > operation, ParallelExecutionMode mode)
        {
            ParVerifier verifier = new ParVerifier();

            operation.Item(verifier, labeled.Item.WithExecutionMode(mode));
            verifier.AssertPassed();
        }
Пример #2
0
        public static void RunPlinqModesTests()
        {
            if (Environment.ProcessorCount == 1)
            {
                // Test doesn't apply to DOP == 1.  It verifies that work is actually
                // happening in parallel, which won't be the case with DOP == 1.
                return;
            }

            Action <ParallelExecutionMode, Verifier>[] hardQueries =
            {
                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).Where(x => true).TakeWhile((x, i) => true).ToArray(),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).Where(x => true).TakeWhile((x, i) => true).Iterate(),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select((x,                                    i) => verifier.Verify(x)).Iterate(),
            };

            Action <ParallelExecutionMode, Verifier>[] easyQueries =
            {
                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,            1000).ToArray().AsParallel()
                .Select(x => verifier.Verify(x)).Take(100).WithExecutionMode(mode).ToArray(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                    1000).ToArray().AsParallel().WithExecutionMode(mode)
                .Take(100).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                           1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                          1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                                          i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                          1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                                          i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                              1000).AsParallel().WithExecutionMode(mode).AsUnordered()
                .Select(x => verifier.Verify(x)).Select((x,                                              i) => x).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,         1000).AsParallel().WithExecutionMode(mode).AsUnordered().Where(x => true).Select(x => verifier.Verify(x)).First(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                              1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).ToArray(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                              1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                                              1000).AsParallel().AsOrdered().WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x))
                .Concat(Enumerable.Range(0,                                                                               1000).AsParallel().AsOrdered().Where(x => true))
                .ToList(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                   1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                   1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,   1000)
                .OrderBy(x => x).Select(x => verifier.Verify(x)).WithExecutionMode(mode).ElementAt(5),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                                              1000).WithExecutionMode(mode)
                .OrderBy(x => x).Select((x,                                                              i) => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).OrderBy(x => x).Take(10000).Iterate(),
            };

            // Verify that all queries in 'easyQueries' run in parallel in default mode

            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.Default, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Easy query {0} expected to run in parallel in default mode", i));
                }
            }

            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Easy query {0} expected to run in parallel in force-parallelism mode", i));
                }
            }

            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < hardQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                hardQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Hard query {0} expected to run in parallel in force-parallelism mode", i));
                }
            }
        }
Пример #3
0
        internal static bool RunPlinqModesTests()
        {
            if (System.Linq.Parallel.Scheduling.GetDefaultDegreeOfParallelism() == 1)
            {
                Console.WriteLine("   - Test does not apply to the DOP=1 case.");
                return(true);
            }

            Action <ParallelExecutionMode, Verifier>[] hardQueries =
            {
                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).ToArray(),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).Iterate(),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).ToArray(),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).Iterate(),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                                                         verifier) => ParallelEnumerable.Range(0, 1000)
                .OrderBy(x => x).Select(x => verifier.Verify(x)).WithExecutionMode(mode).ElementAt(5),
            };

            Action <ParallelExecutionMode, Verifier>[] easyQueries =
            {
                (mode,                                                                        verifier) => ParallelEnumerable.Range(0,              1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).ToArray(),

                (mode,                                                                        verifier) => ParallelEnumerable.Range(0,              1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                        verifier) => Enumerable.Range(0, 1000).ToArray().AsParallel()
                .Select(x => verifier.Verify(x)).Take(100).WithExecutionMode(mode).ToArray(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                         1000).ToArray().AsParallel().WithExecutionMode(mode)
                .Take(100).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                        verifier) => ParallelEnumerable.Range(0,                                1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                                        verifier) => ParallelEnumerable.Range(0,                               1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                               i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                               1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                               i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                                   1000).AsParallel().WithExecutionMode(mode).AsUnordered()
                .Select(x => verifier.Verify(x)).Select((x,                                   i) => x).Iterate(),

                (mode,                                                                        verifier) => Enumerable.Range(0,         1000).AsParallel().WithExecutionMode(mode).AsUnordered().Where(x => true).Select(x => verifier.Verify(x)).First(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                   1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).ToArray(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                   1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).Iterate(),

                (mode,                                                                        verifier) => Enumerable.Range(0,                                                   1000).AsParallel().AsOrdered().WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x))
                .Concat(Enumerable.Range(0,                                                                    1000).AsParallel().AsOrdered().Where(x => true))
                .ToList(),
            };


            // Verify that all queries in 'easyQueries' run in parallel in default mode
            bool passed = true;

            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.Default, verifier);
                if (!verifier.Passed)
                {
                    passed = false;
                    Console.WriteLine("Easy query {0} expected to run in parallel in default mode", i);
                }
            }


            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    passed = false;
                    Console.WriteLine("Easy query {0} expected to run in parallel in force-parallelism mode", i);
                }
            }

            // Verify that all queries in 'easyQueries' run sequentially in default mode
            for (int i = 0; i < hardQueries.Length; i++)
            {
                Verifier verifier = new SeqVerifier();
                hardQueries[i].Invoke(ParallelExecutionMode.Default, verifier);
                if (!verifier.Passed)
                {
                    passed = false;
                    Console.WriteLine("Hard query {0} expected to run sequentially in default mode", i);
                }
            }

            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < hardQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                hardQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    passed = false;
                    Console.WriteLine("Hard query {0} expected to run in parallel in force-parallelism mode", i);
                }
            }

            return(passed);
        }
Пример #4
0
        public static void RunPlinqModesTests()
        {
            // I would assume that this gets the number of processors (ie. Environment.ProcessorCount)
            // but since we are trying to exclude dependencies that aren't part of the contract, we
            // can't use System.Runtime.Extensions.  So we had to remove this check.

            //            if (SchedulingProxy.GetDefaultDegreeOfParallelism() == 1)
            //            {
            //                Console.WriteLine("   - Test does not apply to the DOP=1 case.");
            //                return true;
            //            }

            Action <ParallelExecutionMode, Verifier>[] hardQueries =
            {
                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).Where(x => true).TakeWhile((x, i) => true).ToArray(),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).Where(x => true).TakeWhile((x, i) => true).Iterate(),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                          verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select((x,                                    i) => verifier.Verify(x)).Iterate(),
            };

            Action <ParallelExecutionMode, Verifier>[] easyQueries =
            {
                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .TakeWhile(x => true).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,            1000).ToArray().AsParallel()
                .Select(x => verifier.Verify(x)).Take(100).WithExecutionMode(mode).ToArray(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                    1000).ToArray().AsParallel().WithExecutionMode(mode)
                .Take(100).Select(x => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                           1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).ElementAt(5),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                          1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                                          i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                          1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).SelectMany((x,                                          i) => Enumerable.Repeat(1,                                                                                                                   2)).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                              1000).AsParallel().WithExecutionMode(mode).AsUnordered()
                .Select(x => verifier.Verify(x)).Select((x,                                              i) => x).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,         1000).AsParallel().WithExecutionMode(mode).AsUnordered().Where(x => true).Select(x => verifier.Verify(x)).First(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                              1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).ToArray(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                              1000).AsParallel().WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).OrderBy(x => x).Iterate(),

                (mode,                                                                                   verifier) => Enumerable.Range(0,                                                              1000).AsParallel().AsOrdered().WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x))
                .Concat(Enumerable.Range(0,                                                                               1000).AsParallel().AsOrdered().Where(x => true))
                .ToList(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                   1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                   1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).Take(100).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).ToArray(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                         1000).WithExecutionMode(mode)
                .Select(x => verifier.Verify(x)).TakeWhile(x => true).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,   1000)
                .OrderBy(x => x).Select(x => verifier.Verify(x)).WithExecutionMode(mode).ElementAt(5),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0,                                                              1000).WithExecutionMode(mode)
                .OrderBy(x => x).Select((x,                                                              i) => verifier.Verify(x)).Iterate(),

                (mode,                                                                                   verifier) => ParallelEnumerable.Range(0, 1000).WithExecutionMode(mode)
                .Where(x => true).Select(x => verifier.Verify(x)).OrderBy(x => x).Take(10000).Iterate(),
            };


            // Verify that all queries in 'easyQueries' run in parallel in default mode

            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.Default, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Easy query {0} expected to run in parallel in default mode", i));
                }
            }

            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < easyQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                easyQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Easy query {0} expected to run in parallel in force-parallelism mode", i));
                }
            }

            // Verify that all queries in 'easyQueries' always run in forced mode
            for (int i = 0; i < hardQueries.Length; i++)
            {
                Verifier verifier = new ParVerifier();
                hardQueries[i].Invoke(ParallelExecutionMode.ForceParallelism, verifier);
                if (!verifier.Passed)
                {
                    Assert.True(false, string.Format("Hard query {0} expected to run in parallel in force-parallelism mode", i));
                }
            }
        }