كيفية تقليل استخدام وحدة المعالجة المركزية للبرنامج؟

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

سؤال

لقد كتبت برنامجًا متعدد الخيوط يقوم ببعض العمليات الحسابية الثقيلة لوحدة المعالجة المركزية مع الكثير من عمليات الفاصلة العائمة.وبشكل أكثر تحديدًا، فهو برنامج يقارن تسلسلات الرسوم المتحركة إطارًا بإطار.أي.فهو يقارن بيانات الإطار من الرسوم المتحركة A مع جميع الإطارات في الرسوم المتحركة B، لجميع الإطارات في الرسوم المتحركة A.أقوم بتنفيذ هذه العملية المكثفة لمختلف الرسوم المتحركة بالتوازي، بحيث يمكن للبرنامج أن يعمل على زوج A-B، وزوج B-C، وزوج C-A بالتوازي.يستخدم البرنامج QtConcurrent ووظيفة "map" التي تقوم بتعيين حاوية بها حركات على وظيفة.يقوم QtConcurrent بإدارة مجموعة الخيوط بالنسبة لي، وأنا أعمل على معالج Intel Quad Core لذا فهو يولد 4 سلاسل رسائل.

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

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

المحلول

هناك بعض الإجابات الممتازة هنا.

أود فقط أن أضيف، من منظور القيام بالكثير من ضبط الأداء، ما لم يتم تحسين كل مؤشر ترابط بقوة، فمن المحتمل أن يكون لديه مساحة كبيرة لتقليل الدورة.

للتشبيه بسباق السيارات لمسافات طويلة، هناك طريقتان لمحاولة الفوز:

  1. جعل السيارة تسير بشكل أسرع
  2. قم بإجراء عدد أقل من التوقفات والرحلات الجانبية

من خلال تجربتي، فإن معظم البرامج كما تم كتابتها لأول مرة بعيدة تمامًا عن اتخاذ الطريق الأكثر مباشرة، خصوصاً عندما يصبح البرنامج كبيرًا.

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

الطريقة الشائعة للعثور على مشكلات الأداء هي استخدام ملفات التعريف.

ومع ذلك، فأنا أفعل هذا كثيرًا، وطريقتي هي كما يلي: http://www.wikihow.com/Optimize-Your-Program%27s-Performance

نصائح أخرى

وأجهزة رفع تردد التشغيل يمكن أن يؤدي إلى كل أنواع المشاكل غريبة. إذا كنت تشك في أن يكون السبب الجذري للمشكلة، في محاولة لعقارب الساعة في حدود معقولة وإعادة المحاولة الاختبارات الخاصة بك.

ويمكن أيضا أن يكون نوعا من الغريب جدا الذاكرة علة حيث كنت الفاسدين RAM الخاصة بك بطريقة فيها ويندوز (وانا اعتقد ان OS، بسبب الموت الزرقاء) لا يمكن استرداد بعد الآن (من المستبعد جدا، ولكن من يدري).

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

ولكن في البداية، أود أن ننظر في رفع تردد التشغيل، قضية ...

وهذا النوع من العملية التي وصفته بالفعل موازاة للغاية. تشغيل أكثر من وظيفة واحدة قد يكون في الواقع <م> يضر الأداء. والسبب في ذلك يرجع ذاكرة التخزين المؤقت من أي معالج غير محدودة الحجم، وكلما حاولت القيام في نفس الوقت، وحصة أصغر كل موضوع من ذاكرة التخزين المؤقت يصبح.

وكنت قد ننظر أيضا في خيارات باستخدام GPU الخاص بك لامتصاص بعض من حمل المعالجة. GPU الحديث هم إلى حد كبير أكثر كفاءة لمعظم أنواع التحول الفيديو من وحدة المعالجة المركزية الأجيال مماثلة.

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

وأظن أن هذا هو لأن جهاز الكمبيوتر الخاص بي هو فيركلوكيد.

وانها بالتأكيد ممكن. محاولة تعيين إلى السرعة العادية لفترة من الوقت.

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

ويمكن أن يكون هذا بسبب الطريقة I مشفرة برنامجي؟

وهناك برنامج يعمل في وضع المستخدم غير المرجح جدا أن يتسبب في الموت الزرقاء.

على سبيل التخمين، أود أن أقول أنك لا تقوم بتشغيل جهاز ثلاثي النواة (أو 4، في حالة الاستخدام بنسبة 100٪)، وأن التوازي سيضر بأدائك بشكل فعال إذا كنت تستخدم خيوطًا أكثر من النوى.قم بإنشاء مؤشر ترابط واحد فقط لكل نواة وحدة المعالجة المركزية، ومهما كان ما تفعله، لا يمكن أبدًا الوصول إلى البيانات بواسطة سلاسل رسائل مختلفة في نفس الوقت.إن خوارزميات قفل ذاكرة التخزين المؤقت في معظم وحدات المعالجة المركزية متعددة النواة ستؤدي إلى تدمير أدائك تمامًا.في هذه الحالة، في الرسوم المتحركة L-frame لمعالجة وحدة المعالجة المركزية N-core، سأستخدم الخيط 1 على الإطارات 0-(L/N)، والخيط 2 على الإطارات (L/N)-(2*L/N)، . ..الخيط N على الإطارات ((N-1)*L/N)-L.قم بإجراء المجموعات المختلفة (A-B، B-C، C-A) بالتسلسل حتى لا تقوم بفحص ذاكرة التخزين المؤقت الخاصة بك، كما يجب أن يكون التشفير أسهل.

كملاحظة جانبية؟حقيقي حساب مثله يجب أن تستخدم وحدة المعالجة المركزية بنسبة 100%، فهذا يعني أنها تسير بأسرع ما يمكن.

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

وانه من السهل جدا إلقاء اللوم على الأجهزة. أود أن أقترح عليك محاولة تشغيل البرنامج على نظام مختلف، ونرى كيف أن اتضح مع نفس البيانات.

وربما لديك علة.

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

وبمجرد الحصول عليها باستخدام SIMD، ثم ننظر إلى parallelizing. هذا يبدو وكأنه كنت يغلق وحدة المعالجة المركزية أيضا، لذلك يمكن ربما القيام ببعض ينام بدلا من الانتظار المزدحمة ربما، وتأكد من أنك تنظيف أو إعادة استخدام المواضيع بشكل صحيح.

مع عدم وجود رمز الخطأ الزرقاء (مفيد ليبحث متابعة) فمن الصعب قليلا لمساعدتك مع هذا واحد.

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

والنوم (1)؛ ستخفض استخدام وحدة المعالجة المركزية في نصف. جريت إلى نفس مشكلة في العمل مع خوارزمية مكثفة وحدة المعالجة المركزية.

إذا المعالج اثنين من النوى أو أكثر يمكن أن تذهب إلى مدير المهام والانتقال إلى العمليات وانقر بزر الماوس الأيمن على اسم البرنامج وانقر فوق Set affinity ووضع برنامج لاستخدام عدد أقل من النوى.

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

وأعتقد أن تسبب شاشة زرقاء من الموت عندما يحصل تلف منطقة الذاكرة النواة. وذلك باستخدام خاصية تعدد لتنفيذ عمليات موازية لا يمكن أن يكون السبب في ذلك.

وحسنا إذا كنت تقوم بإنشاء مواضيع متعددة يحمل كل عملية نقطة عائمة الثقيلة ثم بالتأكيد استخدام وحدة المعالجة المركزية الخاصة بك وسوف تصل لغاية 100٪.

وسيكون من الأفضل إذا كنت يمكن أن تعطي بعض النوم في كل موضوع بحيث عملية أخرى الحصول على بعض فرصة. يمكنك أيضا محاولة للحد من أولويات المواضيع.

إذا في منصة ويندوز، وضعت بعد بعض الأعمال مكالمة واحدة للعمل لإعلام CPU كنت تريد أن تجعل وحدة المعالجة المركزية إلى عمليات أخرى. إجراء مكالمة إلى النوم وظيفة من هذا القبيل:

Slepp (0)؛

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