لماذا PLINQ استخدام اثنين فقط من المواضيع؟

StackOverflow https://stackoverflow.com/questions/1812657

  •  06-07-2019
  •  | 
  •  

سؤال

ويقول لدي مهمة متجهة الى IO. أنا باستخدام WithDegreeOfParallelism = 10 وWithExecution = ForceParallelism الوضع، ولكن لا يزال الاستعلام يستخدم سوى اثنين من المواضيع. لماذا؟

وأنا أفهم سوف PLINQ عادة اختيار درجة التوازي يساوي حساباتي الأساسية، ولكن لماذا لا تتجاهل طلبي محدد لأعلى التوازي؟

static void Main(string[] args)
{
    TestParallel(0.UpTo(8));
}

private static void TestParallel(IEnumerable<int> input)
{
    var timer = new Stopwatch();
    timer.Start();
    var size = input.Count();

    if (input.AsParallel().
        WithDegreeOfParallelism(10).
        WithExecutionMode(ParallelExecutionMode.ForceParallelism).
        Where(IsOdd).Count() != size / 2)
        throw new Exception("Failed to count the odds");

    timer.Stop();
    Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
}

private static bool IsOdd(int n)
{
    Thread.Sleep(1000);
    return n%2 == 1;
}
هل كانت مفيدة؟

المحلول

وPLINQ يحاول العثور على العدد الأمثل من المواضيع لأداء ما تريد أن تفعله في أسرع وقت ممكن، إذا كان لديك سوى 2 النوى على وحدة المعالجة المركزية الخاصة بك، هو أن عدد الأرجح 2. إذا كان لديك رباعية النوى، لك سيكون من المرجح أن نرى 4 المواضيع تظهر، ولكن خلق 4 المواضيع على جهاز ثنائية النواة لن حقا تحسين الأداء لأنه فقط 2 المواضيع يمكن أن تكون نشطة في نفس الوقت.

وأيضا، مع العمليات القائمة IO، فمن المرجح أن أي المواضيع الإضافية التي تمنع ببساطة على عملية IO الأولى التي يؤدونها.

نصائح أخرى

و10 هو الحد الأقصى

<اقتباس فقرة>   

ويضبط درجة التوازي لاستخدام   في استعلام. درجة التوازي هي   الحد الأقصى لعدد بالتزامن   المهام المنفذة التي سيتم استخدامها ل   معالجة الاستعلام.

من هنا:

MSDN

ويبدو PLINQ الإيقاعات عدد من المواضيع. عندما كنت ملفوفة رمز أعلاه في (الحقيقية) حلقة في حين، استغرق أول التكرار اثنين من ثانيتين لتشغيل، ولكن الثالث وفوق استغرق ثانية واحدة فقط. فهم PLINQ النوى عاطلة وزاد من عدد من المواضيع. مثير للإعجاب!

وأود أن توافق على روري، إلا IO. لم تختبر مع قرص IO، ولكن شبكة IO نهائيا قد يكون أكثر فعالية مع المزيد من المواضيع، من هناك النوى على وحدة المعالجة المركزية.

والاختبار البسيط (سيكون من الأصح لتشغيل اختبار مع كل موضوع الاعتماد عدة مرات، وسرعة الشبكة ليست ثابتة، ولكن لا يزال) لإثبات أن:

    [Test]
    public void TestDownloadThreadsImpactToSpeed()
    {
        var sampleImages = Enumerable.Range(0, 100)
            .Select(x => "url to some quite large file from good server which does not have anti DSS stuff.")
            .ToArray();            

        for (int i = 0; i < 8; i++)
        {
            var start = DateTime.Now;
            var threadCount = (int)Math.Pow(2, i);
            Parallel.For(0, sampleImages.Length - 1, new ParallelOptions {MaxDegreeOfParallelism = threadCount},
                         index =>
                             {
                                 using (var webClient = new WebClient())
                                 {
                                     webClient.DownloadFile(sampleImages[index],
                                                            string.Format(@"c:\test\{0}", index));
                                 }
                             });

            Console.WriteLine("Number of threads: {0}, Seconds: {1}", threadCount, (DateTime.Now - start).TotalSeconds);
        }
    }

والنتيجة مع صورة 500x500px من CDN باستخدام 8 الأساسية آلة مع SSD كان:

<اقتباس فقرة>   

وعدد من المواضيع: 1، ثانية: 25.3904522
  عدد المواضيع: 2، ثانية: 10.8986233
  عدد المواضيع: 4، ثانية: 9.9325681
  عدد المواضيع: 8، ثانية: 3.7352137
  عدد المواضيع: 16، ثانية: 3.3071892
  عدد المواضيع: 32، ثانية: 3.1421797
  عدد المواضيع: 64، ثانية: 3.1161782
  عدد المواضيع: 128، ثانية: 3.7272132

وآخر نتيجة لديه مثل هذا الوقت أعتقد أولا لأن لدينا لتحميل فقط 100 الصور :)

وفروق التوقيت باستخدام 8-64 المواضيع ليست كبيرة، ولكن هذا في 8 آلة الأساسية. إذا كان 2 آلة الأساسية (رخيصة إندوسر دفتر)، وأعتقد أن اضطر إلى استخدام 8 المواضيع سيكون له تأثير أكبر، من يوم 8 آلة لب مما اضطر لاستخدام 64 المواضيع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top