سؤال

أنا أعمل على برنامج ترميز الفيديو لـ OMAP3430.لدي بالفعل رمز مكتوب بلغة C++، وأحاول تعديل/نقل أجزاء معينة منه للاستفادة من DSP (SDK (OMAP ZOOM3430 SDK) لدي لديه DSP إضافي).

لقد حاولت نقل حلقة for صغيرة تعمل على كمية صغيرة جدًا من البيانات (حوالي 250 بايت)، ولكن حوالي 2 مليون مرة على بيانات مختلفة.لكن الحمل الزائد الناتج عن الاتصال بين وحدة المعالجة المركزية وDSP أكبر بكثير من المكاسب (إذا كان لدي أي مكاسب).

أفترض أن هذه المهمة تشبه إلى حد كبير تحسين التعليمات البرمجية لوحدات معالجة الرسومات في أجهزة الكمبيوتر العادية.سؤالي هو نقل أي نوع من الأجزاء سيكون مفيدًا؟كيف يعتني مبرمجو GPU بمثل هذه المهام؟

يحرر:

  1. يخصص تطبيق GPP مخزنًا مؤقتًا بحجم 0x1000 بايت.
  2. يستدعي تطبيق GPP DSPProcessor_ReserveMemory لحجز مساحة عنوان ظاهرية DSP لكل مخزن مؤقت مخصص باستخدام حجم أكبر بمقدار 4K من المخزن المؤقت المخصص لحساب المحاذاة التلقائية للصفحة.يجب أيضًا محاذاة إجمالي حجم الحجز على طول حدود الصفحة بدقة 4K.
  3. يستدعي تطبيق GPP DSPProcessor_Map لتعيين كل مخزن مؤقت مخصص لمساحات العناوين الافتراضية لـ DSP المحجوزة في الخطوة السابقة.
  4. يقوم تطبيق GPP بإعداد رسالة لإعلام مرحلة تنفيذ DSP للعنوان الأساسي لمساحة العنوان الافتراضية، والتي تم تعيينها إلى المخزن المؤقت المخصص على GPP.يستخدم تطبيق GPP DSPNode_PutMessage لإرسال الرسالة إلى DSP.
  5. يستدعي GPP memcpy لنسخ البيانات المراد معالجتها في الذاكرة المشتركة.
  6. يستدعي تطبيق GPP DSPProcessor_FlushMemory للتأكد من مسح ذاكرة التخزين المؤقت للبيانات.
  7. يقوم تطبيق GPP بإعداد رسالة لإعلام مرحلة تنفيذ DSP بأنها قد انتهت من الكتابة إلى المخزن المؤقت ويمكن لموفر خدمة الإشارة (DSP) الآن الوصول إلى المخزن المؤقت.تحتوي الرسالة أيضًا على كمية البيانات المكتوبة في المخزن المؤقت حتى يعرف DSP مقدار البيانات المطلوب نسخها.يستخدم GPP DSPNode_PutMessage لإرسال الرسالة إلى DSP ثم يستدعي DSPNode_GetMessage لانتظار سماع رسالة مرة أخرى من DSP.

بعد ذلك، يبدأ تنفيذ برنامج DSP، ويقوم DSP بإعلام GPP برسالة عند انتهاء المعالجة.فقط للمحاولة لا أضع أي معالجة داخل برنامج DSP.أنا فقط أرسل رسالة "انتهى المعالجة" مرة أخرى إلى GPP.وهذا لا يزال يستهلك الكثير من الوقت.هل يمكن أن يكون ذلك بسبب استخدام الذاكرة الداخلية/الخارجية، أم أنه فقط بسبب التحميل الزائد على الاتصالات؟

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

المحلول 3

من القياسات التي أجريتها، تستغرق دورة المراسلة الواحدة بين وحدة المعالجة المركزية ومعالج الإشارة الرقمية حوالي 160 وحدة.لا أعرف ما إذا كان هذا بسبب النواة التي أستخدمها أم برنامج تشغيل الجسر؛ولكن هذا وقت طويل جدًا بالنسبة للمراسلة البسيطة ذهابًا وإيابًا.

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

نصائح أخرى

لا يحتوي OMAP3430 على DSP على اللوحة، بل يحتوي على محرك فك تشفير الفيديو/الصوت IVA2+ متصل بحافلة النظام ويحتوي قلب Cortex على تعليمات SIMD تشبه DSP.وحدة معالجة الرسومات الموجودة على OMAP3430 هي وحدة تعتمد على PowerVR SGX.على الرغم من أنه يحتوي على تظليلات قابلة للبرمجة ولا أعتقد أن هناك أي دعم لبرمجة الأغراض العامة مثل CUDA أو OpenCL.قد أكون مخطئا ولكني لم أسمع قط عن مثل هذا الدعم

إذا كنت تستخدم محرك التشفير/فك التشفير IVA2+ الموجود على اللوحة، فستحتاج إلى استخدام المكتبات المناسبة لهذه الوحدة وهي تدعم فقط برامج ترميز محددة أعرفها.هل تحاول كتابة مكتبتك الخاصة لهذه الوحدة؟

إذا كنت تستخدم DSPish المدمج في Cortex (تعليمات SIMD)، فقم بنشر بعض التعليمات البرمجية.

إذا كانت لوحة التطوير الخاصة بك تحتوي على بعض DSP إضافي، فما هو DSP وكيف يتم توصيله بـ OMAP؟

فيما يتعلق بسؤال GPU لسطح المكتب، في حالة فك تشفير الفيديو، يمكنك استخدام مكتبات الوظائف التي يوفرها البائع لإجراء مكالمات إلى الأجهزة، وهناك العديد من المكتبات VDAPU لـ Nvidia على نظام التشغيل Linux، ومكتبات مماثلة على نظام التشغيل Windows (أعتقد أن PureViewHD يُطلق عليها اسم).لدى ATI أيضًا مكتبات Linux وWindows لمحركات فك التشفير الموجودة على اللوحة، ولا أعرف الأسماء.

لا أعرف ما هي القاعدة الزمنية لنقل البيانات، لكنني أعرف أن TMS32064x المدرج في ورقة المواصفات الخاصة بـ SDK لديه محرك DMA قوي جدًا.(أفترض أنه ZOOM OMAP34X MDK الأصلي.مكتوب أنه يحتوي على 64xx.) أتمنى أن يكون لدى OMAP شيء مماثل، استخدمه لتحقيق أقصى استفادة منه.أوصي بإعداد مخازن مؤقتة "ping-pong" في ذاكرة الوصول العشوائي الداخلية لـ 64xx واستخدام SDRAM كذاكرة مشتركة مع مقبض النقل بواسطة DMA.ستكون ذاكرة الوصول العشوائي الخارجية بمثابة عنق الزجاجة في أي من أجزاء سلسلة 6xxx، لذا احتفظ بكل ما يمكنك قفله في الذاكرة الداخلية لتحسين الأداء.عادةً ما تتمتع هذه الأجزاء بالقدرة على نقل 8 كلمات 32 بت إلى قلب المعالج بمجرد وجودها في الذاكرة الداخلية، ولكن ذلك يختلف من جزء إلى آخر بناءً على مستوى ذاكرة التخزين المؤقت التي تسمح لك بتعيينها كذاكرة الوصول العشوائي المباشرة.تقوم الأجزاء الحساسة من حيث التكلفة من TI بنقل "الذاكرة القابلة للتعيين" بعيدًا عن بعض الشرائح الأخرى.تتوفر أيضًا جميع الأدلة الخاصة بالأجزاء من TI للتنزيل مجانًا بتنسيق PDF.حتى أنهم أعطوني نسخًا ورقية مجانًا من دليل وحدة المعالجة المركزية ومجموعة التعليمات TMS320C6000 والعديد من الكتب الأخرى.

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

أتمنى أن يساعدك هذا.

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