نحن نبحث عن مكتبة عالمية سريعة للعمل مع الملفات الرسومية ، وفهم معايير Google



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

لذا ، فإن العبارة الدقيقة للمشكلة تنص: في التطبيق ، يتم تحميل ملفات jpeg و tiff بعمق ألوان 24 و 8 بت ، بالإضافة إلى 32 بت bmp في الذاكرة. تتراوح أحجام الصور من صغيرة (32 × 32 بكسل) إلى كبيرة ، بدقة 15K. في هذه العملية ، يتم تعديل الملفات ، وبعد ذلك يجب حفظها على القرص بالتنسيقات المحددة. ويجب أن يتم ذلك عن طريق مكتبة مفتوحة المصدر عبر الأنظمة الأساسية تتمتع بأقصى أداء على معالجات Intel الحديثة مع دعم إرشادات المتجهات AVX2. تدعم المكتبة أيضًا مكتبة تنسيق نسيج مضغوط DirectX DXT1. يعتبر Windows Imaging Component بمثابة المعيار للأداء - الإطار القياسي للعمل مع الصور على Windows ، أي أنك تحتاج إلى العثور على مكتبة تعمل على قدم المساواة أو أسرع من WIC.

لكن المطلب الأكثر أهمية هو أن الحل مطلوب الآن ، ولكن بشكل أفضل أمس.

تعرف على المكتبات للعمل مع bmp و tiff و jpeg


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

  • صورة مجانية . قذيفة فوق المكتبات الشهيرة LibJPEG ، LibPNG ، LibTIFF. دعم DXT1 موجود من خلال البرنامج المساعد. العيب هو أن جودة توفير jpeg في API يتم تعيينها بشكل منفصل للغاية - 100 و 75.50 و 25٪. لتغيير هذه المعلمة ، سيكون عليك فهم وتحرير الرمز. المشروع حيوي ويتطور - تم إصدار أحدث إصدار 3.18.0 في 31 يوليو 2018. التجميع تحت Windows تافه ، ويتم إنشاء جميع المكونات تلقائيًا.
  • Cimg هذا ملف مجمّع لرأس C ++ عبر حزمة أثرية قديمة ImageMagick . تتطلب الحزمة تثبيتًا منفصلًا للبناء ، ومن الممكن أيضًا استخدامه مباشرة ، متجاوزًا Cimg. لديها الكثير من الاحتمالات للعمل مع الصور: المرشحات والتحويلات وتعريف مورفولوجيا ، إلخ. يدعم HDR ، لا يدعم DXT1.
  • DevIL ( مكتبة الصور للمطور ). مكتبة C بسيطة للغاية على غرار OpenGL. يحتوي على غلاف فوق LibJPEG ، LibPNG ، LibTIFF ، ولكنه يحتوي أيضًا على وظائف مدمجة واسعة النطاق ، بالإضافة إلى دعم الكثير من تنسيقات الصور ، بما في ذلك DXT1. يستخدم التجميع CMake. معظم التبعيات ، بما في ذلك LibJPEG ، LibPNG ، LibTIFF ، غير مدرجة في DevIL ويجب تنزيلها وتجميعها بشكل منفصل بشكل منفصل. تم تحديث آخر تحديث لـ DevIL فيما يتعلق بنظام البناء بتاريخ 01/01/2017 ، وقد حدث التحديث السابق بشكل عام في عام 2014 ، لذلك إذا كانت هناك مشاكل محتملة في المكتبة ، فقد تكون هناك مشكلات في حلها.
  • OpenImageIO . يتم وضعه كأداة مطور للبرامج المهنية للعمل مع الصور. وهو يدعم شكل المكونات الإضافية التي تعمل مع العديد من تنسيقات الصور الغريبة وحتى الفيديو. يتطلب Build for Windows تعزيز مسبق و Qt 4. لا يوجد نسخة مجمعة جاهزة للاختبار.
  • Boost GIL (مكتبة الصور العامة) Boost ، وهذا كل شيء. على الرغم من أن ليس كل شيء. تحتوي هذه المكتبة أيضًا على غلاف فوق LibJPEG و LibPNG و LibTIFF.
  • SDL_image 2.0 تستخدم مع مكتبة SDL ، وسوف تضحك ، ولكنها تحتوي أيضًا على غلاف فوق LibJPEG و LibPNG و LibTIFF.

تم تجميع كافة المكتبات الموجودة ضمن Windows باستخدام الحد الأقصى لمستوى أمثلية برنامج التحويل البرمجي Visual Studio والمفتاح / arch: AVX2.

وينطبق الشيء نفسه على مكتبات LibJPEG و LibPNG و LibTIFF ، لتسريع العمل المأخوذ من حزمة مكتبة OpenCV الجديدة.

تعرف على Google Benchmark


كما أن خطوة الحل التالية واضحة أيضًا - إن إنشاء معيار لمقارنة أداء المكتبات الموجودة واستخدام مكتبة Google Benchmark microbenchmarking ، المعروفة على نطاق واسع في الدوائر الضيقة ، يجعلها بسيطة وسريعة.
يمكن لـ Google Benchmark قياس أداء أجزاء الرمز التي أدرجتها بدقة في نص دورة C ++ 11.

static void BM_foo1(benchmark::State& state) { //     Init_your_code(); for (auto _ : state){ //  -  your_code_to_benchmark(); } 

في الوظائف المسجلة كمعيار

 //       BENCHMARK(BM_foo1); 

وتشغيلها:

 BENCHMARK_MAIN(); 

ثم إصدار تقرير بالتنسيق المحدد - إخراج وحدة التحكم ، json ، csv.

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

المعلمة الأخيرة التي يعرضها مقياس Google القياسي هي عدد التكرارات التي يتم إجراؤها للوظيفة ، وهي ضرورية للقياس الدقيق الصحيح إحصائيًا لوقت تشغيلها. يقوم النظام باختياره تلقائيًا ، ويقوم بإجراء قياسات أولية.

ما هو "قياس دقيق" لوقت التشغيل؟ يمكنك كتابة أطروحات حول هذا الموضوع ، ولكن في هذه الحالة يكفي القول:

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

الشيء الوحيد الذي يستحق الانتباه إليه: لا يوفر مقياس Google القياسي "تنظيف" ذاكرة التخزين المؤقت بين بداية عمليات تكرار قياس الأداء. إذا لزم الأمر ، يجب أن تعتني بهذا بنفسك.

لكن معيار Google يمكن أن يفعل الكثير من الأشياء الأخرى:

  • حساب التعقيد المقارب للخوارزمية (O) ؛
  • العمل بشكل صحيح مع معايير متعددة الخيوط ، وقياس مدتها ليس في علامات المعالج ، ولكن في وضع "الوقت الحقيقي" (ساعة الحائط) ؛
  • استخدم وظيفتك الخاصة لقياس الوقت "اليدوي" ، والذي قد يكون مفيدًا ، على سبيل المثال ، عند قياس العمل على GPU ؛
  • تعيين معايير تلقائيًا مع مجموعات مختلفة من الحجج لجسم معين من الوظيفة المقاسة ؛
  • عرض متوسط ​​القيمة والانحراف الوسطي والمعياري لبداية متعددة للمعيار ؛
  • قم بتعيين العدادات والعلامات الخاصة بك التي ستنعكس في تقرير Google القياسي.

يتم تنزيل مقياس Google القياسي من مستودع github ، والذي تم تجميعه للنظام الأساسي المناسب باستخدام Cmake (يتوفر تجميع Visual Studio لنظام التشغيل Windows) ، وستتصل المكتبة الناتجة بمشروعك (في حالة Windows ، يلزم أيضًا ارتباط بمكتبة shlwapi) ، تتم إضافة ملف رأس قياس الأداء إلى التعليمات البرمجية الخاصة بك .h ، وبعد ذلك يعمل كل شيء كما هو موضح أعلاه.

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

في حالتنا ، عمل كل شيء دون مشاكل. بعد التواصل مع العملاء ، تم تحديد 4 معايير ، يتم تحميلها وحفظها تحت اسم مختلف:

  • ملف jpeg 8 بت بدقة 15 ك
  • ملف jpeg 24 بت بدقة 15 ك
  • ملف tiff 24-bit بدقة 15k
  • ملف bmp 32 بت بدقة 32x32

تلبية النتائج


كان من المخطط أصلاً أن جميع المكتبات الموجودة ، مثل FreeImage و Cimg و DevIL و OpenImageIO و Boost GIL و SDL_image 2.0 ، ستشارك في اختبار المقارنة مع Windows Imaging Component (WIC). لكن المكتبات الثلاث الأخيرة ، اعتمادًا على "الوحوش" مثل Boost و SDL ، طلب منها العملاء المغادرة في حالة الطوارئ ، إذا لم يتم العثور على المكتبة المطلوبة بين الثلاثة الأولى. ولحسن الحظ ، تم العثور عليها. وإن لم يكن على الفور.

ما يلي هو تقرير تم إنشاؤه بواسطة معيار Google ، والذي يوضح ما يلي:

  • صورة مجانية تمامًا مع درجة سحق تفقد WIC في جميع الاختبارات ، لذلك لم يعد من الممكن اعتبارها.
  • تفقد Cimg WIC بشكل نظيف في كل مكان باستثناء تحميل المشاجرة ، حيث تكون أسرع قليلاً (أقل من 5 ٪). للأسف ، يجب حذفه أيضًا. علاوة على ذلك ، ينطبق هذا على الاستخدام المباشر لحزمة ImageMagick.

يبقى مكتبة الشيطان. يظهر نتائج ممتازة في حالات تحميل bmp و tiff (3 و 2.8 مرة أعلى من WIC!) ، jpeg بالأسود والأبيض (1.75x أفضل من WIC) ، ولكنه يبطئ قليلاً عند تحميل jpeg العادي 24 بت - إنه يفعل ذلك بـ 3 ٪ أبطأ من WIC.
08/15/18 11:15:44
Running c:\WIC\WIC_test\Release\WIC_test.exe
Run on (8 X 4008 MHz CPU s)
CPU Caches:
L1 Data 32K (x4)
L1 Instruction 32K (x4)
L2 Unified 262K (x4)
L3 Unified 8388K (x1)
BenchmarkTimeCPUIterations
BM_WIC8jpeg72 ms70 ms11
BM_cimg8jpeg562 ms52 ms10
BM_FreeImage8jpeg147 ms144 ms5
BM_devIL8jpeg41 ms41 ms17
BM_WIC24jpeg266 ms260 ms3
BM_cimg24jpeg656 ms128 ms6
BM_FreeImage24jpeg594 ms594 ms1
BM_devIL24jpeg276 ms276 ms3
BM_WIC24tiff844 ms844 ms1
BM_cimg24tiff808 ms131 ms5
BM_FreeImage24tiff953 ms938 ms1
BM_devIL24tiff305 ms305 ms2
BM_WIC323 ms3 ms236
BM_cimg3271 ms7 ms90
BM_FreeImage326 ms5 ms112
BM_devIL321 ms1 ms747
بالطبع ، يمكن أيضًا رفض DevIL في هذه المرحلة ، ولكن هنا تظهر مكتبة أخرى في الإطار - Libjpeg-turbo .

يمكن تلبية مخرجاتها بسهولة بالتصفيق - Libjpeg-turbo عبارة عن مكتبة عبر الأنظمة الأساسية تنفذ بالكامل وظيفة libjpeg (API) وتضيف وظائفها الخاصة (على سبيل المثال ، العمل مع المخازن المؤقتة 32 بت). في نفس الوقت ، بالنسبة للهندسة المعمارية x86 ، يستخدم Libjpeg-turbo بنشاط تعليمات المتجه (SSE2 ، AVX2) ، ووفقًا لمنشئي المحتوى ، فهو أسرع من 2-6 مرات من libjpeg (!)

لذلك ، فإن الخطوة التالية هي بناء الشيطان باستخدام Libjpeg-turbo بدلاً من libjpeg. يقوم Libjpeg-turbo بمساعدة CMake ببناء Visual Studio دون مشاكل ، ثم على الفور تقريبًا (مع استبدال #define الوحيد ، الذي يحدد إصدار libjpeg في ملف رأس DevIL) ، يبدأ العمل كجزء من DevIL.

ونتيجة لذلك ، يبدو تقرير Google القياسي كما يلي:
BenchmarkTimeCPUIterations
BM_WIC8jpeg72 ms68 ms9
BM_cimg8jpeg565 ms39 ms10
BM_FreeImage8jpeg148 ms141 ms5
BM_devIL8jpeg31 ms31 ms24
BM_WIC24jpeg269 ms266 ms2
BM_cimg24jpeg675 ms131 ms5
BM_FreeImage24jpeg604 ms594 ms1
BM_devIL24jpeg149 ms150 ms5
BM_WIC24tiff833 ms828 ms1
BM_cimg24tiff785 ms138 ms5
BM_FreeImage24tiff943 ms938 ms1
BM_devIL24tiff318 ms320 ms2
BM_WIC324 ms3 ms236
BM_cimg3274 ms8 ms56
BM_FreeImage326 ms5 ms100
BM_devIL321 ms1 ms747
بالطبع ، إن تحسينات الأداء مع jpeg ليست مضاعفة مقارنةً بـ libjpeg ، ولكن يجب أن تكون كذلك - لأن تفوق السرعة ينطبق فقط على تشفير / فك تشفير jpeg ، ويتضمن الاختبار النفقات العامة لقراءة / كتابة ملف.

ولكن من الواضح أنه في المتوسط ​​DevIL أسرع من WIC في حالة 8 بت jpeg 2.3 مرة ، 24 بت jpeg 1.8 مرة ، 24 بت tiff - 2.7 مرة ، 32 بت bmp - 3.5 مرة.

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

ولكن حتى ما هو مثير للإعجاب. لذلك ، إذا كنت تبحث عن مكتبة عبر الأنظمة الأساسية للعمل مع ملفات رسومية سريعة وسهلة بكل معنى الكلمة ، فعليك الانتباه إلى DevIL ، وإذا كنت بحاجة إلى إجراء قياسات مقارنة للشفرة بسرعة وبدقة ، فإن معيار Google في خدمتك.

Source: https://habr.com/ru/post/ar425021/


All Articles