كم عدد مراكز إنتل للمعالجات الموجودة على جهاز الكمبيوتر الخاص بك؟ إذا كنت تستخدم نظامًا قائمًا على Intel ، فحينئذٍ في الغالبية العظمى من الحالات ، ستحتاج إلى إضافة نظام إلى إجابتك. تركيبة جميع معالجات Intel تقريبًا - من Atom إلى Xeon E3 ، بالطبع ، دون فقدان Core ، تضمنت لسنوات عديدة الرسومات الأساسية Intel Graphics ، والتي هي في الأساس معالج متكامل ، وبالتالي ، لا يمكنها فقط عرض الصور على الشاشة وتسريع الفيديو ، ولكن أيضًا إجراء حسابات للأغراض العامة "العادية". كيف يمكن استخدام هذا بشكل فعال؟ انظر تحت الخفض.

أولاً ، سنشرح باختصار السبب الذي يجعل الاعتماد على Intel GPU يستحق ذلك. بطبيعة الحال ، فإن أداء وحدة المعالجة المركزية في النظام دائمًا ما يتجاوز بشكل كبير وحدة معالجة الرسومات ، لأنه هو أيضًا المعالج المركزي.
لكن من المثير للاهتمام أن نلاحظ أن أداء وحدات معالجة الرسومات Intel المدمجة على مدار العقد الماضي قد نما بنسبة مئوية أكبر بكثير من أداء وحدة المعالجة المركزية ، وهذا الاتجاه سيستمر بالتأكيد مع ظهور بطاقات رسومات إنتل منفصلة جديدة. بالإضافة إلى ذلك ، تعد وحدة معالجة الرسومات (GPU) ، بحكم هندستها (العديد من أجهزة تنفيذ المتجهات) ، أكثر ملاءمة لأداء نوع معين من معالجة الصور المهمة ، أي في الواقع ، لتنفيذ أي عمليات من نفس النوع على صفائف البيانات. يقوم GPU بهذا مع التوازي الداخلي الكامل ، وينفق عليه طاقة أقل من وحدة المعالجة المركزية ، وفي بعض الحالات يتجاوزه بالسرعة المطلقة. أخيرًا ، يمكن أن تعمل وحدة معالجة الرسومات (GPU) ووحدة المعالجة المركزية (CPU) بشكل متوازٍ ، كل على حدة بمهامها الخاصة ، مما يوفر أقصى أداء و / أو الحد الأدنى من استهلاك الطاقة للنظام بأكمله.
- حسنا ، إنتل. قررنا استخدام Intel GPU لإجراء العمليات الحسابية للأغراض العامة ، كيف نفعل ذلك؟
- أبسط طريقة لا تتطلب معرفة خاصة بالرسومات (تظليل Direct3D و OpenGL) هي OpenCL.
نواة OpenCL مستقلة عن المنصة وسيتم تنفيذها تلقائيًا على جميع أجهزة الحوسبة المتوفرة في النظام - وحدة المعالجة المركزية ، وحدة معالجة الرسومات ، FPGA ، إلخ. لكن رسوم هذا التنوع لا تزال بعيدة عن الحد الأقصى للأداء المحتمل على كل نوع من أنواع الأجهزة ، وخاصةً على وحدة معالجة الرسومات Intel GPU المدمجة. هنا يمكننا إعطاء مثال على ذلك: عند تنفيذ التعليمات البرمجية على أي GPU من Intel والذي ينقل مصفوفة 16 × 16 بايت ، ستكون ميزة الأداء للبرمجة المباشرة لـ Intel GPU أعلى 8 مرات من إصدار OpenCL!
بالإضافة إلى ذلك ، لا يدعم OpenCL بعض الوظائف المطلوبة لتنفيذ الخوارزميات الشائعة (على سبيل المثال ، "المرشحات الواسعة" التي تستخدم البيانات من مجموعة كبيرة من البكسل في تحويل واحد).
لذلك ، إذا كنت بحاجة إلى أقصى سرعة على وحدة معالجة الرسومات و / أو شيء أكثر تعقيدًا من العمل بشكل مستقل مع كل عنصر من عناصر المصفوفة وأقرب جيرانها ، فإن Intel C for Metal (ICM) ، وهي أداة لتطوير التطبيقات التي تعمل على Intel Graphics ، سوف تساعدك .
ICM - مرحبا بكم في صياغة!
من وجهة نظر الأداء والوظائف ، يمكن اعتبار ICM "مجمّعًا لبطاقات الرسومات من Intel" ، ومن حيث الدوائر وسهولة الاستخدام - "التناظرية لـ OpenCL لبطاقات الرسومات من Intel".
لسنوات عديدة ، تم استخدام ICM داخليًا من قبل Intel في تطوير منتجات معالجة الوسائط على Intel GPU. ولكن في عام 2018 ، تم إصدار ICM للجمهور ، وحتى مع المصدر المفتوح!
حصل Intel C for Metal على اسمه الحالي قبل بضعة أشهر ، قبل أن يطلق عليه Intel C for Media (نفس اختصار ICM أو CM أو حتى CM) ، وحتى قبل ذلك - إطار تطوير الوسائط (MDF). لذلك ، إذا كان اسم مكان ما ، أو في الوثائق أو في تعليقات المصادر المفتوحة ، يجتمع الأسماء القديمة - لا تنزعج ، فهذه قيمة تاريخية.
لذلك ، يحتوي رمز تطبيق ICM ، تمامًا كما في OpenCL ، على جزأين: الأول "الإداري" ، الذي تم تنفيذه على المعالج ، والنواة ، التي تم تنفيذها على وحدة معالجة الرسومات. ليس من المستغرب أن الجزء الأول يسمى المضيف ، والثاني هو النواة.
Kernels هي وظيفة معالجة كتلة معينة من البكسل (أو مجرد بيانات) ، ويتم كتابتها بلغة Intel C للمعادن وتجميعها في مجموعة تعليمات Intel GPU (ISA) باستخدام برنامج التحويل البرمجي ICM.
المضيف هو نوع من "kernel team manager" ، فهو يدير عملية نقل البيانات بين وحدة المعالجة المركزية ووحدة معالجة الرسومات ويقوم بتنفيذ "عمل إداري" آخر من خلال مكتبة وقت تشغيل ICM وبرنامج تشغيل وسائط Intel GPU.
يبدو سير عمل ICM المفصل كما يلي:
- يتم تصنيف رمز المضيف ICM بواسطة أي برنامج التحويل البرمجي x 86 C / C ++ مع التطبيق بأكمله؛
- يتم ترجمة رمز kernel ICM بواسطة برنامج التحويل البرمجي ICM إلى ملف ثنائي مع بعض مجموعة التعليمات الشائعة (ISA ISA)؛
- في وقت التشغيل ، تُترجم هذه المجموعة العامة من إرشادات JIT إلى GPU محددة من Intel ؛
- يستدعي مضيف ICM مكتبة وقت تشغيل ICM للتواصل مع GPU ونظام التشغيل.
بضع نقاط أكثر أهمية ومفيدة:
- يمكن مشاركة الأسطح المستخدمة في ICM لتمثيل / تخزين البيانات مع DirectX 11 و 9 (DXVA على Linux).
- يمكن أن تأخذ وحدة معالجة الرسوميات البيانات من ذاكرة الفيديو وذاكرة النظام المشتركة مع وحدة المعالجة المركزية وتكتبها. يتضمن ICM وظائف خاصة لكلا حالتي نقل البيانات في كلا الاتجاهين. في نفس الوقت ، يتم مشاركة ذاكرة النظام تمامًا ، ولا يلزم النسخ الحقيقي فيها - ولهذا الغرض ، يتم توفير ما يسمى بالنسخة الصفرية في ICM.
ICM - في تنفيس البركان!
بالفعل من اسم "C for Iron" نفسه ، يترتب على ذلك أن لغة الجهاز تتوافق مع جهاز الرسومات الداخلي Intel. أي أنه يأخذ في الاعتبار حقيقة أنه سيتم تنفيذ التعليمات البرمجية على عدة عشرات من وحدات تنفيذ البطاقة الرسومية ، كل منها عبارة عن معالج متجه بالكامل قادر على تنفيذ عدة مؤشرات ترابط في وقت واحد.
لغة ICM نفسها هي لغة C ++ مع بعض القيود والإضافات. مقارنة بـ C ++ ، يفتقر ICM إلى ... مؤشرات ، تخصيص ذاكرة ، ومتغيرات ثابتة. تحت الحظر أيضا وظائف العودية. ولكن هناك برمجة لنموذج متجه صريح (SIMD): أنواع بيانات المتجه - المتجه ، المصفوفة والسطح ؛ عمليات المتجهات على أنواع البيانات هذه ، وظروف المتجه إذا / آخر ، يتم تنفيذها بشكل مستقل لكل عنصر من عناصر المتجه ؛ بالإضافة إلى وظائف مدمجة للوصول إلى الوظائف الثابتة لأجهزة Intel GPU.
يتم تسهيل العمل مع المتجهات والمصفوفات والأسطح في المهام الحقيقية بواسطة كائنات "مجموعات فرعية" - من الكائنات الأساسية المقابلة ، يمكنك فقط اختيار الكتل "المرجعية" التي تهمك أو ، كحالة خاصة ، العناصر الفردية عن طريق القناع.
على سبيل المثال ، دعونا ننظر إلى رمز ICM الذي ينفذ مرشح خطي - استبدال قيمة
ألوان RGB لكل بكسل حسب متوسط القيمة و 8 من الجوار في الصورة:
إذا كانت الألوان (البيانات) في المصفوفة موجودة كـ
R8G8B8 ، فإن الحساب بتقسيم صورة الإدخال إلى كتل بحجم 6 × 8 بكسل (عناصر بيانات بايت 6 × 24) سيكون كما يلي:
_GENX_MAIN_ void linear(SurfaceIndex inBuf, SurfaceIndex outBuf, uint h_pos, uint v_pos){
- يتم تعيين حجم المصفوفات في النموذج <نوع البيانات والطول والعرض> ؛
- يعرض عامل التشغيل <v_size ، v_stride ، h_size ، h_stride> (i ، j) السلسلة الفرعية التي تبدأ بالعنصر (i ، j) ، v_size يُظهر عدد الصفوف المحددة ، v_stride - المسافة بين الصفوف المحددة h_size - عدد الأعمدة المحددة ، h_stride - المسافة بينهما .
يرجى ملاحظة أنه يتم اختيار حجم مصفوفة الإدخال 8 × 32 لأنه على الرغم من أن الكتلة 8 × 30 كافية خوارزميًا لحساب قيم جميع البكسلات في الكتلة 6 × 24 ، تتم قراءة كتلة البيانات في ICM وليس بايت ، ولكن بعناصر dword 32 بت.
الكود أعلاه هو ، في الواقع ، نواة ICM كاملة. كما ذكرنا ، سيتم تجميعها بواسطة مترجم ICM على مرحلتين (الترجمة المسبقة وترجمة JIT اللاحقة). تم تصميم برنامج التحويل البرمجي لـ ICM على أساس LLVM ، وإذا كنت ترغب في ذلك ، فيمكنك
دراسته في المصادر وبناؤه بنفسك .
ولكن ماذا يفعل مضيف ICM؟ يستدعي وظائف مكتبة وقت تشغيل ICM التي:
- إنشاء وتهيئة وحذف بعد استخدام جهاز GPU (CmDevice) ، وكذلك الأسطح التي تحتوي على بيانات المستخدم المستخدمة في النواة (CmSurface) ؛
- العمل باستخدام kernels - قم بتنزيلها من ملفات .isa المترجمة مسبقًا ، وقم بإعداد وسيطاتها ، مع الإشارة إلى جزء البيانات الذي ستعمل عليه كل kernel ؛
- إنشاء وإدارة قائمة انتظار تنفيذ kernel ؛
- يتحكمون في تشغيل مؤشرات الترابط التي تنفذ كل نواة على وحدة معالجة الرسومات ؛
- إدارة الأحداث (CmEvent) - كائنات التزامن في وحدة معالجة الرسومات ووحدة المعالجة المركزية ؛
- نقل البيانات بين وحدة معالجة الرسومات ووحدة المعالجة المركزية ، أو بالأحرى ، بين النظام وذاكرة الفيديو ؛
- الإبلاغ عن الأخطاء ، وقياس وقت تشغيل النواة.
أبسط رمز مضيف يشبه هذا:
كما ترون ، لا يوجد شيء معقد في إنشاء واستخدام النواة والمضيف. كل شيء بسيط!
الصعوبة الوحيدة للتحذير من أجل العودة إلى العالم الحقيقي: حاليًا في الإصدار المتوفر للجمهور من ICM ، الطريقة الوحيدة لتصحيح الأخطاء هي رسائل printf. يمكن رؤية كيفية استخدامها بشكل صحيح في مثال
Hello، World .
ICM - وليس المعادن الثقيلة!
الآن دعونا نرى كيف يعمل في الممارسة العملية.
تتوفر مجموعة أدوات ICM Developer
لنظامي التشغيل Windows و Linux ، ولكل من أنظمة التشغيل يحتوي على ICM Compiler ، وثائق ، وحالات استخدام تعليمي. يتم
تحميل وصف مفصل لهذه الأمثلة التدريب
بشكل منفصل .
لنظام التشغيل Linux ، تتضمن الحزمة أيضًا برنامج تشغيل وسائط وضع المستخدم لـ VAAPI مع مكتبة وقت تشغيل ICM مدمجة. بالنسبة لنظام التشغيل Windows ، سيعمل برنامج تشغيل الرسومات المعتاد من Intel لنظام التشغيل مع ICM. يتم تضمين مكتبة وقت التشغيل ICM في مجموعة dll لبرنامج التشغيل هذا. تتضمن حزمة ICM ملف الارتباط .lib الخاص به فقط. إذا كان برنامج التشغيل مفقودًا من نظامك لسبب ما ، يتم تنزيله من موقع Intel على الويب ، وضمان التشغيل الصحيح لـ ICM في برامج التشغيل ، بدءًا من الإصدار 15.60 - 2017).
يمكن العثور على الكود المصدري للمكونات هنا:
ينطبق المحتوى الإضافي لهذا القسم حصريًا على Windows ، ولكن المبادئ العامة للعمل مع ICM تنطبق أيضًا على Linux.
للعمل "المعتاد" مع حزمة ICM ، ستحتاج إلى بدء تشغيل Visual Studio في عام 2015 وسيبدأ تشغيل Cmake من الإصدار 3.2. في الوقت نفسه ، تم تصميم ملفات التكوين والبرامج النصية الخاصة بأمثلة التدريب لـ VS 2015 ، لاستخدام إصدارات أحدث من ملفات VS ، سيكون عليك دراسة وتحرير المسارات إلى مكونات VS بنفسك.
لذلك ، التعرف على ICM لنظام التشغيل Windows:
- تحميل الأرشيف ؛
- فكه
- نبدأ (يفضل أن يكون ذلك في سطر أوامر VS) في برنامج إعداد بيئة الإعداد setupenv.bat مع ثلاثة معلمات - توليد Intel GPU (المقابل للمعالج الذي تم بناء GPU فيه ، ويمكن تركه افتراضيًا: gen9) ، ونظام الترجمة: x86 \ x64 وإصدار DirectX لـ المشاركة مع ICM: dx9 / dx11.
بعد ذلك ، يمكنك ببساطة إنشاء جميع أمثلة التدريب - في مجلد الأمثلة ،
سيقوم البرنامج النصي
build_all.bat بهذا أو سيقوم بإنشاء مشاريع لبرنامج Microsoft Visual Studio - سيؤدي هذا إلى
إنشاء البرنامج النصي
create_vs.bat مع اسم مثال محدد كمعلمة.
كما ترون ، فإن تطبيق ICM سيكون ملف exe. مع الجزء المضيف وملف .isa مع جزء GPU المتوافق مسبقًا المتوافق.
يتم تضمين أمثلة مختلفة في حزمة ICM - من أبسط Hello ، World ، والتي توضح المبادئ الأساسية لتشغيل ICM ، إلى تلك المعقدة إلى حد ما - تنفيذ الخوارزمية لإيجاد "الحد الأقصى للتدفق - الحد الأدنى للقطع" من الرسم البياني (مشكلة الحد الأقصى للتدفق الدقيق) المستخدمة في تجزئة الصورة ودرزها .
جميع دراسات حالة ICM موثقة جيدًا في الكود وفي
الوصف المنفصل الذي سبق ذكره. يوصى بالتعمق في ICM بدقة - دراسة متتابعة وتشغيل الأمثلة ، ثم تعديلها لتناسب احتياجاتك.
لفهم عام لجميع ميزات ICM الحالية ، يوصى بشدة أن تدرس "المواصفات" - وصف ICM
cmlangspec.html في المجلد
\ documents \ compiler \ html \ cmlangspec .
على وجه الخصوص ، يصف واجهة برمجة التطبيقات لوظائف ICM المنفذة في الجهاز - الوصول إلى ما يسمى بأخذ عينات النسيج (Sampler) - وهي آلية لتصفية الصور ذات التنسيقات المختلفة ، وكذلك لتقييم الحركة (تقدير الحركة) بين إطارات الفيديو وبعض إمكانيات تحليل الفيديو.
ICM - إضراب بينما يكون الجو حارًا!
عند الحديث عن أداء تطبيقات ICM ، تجدر الإشارة إلى أن دراسات الحالة تشمل قياس وقت عملهم ، بحيث من خلال تشغيلها على النظام المستهدف ومقارنتها بمهامك ، يمكنك تقييم مدى ملاءمة استخدام ICM لها.
والاعتبارات العامة المتعلقة بأداء ICM بسيطة للغاية:
- عند إلغاء تحميل العمليات الحسابية على وحدة معالجة الرسومات ، تذكر النفقات العامة لنقل بيانات وحدة المعالجة المركزية <-> وحدة معالجة الرسومات ومزامنة هذه الأجهزة. لذلك ، مثال مثل Hello ، World ليس مرشحًا جيدًا لتطبيق ICM. لكن خوارزميات رؤية الكمبيوتر ، الذكاء الاصطناعى ، وأي معالجة غير تافهة لصفائف البيانات ، خاصة مع تغيير ترتيب هذه البيانات في العملية أو في المخرجات ، هي ما يحتاجه ICM.
- بالإضافة إلى ذلك ، عند تصميم رمز ICM ، من الضروري مراعاة جهاز GPU الداخلي ، أي أنه من المستحسن إنشاء عدد كافٍ من سلاسل عمليات GPU وتحميلها جميعًا مع العمل. في هذه الحالة ، من الجيد تقسيم الصور للمعالجة إلى كتل صغيرة. لكن طريقة التقسيم المحددة ، بالإضافة إلى اختيار خوارزمية معالجة محددة لتحقيق أقصى أداء ، ليست مهمة تافهة. ومع ذلك ، هذا ينطبق على أي طريقة للعمل مع أي GPU (وحدة المعالجة المركزية).
هل لديك كود OpenCL ، لكن أدائه لا يرضيك؟ أو كود CUDA ، لكنك ترغب في العمل على عدد أكبر بكثير من المنصات؟ ثم يستحق نظرة على ICM.
ICM هو منتج حي ومتطور. يمكنك المشاركة في استخدامه وتطويره - تنتظر المستودعات المقابلة على github التزاماتك. جميع المعلومات اللازمة لكلا العمليتين في هذه المقالة وملفات التمهيدي على جيثب. وإذا كان هناك شيء مفقود ، فسوف يظهر بعد أسئلتك في التعليقات.