الذاكرة منخفضة الإنتاجية في لينكس جزءا لا يتجزأ من ( الذراع )

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

  •  05-07-2019
  •  | 
  •  

سؤال

أنا باستخدام ARM926EJS.أنا على الحصول على 20 % من سرعة الذاكرة في الذاكرة نسخ الاختبار ، دون لينكس ( تماما كما بدأت القابل للتنفيذ).لكن في لينكس نفس كود تشغيل 20 ٪ أبطأ.

رمز

 
/// Below code just performs burst mode memcopy test.        
void asmcpy(void *a, void *b, int iSize)
{
   do
  {
    asm volatile (
             "ldmia %0!, {r3-r10} \n\t"
             "stmia %0!, {r3-r10} \n\t"
             :"+r"(a), "+r"(b)
             :
             :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9),"r"(r10)
             );
  }while(size--)
}

أنا التحقق من أن أي عملية أخرى يأخذ وقت وحدة المعالجة المركزية على لينكس.( راجعت هذا مع استخدام الأوامر في الوقت ، فإنه يدل على في الوقت الحقيقي هو نفس usr الوقت)

من فضلك قل لي ما يمكن أن يكون مشكلة مع لينكس ؟

مع الشكر و التقدير.

وأضاف:

اختباري رمز

int main()
{
  int a[320 * 120], b[320 * 120];

 for(int i=0; i != 10000; i++)
 {
   /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration
   asmcpy(a, b, (320 * 120) / 8);
 }
}

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

وأضاف.

أنا لم أر مثل هذا الفارق في الأداء في المعالجات الأخرى.كانوا يستخدمون SD RAM, هذا المعالج باستخدام DDR Ram.يمكن أن يكون السبب ؟

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

وأضاف:بلدي متحكم LPC3250.كل اختبار يتم اختبارها على نفسها الخارجية DDR RAM.

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

المحلول

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

إذا كان النظام الخاص بك هو صغير بما فيه الكفاية ، في محاولة MMU-أقل نسخة من لينكس (مثل uClinux).ربما كان من شأنها أن تتيح لك استخدام أرخص رقاقة مع أداء مماثل.جزءا لا يتجزأ من أنظمة, كل قرش.

تحديث: بعض تفاصيل إضافية:

كل لينكس عملية يحصل على ذاكرة تعيينات في أول هذه تشمل فقط النواة و (ربما) التعليمات البرمجية القابلة للتنفيذ.كل ما تبقى من الخطية 4GB (على 32bit) يبدو المتاحة ، ولكن ليس هناك ذاكرة الوصول العشوائي الصفحات المخصصة لها.بمجرد قراءة أو كتابة غير عنوان الذاكرة ، MMU إشارات صفحة خطأ ومفاتيح النواة.نواة يرى أنه لا يزال لديه الكثير من ذاكرة الوصول العشوائي الحرة صفحات, لذلك يختار واحد يسند إلى معيبا نقطة ويعود إلى التعليمات البرمجية الخاصة بك ، والذي ينتهي توقف التعليمات.التالي لن تفشل لأن كل صفحة (عادة 4KB) هو بالفعل قبله ؛ ولكن عدد قليل من التكرارات في وقت لاحق, وسوف تصل أخرى غير المسندة الفضاء ، MMU سوف تحتج نواة مرة أخرى.

نصائح أخرى

كيف حالك أداء التوقيت ؟ لا يوجد توقيت الكود في المثال الخاص بك.

هل أنت متأكد من أن كنت لا قياس عملية تحميل/تفريغ الوقت ؟

هو سرعة ساعة المعالج نفسه في كل الحالات ؟

إذا باستخدام الخارجية SDRAM هي ذاكرة الوصول العشوائي التوقيت نفسه في كل الحالات ؟

هو ذاكرة التخزين المؤقت البيانات ممكنة في كل الحالات ؟

كليفورد

الشروع في العمل ليس "فقط قابل للتنفيذ".يجب أن يكون هناك بعض التعليمات البرمجية تعيين نزع السلاح والتسريح وإعادة الإدماج تحكم تسجيل.

إذا كانت ذاكرة التخزين المؤقت تمكين أيضا, إذن يجب أن يكون MMU.أعتقد على ARM926EJS, لا يمكنك الحصول على بيانات ذاكرة التخزين المؤقت دون MMU.

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

هنا ورقة مع بعض الارتفاع في تكلفة VIVT مسح ذاكرة التخزين المؤقت عند تشغيل لينكس

ما متحكم (ليس فقط ما تسليح وحدة المعالجة المركزية) الذي تستخدمه ؟

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

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