اقترحوا تضمين تطبيق Linux kernel أسرع بأربع مرات من memchr

مؤخرا تم إصدار اقتراح لنواة Linux، حيث يُقترح تضمين مجموعة من التصحيحات بامتداد التنفيذ الأمثل لوظيفة memchr () تستخدم للبحث عن حرف في المصفوفة.

تقوم الدالة memchr () بمسح البايتات البادئة من مساحة الذاكرة المشار إليها بواسطة s لأول مثيل لـ c. يتم تفسير كل من c والبايتات في منطقة الذاكرة المشار إليها بـ s على أنها أحرف غير موقعة.

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

على عكس الإصدار السابق ، الذي استخدم مقارنة بايت، يتم إنشاء التطبيق المقترح مع الأخذ في الاعتبار الاستخدام الكامل لسجلات وحدة المعالجة المركزية 64 بت و 32 بت. بدلاً من البايت ، تتم المقارنة باستخدام كلمات الآلة ، مما يسمح بمقارنة 4 بايت على الأقل في كل مرة.

قامت هذه السلسلة من التصحيحات بتحسين "memchr ()" وإضافة ماكرو لـ
"memchr_inv ()" بحيث يمكن لكلتا الوظيفتين استخدامه لإنشاء قناع بت.

يعتمد التنفيذ الأصلي لـ "memchr ()" على مقارنة البايت ،
الذي لا يستخدم بشكل كامل تسجيل 64 أو 32 بت في وحدة المعالجة المركزية. نحن ننفذ أ
مقارنة بالكلمات بحيث يمكن مقارنة 4 بايت على الأقل بنفس الشيء
طقس. تعد memchr () المحسّنة أسرع بنحو 4 مرات من النسخة الأصلية
لسلاسل طويلة. في Linux Kernel ، نجد أن طول السلسلة
البحث عن "memchr ()" يصل إلى 512 بايت في driver / misc / lkdtm / heap.c.

عند البحث على سلاسل كبيرة ، تبين أن الإصدار الجديد أسرع بنحو 4 مرات من الإصدار القديم (على سبيل المثال ، لسلاسل من 1000 حرف). بالنسبة للسلاسل الصغيرة ، فإن كفاءة التنفيذ الجديد ليست بنفس الأهمية ، لكنها لا تزال أعلى من الإصدار الأصلي.

الشيء المثير للاهتمام في الاقتراح الجديد هو تحسين السلاسل الكبيرة ، مما يحسن الأوقات بشكل كبير. الجدير بالذكر أنه في نواة لينكس ، يصل حجم السلاسل التي تمت معالجتها في memchr () إلى 512 بايت. في اختباراتنا ، كسب الأداء لسلاسل 512 بايت ، في حالة وجود حرف البحث في نهاية السلسلة ، تبلغ 20٪.

من الجدير بالذكر أن النسخة الأصلية من memchr () مطبقة بتقنية مقارنة البايت ، والتي لا تستخدم بشكل كامل السجلات على وحدة المعالجة المركزية 64 بت أو 32 بت.

نستخدم مقارنة الكلمات الكاملة بحيث يمكن مقارنة 8 أحرف في نفس الوقت على وحدة المعالجة المركزية. يعتمد هذا الرمز على تنفيذ David Light.

نقوم بإنشاء ملفين لقياس أداء الملف الأول الذي يحتوي في المتوسط ​​على 10 أحرف قبل حرف الوجهة. يحتوي الملف الثاني على 1000 حرف على الأقل قبل ملف الهدف.

تطبيقنا لـ "memchr ()" قليل أفضل في الاختبار الأول وأسرع بنحو 4 مرات من الاختبار الأصلي التنفيذ في الاختبار الثاني.

اختبار Kernel 5.18 باستخدام متغير "memchr ()" الجديد لمعماريات 32 بت و 64 بت لم تكشف عن أي مشاكل.

ماذا يحدث إذا لم تكن p 8 (أو 4 على أهداف 32 بت) محاذاة بايت؟ ليست كل الأهداف تدعم الأحمال غير المنحازة (الفعالة) ، أليس كذلك؟
 أعتقد أنه يعمل إذا لم تكن p 8 أو 4 بايت. لنفترض أن السلسلة هي 10 بايت. ستبحث حلقة for هنا عن أول 8 بايت. إذا كان الحرف الوجهة في آخر 2 بايت ، فستجده حلقة for الثانية. كما أنه يعمل مثل هذا على أجهزة 32 بت.

مكاسب الأداء العام لم يتم تقييمها بعد من الأنظمة الفرعية kernel عند استخدام متغير "memchr ()" المحسن ، ولم تتم مناقشة ما إذا كان سيتم تجاوز التنفيذ (استدعاء دالة memchr () يحدث 129 مرة في كود kernel ، بما في ذلك برامج التشغيل وأنظمة الملفات).

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


اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.