عرض الرسم البياني باستخدام تسريع ثلاثي الأبعاد

StackOverflow https://stackoverflow.com/questions/219872

  •  03-07-2019
  •  | 
  •  

سؤال

نقوم بإنشاء رسوم بيانية لمجموعات البيانات الضخمة.نحن نتحدث عن 4096 عينة في الثانية، و10 دقائق لكل رسم بياني.عملية حسابية بسيطة تجعل 4096 * 60 * 10 = 2457600 عينة لكل رسم بياني.كل عينة هي دقة FP مزدوجة (8 بايت).علاوة على ذلك، فإننا نعرض العديد من الرسوم البيانية الخطية على شاشة واحدة، بما يصل إلى حوالي مائة.وهذا يجعلنا نعرض حوالي 25 مليون عينة في شاشة واحدة.باستخدام الحس السليم والحيل البسيطة، يمكننا الحصول على أداء التعليمات البرمجية هذا باستخدام وحدة المعالجة المركزية التي ترسم هذا على لوحة ثنائية الأبعاد.الأداء، أي أن أوقات العرض تقل عن دقيقة واحدة. وبما أن هذه بيانات علمية، فلا يمكننا حذف أي عينات.على محمل الجد، هذا ليس خيارا.لا تبدأ حتى بالتفكير في الأمر.

وبطبيعة الحال، نريد تحسين أوقات العرض باستخدام جميع التقنيات المتاحة.يعد Multicore والعرض المسبق والتخزين المؤقت كلها مثيرة للاهتمام للغاية ولكن لا تقطعها.نريد عرض 30 إطارًا في الثانية مع مجموعات البيانات هذه كحد أدنى، ويفضل 60 إطارًا في الثانية.ونحن الآن هذا هو هدف طموح.

الطريقة الطبيعية لتفريغ عرض الرسومات هي استخدام وحدة معالجة الرسومات (GPU) الخاصة بالنظام.تم تصميم وحدات معالجة الرسومات للعمل مع مجموعات بيانات ضخمة ومعالجتها بشكل متوازي.أظهرت لنا بعض اختبارات HelloWorld البسيطة اختلافًا بين النهار والليل في سرعة العرض باستخدام وحدة معالجة الرسومات.

الآن المشكلة هي:تم تصميم واجهة برمجة تطبيقات GPU مثل OpenGL وDirectX وXNA للمشاهد ثلاثية الأبعاد في الاعتبار.وبالتالي، فإن استخدامها لتقديم رسوم بيانية ثنائية الأبعاد أمر ممكن، ولكنه ليس مثاليًا.وفي إثبات المفاهيم التي طورناها، واجهنا أننا بحاجة إلى تحويل العالم ثنائي الأبعاد إلى عالم ثلاثي الأبعاد.فجأة يتعين علينا العمل مع نظام الإحداثيات XYZ مع المضلعات والقمم والمزيد من الخير.وهذا أبعد ما يكون عن المثالية من منظور التنمية.يصبح الرمز غير قابل للقراءة، والصيانة بمثابة كابوس، وتتفاقم المزيد من المشكلات.

ما هو اقتراحك أو فكرتك لهذا الأمر ثلاثي الأبعاد؟هل الطريقة الوحيدة للقيام بذلك هي تحويل النظامين فعليًا (الإحداثيات ثنائية الأبعاد مقابل الإحداثيات والكيانات ثلاثية الأبعاد)؟أم أن هناك طريقة أكثر أناقة لتحقيق ذلك؟

-لماذا من المفيد تقديم عينات متعددة على بكسل واحد؟لأنه يمثل مجموعة البيانات بشكل أفضل.لنفترض أنه على بكسل واحد، لديك القيم 2 و5 و8.بسبب بعض خوارزميات حذف العينات، تم رسم الرقم 5 فقط.سينتقل الخط إلى 5 فقط، وليس إلى 8، وبالتالي يتم تشويه البيانات.يمكنك القول بالعكس أيضًا، ولكن حقيقة الأمر هي أن الحجة الأولى لها أهمية بالنسبة لمجموعات البيانات التي نعمل معها.وهذا هو بالضبط السبب وراء عدم قدرتنا على حذف العينات.

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

المحلول

مجموعة أدوات شائعة حقًا للتصور العلمي هي فتك, وأعتقد أنه يناسب احتياجاتك:

  1. إنها واجهة برمجة تطبيقات عالية المستوى، لذا لن تضطر إلى استخدام OpenGL (تم إنشاء VTK فوق OpenGL).هناك واجهات لـ C++، وPython، وJava، وTcl.أعتقد أن هذا من شأنه أن يبقي قاعدة التعليمات البرمجية الخاصة بك نظيفة جدًا.

  2. يمكنك استيراد جميع أنواع مجموعات البيانات إلى VTK (هناك الكثير من الأمثلة بدءًا من التصوير الطبي وحتى البيانات المالية).

  3. VTK سريع جدًا، ويمكنك توزيع خطوط رسومات VTK عبر أجهزة متعددة إذا كنت تريد إجراء تصورات كبيرة جدًا.

  4. متعلق:

    وهذا يجعلنا نعرض حوالي 25 مليون عينة في شاشة واحدة.

    [...]

    وبما أن هذه بيانات علمية، فلا يمكننا حذف أي عينات.على محمل الجد، هذا ليس خيارا.لا تبدأ حتى بالتفكير في الأمر.

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

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

نصائح أخرى

أود التعليق على تأكيدك بأنه لا يمكنك حذف العينات، على خلفية إجابة tgamblin.

يجب أن تفكر في البيانات التي ترسمها على الشاشة باعتبارها مشكلة أخذ عينات.أنت تتحدث عن 2.4 مليون نقطة من البيانات، وتحاول رسم ذلك على شاشة يبلغ عرضها بضعة آلاف من النقاط فقط (على الأقل أفترض ذلك، نظرًا لأنك قلق بشأن معدلات التحديث البالغة 30 إطارًا في الثانية)

وهذا يعني أنه لكل بكسل في المحور السيني الذي تعرضه بترتيب 1000 نقطة لا تحتاج إلى ذلك.حتى لو سلكت طريق استخدام وحدة معالجة الرسومات (GPU) الخاصة بك (على سبيل المثال.من خلال استخدام opengl) لا يزال هناك قدر كبير من العمل الذي يتعين على وحدة معالجة الرسومات القيام به للخطوط التي لن تكون مرئية.

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

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

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

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

لا داعي للقلق حقًا بشأن المحور Z إذا كنت لا ترغب في ذلك.في OpenGL (على سبيل المثال)، يمكنك تحديد رؤوس XY (مع Z=0 الضمنية)، وتشغيل zbuffer، واستخدام مصفوفة إسقاطية غير إسقاطية، وستكون في وضع ثنائي الأبعاد.

ذكر مارك بيسي أنك قد تفتقر إلى وحدات البكسل لعرض الرسم البياني.لكن بالنظر إلى تفسيراتك، أفترض أنك تعرف ما تفعله.

يحتوي OpenGL على وضع متعامد يحتوي على إحداثي z بالداخل (0;1).لا يوجد إسقاط منظور، وستكون المضلعات التي ترسمها مستوية بالنسبة لمنطقة قطع الشاشة.

سيكون لـ DirectX نفس الشيء.في OpenGL، يُسمى gluOrtho2d().

يسعد OpenGL بعرض ثنائي الأبعاد إذا قمت بإعداد الإسقاط ليكون Ortho (no z).كما يجب عليك القضاء على البيانات الخاصة بك.يعد عرض نفس البكسل 1000 مرة مضيعة لوحدة معالجة الرسومات.اقض وقتك مقدمًا باستخدام جهاز فك متعدد الخيوط.تأكد من تفجير صفائف كبيرة في وحدة معالجة الرسومات باستخدام صفائف قمة الرأس أو كائنات المخزن المؤقت الرأسي (من الواضح أنني من نوع OpenGL)

وهذا يجعلنا نعرض حوالي 25 مليون عينة في شاشة واحدة.

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

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

سامحني إذا فاتني شيء ما، وأنا أعظ الجوقة بالتصميم الأساسي الموجه للكائنات.مجرد قول'...

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

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

هل هناك المزيد من الاقتراحات؟

أردت أن أشير إلى أنه بالإضافة إلى استخدام VTK مباشرة، هناك منتجان آخران مبنيان على VTK قد يثيران اهتمامك.

1) ParaView (paraview.org) هي واجهة مستخدم مبنية على VTK والتي تجعل منتجات التصور العلمي أسهل بكثير.يمكنك عرض جميع البيانات التي تريدها بشرط أن يكون لديك الأجهزة اللازمة للتعامل معها، كما أنها تدعم MPI لمعالجات / نوى / مجموعات متعددة.إنه قابل للتوسيع عبر المكونات الإضافية التي أنشأها المستخدم ويستخدم أدوات آلية لبناء المشروع وتجميعه.

2) ParaViewGeo (paraviewgeo.mirarco.org) هو مشتق من الجيولوجيا واستكشاف التعدين من ParaView الذي تنتجه الشركة التي أعمل بها.يحتوي على دعم مدمج لقراءة تنسيقات الملفات التي لا يدعمها ParaView، مثل Gocad وDatamine وGeosoft وSGems وغيرها.والأهم من ذلك، أننا نعمل في كثير من الأحيان مع مجموعات أخرى لديها اهتمام بالأمور العلمية من خلال نتائج ذات ارتباطات فضفاضة بالتعدين، مثل عملنا الأخير مع مجموعة تقوم بنمذجة العناصر المحدودة/المنفصلة.قد يكون من المفيد التحقق من ذلك.

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

إذا كنت تبحث عن أرقام، فقد قمت اليوم بحساب ثلاث شبكات منتظمة مكونة من 8 ملايين خلية في PVG.احتوى أحدهما على خاصية متجهة مكونة من 7 صفوف (7 × 8 مليون قيمة مزدوجة)، بينما احتوى كل من الاثنين الآخرين على خاصية عددية (1 × 8 مليون قيمة مزدوجة لكل منهما) لإجمالي 72 مليون قيمة مزدوجة في الذاكرة.أعتقد أن حجم الذاكرة كان قريبًا من 500 ميجابايت ولكن كان لدي أيضًا مجموعة من 400000 نقطة حيث تحتوي كل نقطة على خاصية ناقل مكونة من 7 صفوف وبعض البيانات المتنوعة الأخرى المتاحة أيضًا.

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

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

بادئ ذي بدء، لا يمكننا حذف أي عينات عند التقديم.هذا مستحيل.وهذا يعني أن العرض غير دقيق بالنسبة للبيانات التي يستند إليها الرسم البياني.هذه حقا منطقة محظورة.فترة.

ثانيا نحن نكون تقديم كافة العينات.قد ينتهي الأمر بعينات متعددة على نفس البكسل.ولكن لا يزال، ونحن نقدم ذلك.يتم تحويل بيانات العينة على الشاشة.وهكذا يتم تقديمه.يمكن للمرء أن يشك في فائدة هذه البيانات المرئية، حيث يطالب علماء بايت (عملاؤنا) في الواقع بأن نقوم بذلك بهذه الطريقة.ولديهم نقطة جيدة، IMHO.

قم بتغليف المكتبة في مكتبة ثنائية الأبعاد أكثر لطفاً ولطفاً باستخدام حرف Z وتم ضبط التدوير على 0.

-آدم

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