سؤال

أقوم بإنشاء بعض الرموز المفروضة ديناميكيًا في برنامج التحويل البرمجي JIT وأبحث عن إرشادات لمحاذاة OPCODE.

1) لقد قرأت التعليقات التي "يوصي" بإيجاز عن طريق إضافة NOPs بعد المكالمات

2) لقد قرأت أيضًا عن استخدام NOP لتحسين التسلسلات للتوازي.

3) لقد قرأت أن محاذاة OPS جيدة لأداء "ذاكرة التخزين المؤقت"

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

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

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

المحلول

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

ستقوم وحدة المعالجة المركزية الحديثة بترجمة OPS الخاصة بك ISA micro-ops على أي حال. قد يجعل هذا تقنيات المحاذاة الكلاسيكية أقل أهمية ، حيث من المفترض أن تتجاهل Transcromer micro-operation من NOPs ويغير كل من حجم ومواءمة OPS السرية.

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

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

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

فيما يتعلق بفصل الإرشادات الموجودة في الخط التي لا تكون أهدافًا فرعية مع NOPs ، هناك أسباب قليلة للقيام بذلك على وحدة المعالجة المركزية الحديثة. (كان هناك وقت كانت فيه آلات RISC فتحات التأخير مما أدى في كثير من الأحيان إلى إدخال NOPs بعد نقل التحكم.) من السهل فك تشفير دفق التعليمات ، وإذا كان للهندسة المعمارية OPS بطول بايت ، فيمكنك التأكد من فك تشفيرها بشكل معقول.

نصائح أخرى

أفضل مصدر لجميع هذه التحسينات الصغيرة هو أدلة التحسين X86 من Agner Fog. يجب أن تحتوي هذه المستندات على كل ما تحتاجه ، ثم بعضها. قون

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

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