هل مهمة موازية مكتبة (أو PLINQ) تأخذ عمليات أخرى في الاعتبار ؟

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

  •  28-09-2019
  •  | 
  •  

سؤال

ولا سيما أنا أبحث في استخدام TPL لبدء (وانتظر) العمليات الخارجية.لا TPL انظر مجموع آلة الحمل (كل من وحدة المعالجة المركزية و I/O) قبل أن تقرر أن تبدأ مهمة أخرى (وبالتالي-في حالتي-خارجي آخر العملية) ؟

على سبيل المثال:

لدي حوالي 100 ملفات الوسائط التي تحتاج إلى ترميز أو المحولة (مثلا ، من WAV إلى FLAC أو من FLAC الى MP3).الترميز يتم من خلال إطلاق عملية خارجية (على سبيل المثالFLAC.EXE أو LAME.EXE).كل ملف يستغرق حوالي 30 ثانية.كل عملية هي في معظمها منضم CPU ولكن هناك بعض I/O في هناك.أنا عندي 4 النوى حتى أسوأ الأحوال (الشفرة عن طريق الأنابيب في فك التشفير) لا يزال يستخدم فقط 2 النوى.أريد أن أفعل شيئا مثل:

Parallel.ForEach(sourceFiles,
    sourceFile =>
        TranscodeUsingPipedExternalProcesses(sourceFile));

سوف تنطلق 100 المهام (وبالتالي 200 العمليات الخارجية تتنافس على وحدة المعالجة المركزية)?أم أنها ترى أن وحدة المعالجة المركزية مشغول فقط 2-3 في وقت واحد ؟

هل كانت مفيدة؟

المحلول

أنت ذاهب لتشغيل في بعض المسائل هنا.المجاعة تجنب آلية جدولة سوف نرى المهام الخاصة بك كما منعت لأنها الانتظار على العمليات.وسوف تجد أنه من الصعب التمييز بين طريق مسدود موضوع واحد ببساطة انتظار لإكمال العملية.ونتيجة لذلك قد جدولة المهام الجديدة إذا كانت المهام المدى أو طويلة (انظر أدناه).على hillclimbing مجريات الأمور يجب أن تأخذ بعين الاعتبار العبء الكلي على النظام ، سواء من التطبيق الخاص بك وغيرها.ببساطة يحاول تحقيق أقصى قدر من العمل القيام به ، لذلك فإنه سيتم إضافة المزيد من العمل حتى عام الإنتاجية من توقف النظام عن زيادة ثم سوف تتراجع.لا أعتقد هذا سوف يؤثر على التطبيق الخاص بك ولكن stavation تجنب المسألة على الارجح.

يمكنك أن تجد المزيد من التفاصيل عن كيف يعمل كل هذا في البرمجة المتوازية مع Microsoft®.صافي, كولين كامبل, رالف جونسون ، Ade ميلر ، ستيفن Toub (مشروع سابق هو على الانترنت).

"، .صافي بركة موضوع تلقائيا يدير عدد من العمال المواضيع في حوض السباحة.فإنه يضيف ويزيل المواضيع وفقا المدمج في والاستدلال.على .صافي تجمع مؤشرات الترابط اثنين من الآليات الرئيسية عن طريق الحقن المواضيع:الجوع-تجنب آلية يضيف عامل المواضيع إذا كان لا يرى التقدم المحرز على قائمة الانتظار اذا hillclimbing الكشف عن مجريات الأمور التي يحاول تحقيق أقصى قدر من الإنتاجية في حين باستخدام بعض المواضيع ممكن.

الهدف من المجاعة الإبطال هو منع الجمود.هذا النوع من الجمود يمكن أن تحدث عندما يكون مؤشر ترابط العامل ينتظر التزامن الحدث الذي لا يمكن إلا أن يكون راضيا عن طريق عنصر العمل الذي لا يزال معلقا في تجمع مؤشرات الترابط العالمي أو المحلي قوائم الانتظار.إذا كان هناك ثابت عدد مؤشرات ترابط worker, و كل من هذه المواضيع كذلك حظر النظام لن يتمكن أي وقت مضى من إحراز مزيد من التقدم.إضافة عامل جديد موضوع يحل المشكلة.

الهدف من تسلق تلة ارشادي لتحسين استخدام من النوى عندما المواضيع يتم حظرها من قبل I/O أو غيرها من شروط الانتظار أن المماطلة المعالج.بشكل افتراضي ، المدارة بركة موضوع واحد عامل موضوع في الصميم.إذا كان واحد من هذه المواضيع عامل يصبح منعت هناك فرصة أن النواة قد تكون غير مستغلة ، اعتمادا على الكمبيوتر عموما عبء العمل.موضوع الحقن المنطق لا يميز بين الخيط الذي حظر على الموضوع هذا المنفذ طويلة مكثفة المعالج العملية.لذلك ، كلما تجمع مؤشرات الترابط العالمية أو المحلية تحتوي على قوائم الانتظار المعلقة عناصر العمل, نشط العمل العناصر التي تأخذ وقت طويل المدى (أكثر من والنصف الثاني) يمكن أن تؤدي إلى إنشاء مؤشر ترابط جديد تجمع العمال المواضيع.

على .صافي تجمع مؤشرات الترابط فرصة لحقن كل المواضيع الوقت عنصر عمل يكمل أو 500 ميلي ثانية واحدة فترات ، أيهما أقصر.تجمع مؤشرات الترابط يستخدم هذه الفرصة حاول إضافة المواضيع (أو يأخذهم بعيدا) ، مسترشدة ردود الفعل من التغييرات السابقة في عدد مؤشر الترابط.إذا إضافة المواضيع يبدو أن تساعد الإنتاجية ، تجمع مؤشرات الترابط يضيف أكثر من ذلك ؛ وإلا فإنه يقلل من عدد المواضيع عامل.هذا الأسلوب يسمى تسلق تلة الكشف عن مجريات الأمور.ولذلك سبب واحد للحفاظ على المهام الفردية قصيرة لتجنب التجويع "الكشف" ، ولكن هناك سبب آخر للحفاظ على القصير هو تعطي الخيط تجمع المزيد من الفرص لتحسين الإنتاجية من خلال ضبط عدد الصفحات.أقصر مدة الفردية مهام أكثر في كثير من الأحيان تجمع مؤشرات الترابط يمكن قياس الإنتاجية ، ضبط عدد الصفحات وفقا لذلك.

لجعل هذا الخرسانة تعتبر مثالا صارخا.لنفترض أن يكون لديك المالية المعقدة محاكاة مع 500 مكثفة المعالج العمليات, كل واحدة منها تستغرق عشر دقائق في المتوسط لإكمال.إذا قمت بإنشاء أعلى مستوى المهام في طابور العالمية لكل هذه العمليات سوف تجد أنه بعد حوالي خمس دقائق تجمع الموضوع سوف تنمو إلى 500 عامل المواضيع.والسبب هو أن تجمع مؤشرات الترابط يرى كل المهام كما منعت ويبدأ في إضافة جديدة المواضيع في معدل ما يقرب من المواضيع في الثانية.

ما هو الخطأ مع 500 عامل المواضيع ؟ من حيث المبدأ, لا شيء, إذا لديك 500 النوى لهم استخدام كميات هائلة من النظام الذاكرة.في الواقع, هذه هي الرؤية طويلة الأجل الحوسبة المتوازية.ومع ذلك ، إذا لم يكن لديك أن الكثير من النوى على جهاز الكمبيوتر الخاص بك في الحالة التي يكون فيها العديد من المواضيع يتنافسون على الوقت شرائح.هذا الوضع كما هو معروف المعالج الاكتتاب.مما يتيح العديد من معالج مكثف المواضيع للتنافس على الوقت على جوهر واحد يضيف سياق التحول النفقات العامة التي يمكن الحد بشدة من النظام العام الإنتاجية.حتى لو كنت لا ينفد من الذاكرة والأداء في هذا يمكن أن يكون الوضع أسوأ بكثير مما كانت عليه في متتابعة حسابية.(كل سياق التبديل ما بين 6000 و 8000 من دورات المعالج.) تكلفة سياق التحول ليس المصدر الوحيد من النفقات العامة.تمكنت موضوع في .صافي يستهلك تقريبا ميغا بايت من المكدس الفضاء, ما إذا كان أو لا هذا الفضاء يستخدم حاليا تنفيذ المهام.فإنه يأخذ حوالي 200 ، 000 دورات وحدة المعالجة المركزية إلى إنشاء موضوع جديد ، حوالي 100 ، 000 دورات للتقاعد الموضوع.هذه هي تكلفة العمليات.

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

الخيار الأول هو أن تتحلل التطبيق الخاص بك في أقصر المهام التي تكمل سريع بما فيه الكفاية بالنسبة تجمع مؤشرات الترابط بنجاح السيطرة على عدد من المواضيع للحصول على أفضل إنتاجية.الاحتمال الثاني هو تنفيذ الخاصة بك جدولة المهام الكائن التي لا تؤدي موضوع الحقن.إن المهام الخاصة بك طويلة مدة لا تحتاج الأمثل للغاية "جدولة المهام" لأن تكلفة جدولة ستكون ضئيلة مقارنة التنفيذ وقت المهمة.MSDN® مطور البرنامج مثال بسيطة "جدولة المهام" تنفيذ حدود أقصى درجة من التزامن.للحصول على مزيد من المعلومات ، راجع القسم "مزيد من القراءة" ، في نهاية هذا الفصل.

كملاذ أخير يمكنك استخدام SetMaxThreads طريقة تكوين ThreadPool الدرجة مع الحد الأعلى لعدد من المواضيع عامل ، وعادة ما يساوي عدد النوى (هذا هو البيئة.ProcessorCount الملكية).وهذا الحد الأقصى ينطبق على العملية بأكملها ، بما في ذلك جميع AppDomains."

نصائح أخرى

الجواب القصير هو لا.

داخليًا ، يستخدم TPL المعيار ThreadPool لجدولة مهامها. لذلك أنت تسأل في الواقع ما إذا كان ThreadPool يأخذ تحميل الجهاز في الاعتبار ولا. الشيء الوحيد الذي يحد من عدد المهام في وقت واحد هو عدد المواضيع في تجمع الخيوط ، لا شيء آخر.

هل من الممكن تقديم تقرير العمليات الخارجية إلى طلبك بمجرد استعدادها؟ في هذه الحالة ، لا يتعين عليك انتظارهم (الحفاظ على المواضيع المشغولة).

قم بإجراء اختبار باستخدام TPL/ThreadPool لتحديد موعد عدد كبير من المهام التي تقوم بالدورات المقطوعة. باستخدام تطبيق خارجي ، قمت بتحميل أحد النوى إلى 100 ٪ باستخدام Proc Affinity. عدد المهام النشطة لم ينخفض.

والأفضل من ذلك ، قمت بتشغيل حالات متعددة من نفس تطبيق CPU المكثف .NET TPL. كان عدد المواضيع لجميع التطبيقات هو نفسه ، ولم يقل عن عدد النوى ، على الرغم من أن أجهزتي كانت بالكاد قابلة للاستخدام.

لذا ، بصرف النظر عن النظرية ، يستخدم TPL عدد النوى المتاحة ، ولكن لا تتحقق أبدًا من تحميلها الفعلي. تطبيق ضعيف للغاية في رأيي.

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