تحسينات لا ينفصل عن حلقة وحدة المعالجة المركزية الحديثة

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

  •  28-09-2019
  •  | 
  •  

سؤال

من http://www.boost.org/community/implementation_variationss.html

"... من غير المرجح أن تحدث اختلافات الترميز مثل تغيير فئة من الأعضاء الظاهري إلى الأعضاء غير الذروة أو إزالة مستوى من عدم الاتجاه تسلسلات الكود المنافسة في نفس عدد دورات الساعة! "

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

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

المحلول

التخزين المؤقت (على سبيل المثال فرع الهدف التخزين المؤقت) ، وحدات التحميل الموازية (جزء من خطوط الأنابيب ، ولكن أيضًا أشياء مثل "Hit Under Miss" والتي لا تتوقف خط الأنابيب) ، و التنفيذ خارج الترتيب من المحتمل أن تساعد في تحويل أ load-load-branch في شيء أقرب إلى ثابت branch. تعليمات قابلة للطي/القضاء (ما هو المصطلح المناسب لهذا؟) في مرحلة التنبؤ أو الفرع في خط الأنابيب قد يساهم أيضًا.

كل هذا يعتمد على الكثير من الأشياء المختلفة ، على الرغم من: كم عدد الأهداف المختلفة الموجودة (على سبيل المثال ، كم عدد الأحمال الافتراضية المختلفة التي من المرجح أن تؤديها) ، كم عدد الأشياء التي تحلقها (هل تخزين ذاكرة التخزين المؤقت المستهدف الفرعية "دافئة"؟ ماذا عن icache/dcache؟) ، كيف يتم وضع الجداول الافتراضية أو جداول الاتجاه في الذاكرة (هل هي صديقة للذاكرة ذاكرة التخزين المؤقت ، أم أن كل حمولة vtable جديدة ربما تفسد vtable القديم؟) ، هل يتم إبطال ذاكرة التخزين المؤقتة بشكل متكرر بسبب متعددة البونج ponging ، وما إلى ذلك ...

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

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


يحرر:

كما يشير هانز باسانت في تعليق أعلاه تحسينات لا ينفصل عن حلقة وحدة المعالجة المركزية الحديثة, ، مفتاح الحصول على هذين الأمرين لاتخاذ نفس الوقت هو القدرة على "التقاعد" بفعالية أكثر من تعليمات لكل دورة. يمكن أن يساعد التخلص من التعليمات في هذا ، ولكن تصميم superscalar من المحتمل أن يكون أكثر أهمية (Hit Under Miss هو مثال صغير ومحدد للغاية ، فقد تكون وحدات التحميل الزائدة تمامًا أفضل).

لنأخذ موقفًا مثاليًا ، ونفترض أن الفرع المباشر هو مجرد تعليمات واحدة:

branch dest

... وفرع غير مباشر هو ثلاثة (ربما يمكنك الحصول عليه في اثنين ، لكنه أكبر من واحد):

load vtable from this
load dest from vtable
branch dest

دعنا نفترض موقفًا مثاليًا تمامًا: *هذا و VTABLE بالكامل في ذاكرة التخزين المؤقت L1 ، فإن ذاكرة التخزين المؤقت L1 سريعة بما يكفي لدعم دورة واحدة لكل تكلفة تعليمية للحملتين. (يمكنك حتى أن تفترض أن المعالج أعاد ترتيب الأحمال وتواصل معها مع تعليمات سابقة لإتاحة الوقت لك لإكمالها قبل الفرع ؛ لا يهم هذا المثال تكلفة التدفق للفرع ، وتنخفض تعليمات الفرع إلى دورة واحدة (مطفأة).

ال الحد الأدنى النظري الوقت للمثال الأول هو دورة واحدة (تم إطفاؤها).

الحد الأدنى النظري للمثال الثاني ، التخلص من التعليمات الغائبة أو الوحدات الوظيفية الزائدة أو أي شيء يسمح بالتقاعد أكثر من تعليمات لكل دورة ، هو 3 دورات (هناك 3 تعليمات)!

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

بمجرد حصولك على ذلك ، يصبح الحد الأدنى لكلا الأمثلة شيئًا ما بين 0 و 1 دورة ، مرة أخرى ، شريطة أن يكون كل شيء آخر مثاليًا. يمكن القول أنه يجب أن يكون لديك المزيد من الظروف المثالية للمثال الثاني للوصول فعليًا إلى الحد الأدنى النظري من المثال الأول ، ولكن هذا ممكن الآن.

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

... هذا هو المكان الذي يأتي فيه التنميط ، وهي فكرة جيدة بشكل عام على أي حال.

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

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

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

نصائح أخرى

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

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

تستخدم وحدات المعالجة المركزية الحديثة تقنية التنبؤ بالفرع التكيفي والتي يمكن أن تتنبأ بالعديد من القفزات غير المباشرة مثل تنفيذ vtable للوظائف الافتراضية. نرى http://en.wikipedia.org/wiki/branch_prediction#prediction_of_indirect_jumps

إذا كانت وحدة المعالجة المركزية لديها بالفعل عنوان الذاكرة في ذاكرة التخزين المؤقت ، فإن تنفيذ تعليمات التحميل يكون تافهًا ، إذا كان ذلك.

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