Xxhash: تحديث مقارنات السرعة مع crc32

تم إنشاؤها على ٢٤ أبريل ٢٠١٦  ·  6تعليقات  ·  مصدر: Cyan4973/xxHash

إذا كنت تستخدم تعليمات crc32 بشكل صحيح ، والمتاحة منذ Nehalem (SSE 4.2) ، فيمكنك تحقيق معدل نقل 1.17 دورة لكل 8 بايت ، وهو أداء نظري يبلغ 20.5 جيجابايت / ثانية على معالج 3 جيجاهرتز ، في ظل ظروف مثالية. المصدر: http://www.drdobbs.com/parallel/fast-parallelized-crc-computation-using/229401411؟pgno=2

يؤدي البحث في Google قليلاً إلى طرح سؤال SO هذا ، والذي يقتبس معدل نقل 20 جيجابايت / ثانية ، والذي يتطابق مع الأرقام النظرية بشكل جيد للغاية: http://stackoverflow.com/questions/17645167/implementing-sse-4-2s-crc32c-in- البرمجيات

هل يمكنك ملاحظة أن الأجهزة crc32 هي في الواقع أسرع 3 مرات من xxhash؟ هذا لا يعني أنها خوارزمية تجزئة أكثر ملاءمة ، لكنني أهدرت وقتًا طويلاً في التفكير في xxhash vs crc32 لأغراض المجموع الاختباري ، قبل أن أدرك أنني لا أستطيع الاقتراب من crc32 في الأداء.

question

التعليق الأكثر فائدة

شكرا!
الثنائيات هي 64 بت.
XXH3_64bit المؤكد أن أداء vmull_p64 لديه إنتاجية أفضل قليلاً.

ال 6 كومينتر

المشكله هي،
تم تشغيل المعيار على Core 2 Duo @ 3GHz.
لا تدعم وحدة المعالجة المركزية هذه الأجهزة crc32c.

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

نسخة crc32 المقننة هنا هي النسخة المتوفرة في مجموعة اختبار Smasher.
توجد إصدارات أسرع ، بما في ذلك الإصدارات الموجهة.
يتطلب تعديل مجموعة الاختبار لدمجها.

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

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

امين
كمتابعة متأخرة حقًا ، هل يمكنك تقديم بعض الأفكار حول XXH3 الجديدة مقارنة بـ crc32c؟

الأجهزة crc32c بحد ذاتها ليست تنافسية. في حين أنه بالتأكيد أسرع من برنامج crc32 ، فإنه لا يمكنه مواكبة ILP ، التي تستخدمها معظم خوارزميات التجزئة الحديثة.

ومع ذلك ، يمكن أن تكون قنوات crc32c المتعددة على التوازي أكثر كفاءة. في هذه الحالة ، تعتمد النتيجة الدقيقة على التنفيذ. يمكن العثور على العديد من التطبيقات عبر الإنترنت. لقد وجدت العديد من التطبيقات التي يمكن أن تكون أفضل سرعة XXH64 ، ولكن لا شيء حتى الآن أفضل من XXH3 . ربما يتعلق الأمر بالبحث أكثر.

يمكن تنفيذ CRC32 و CRC32C بكفاءة عالية باستخدام تعليمات Intel pclmulqdq أو ARMv8 CLMUL.

منذ بعض الوقت ، قمت بتجميع اثنين من تطبيقات ARM باستخدام تعليمات CRC32 و CLMUL وسرعاتها تطفو حول 4.1 جيجا بايت / ثانية على rk3399. الآن قارنتهم بـ xxh32 و xxh64 وحصلت على 3.5 جيجابايت / ثانية و 2.5 جيجابايت / ثانية على التوالي.

هل من المتوقع أن يكون xxh64 أبطأ من xxh32 على ARMv8 ، أم أن هناك خطأ ما؟

من المتوقع أن يكون xxh64 أبطأ من xxh32 في ثنائيات 32 بت.
على الرغم من ذلك ، فإن هذا أقل احتمالًا في ثنائيات 64 بت ، ولكن لا يزال بإمكان المرء تخيل شريحة تحتوي على تعليمات مضاعفة 64 بت ضعيفة / بطيئة ، أبطأ بكثير من 32 بت ، وفي هذه الحالة ، يكون ذلك ممكنًا.
لسوء الحظ ، فإن عائلة رقائق ARMv8 كبيرة جدًا ، ويمكن أن تتميز كل شريحة بمقايضة أداء مختلفة جدًا. لذلك أود أن أقول إن هذه الحالة يجب أن تحدث في مكان ما ، لكنني لن أجعلها القاعدة.

للحصول على تجزئة 64 بت أسرع على ARM ، قد تكون مهتمًا بتجربة أحدث إصدار XXH3_64bit() ، المميز في الإصدار الأخير.

شكرا!
الثنائيات هي 64 بت.
XXH3_64bit المؤكد أن أداء vmull_p64 لديه إنتاجية أفضل قليلاً.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

make-github-pseudonymous-again picture make-github-pseudonymous-again  ·  3تعليقات

gitmko0 picture gitmko0  ·  4تعليقات

vinniefalco picture vinniefalco  ·  4تعليقات

vp1981 picture vp1981  ·  7تعليقات

boazsegev picture boazsegev  ·  6تعليقات