AoS و SoA

في مجال الحوسبة ، تعتبر مصفوفة الهياكل (AoS) أو بنية المصفوفات (SoA) أو مصفوفة هياكل المصفوفات (AoSoA) طرقًا متناقضة لترتيب سلسلة من السجلات في الذاكرة ، فيما يتعلق بالتداخل ، وهي ذات أهمية في برمجة SIMD و SIMT .

بنية المصفوفات

بنية المصفوفات ( SoA ) هي تخطيط يفصل عناصر السجل ( أو "struct" في لغة البرمجة C ) إلى مصفوفة متوازية واحدة لكل حقل . [ 1 ] الدافع وراء ذلك هو تسهيل التعامل مع تعليمات SIMD المعبأة في معظم بنى مجموعات التعليمات ، حيث يمكن لمسجل SIMD واحد تحميل بيانات متجانسة ، والتي قد تُنقل عبر مسار بيانات داخلي واسع (مثل 128 بت ). إذا كانت هناك حاجة إلى جزء محدد فقط من السجل، فسيتم تكرار تلك الأجزاء فقط، مما يسمح بتخزين المزيد من البيانات في سطر ذاكرة تخزين مؤقت واحد. أما الجانب السلبي فهو الحاجة إلى المزيد من مسارات ذاكرة التخزين المؤقت عند اجتياز البيانات، بالإضافة إلى عدم كفاءة العنونة المفهرسة .

على سبيل المثال، لتخزين N نقطة في الفضاء ثلاثي الأبعاد باستخدام بنية من المصفوفات:

struct Vector3List {float x [ N ];float y [ N ];float z [ N ];};struct Vector3List points ;float get_point_x ( size_t i ) {أعد النقاط . س [ أ }

مجموعة من الهياكل

تُعدّ مصفوفة الهياكل ( AoS ) تخطيطًا معاكسًا (وأكثر شيوعًا)، حيث تتداخل بيانات الحقول المختلفة. غالبًا ما يكون هذا أكثر سهولة في الفهم، وتدعمه معظم لغات البرمجة بشكل مباشر .

على سبيل المثال، لتخزين N نقطة في الفضاء ثلاثي الأبعاد باستخدام مصفوفة من الهياكل:

struct Vector3 {float x ;float y ;float z ;};struct Vector3 points [ N ];float get_point_x ( size_t i ) {أعد النقاط [ i ]. x ;}

مصفوفة من هياكل المصفوفات

مصفوفة هياكل المصفوفات ( AoSoA ) أو مصفوفة الهياكل المُجزأة هي نهج هجين بين التخطيطات السابقة، حيث يتم دمج بيانات الحقول المختلفة باستخدام مربعات أو كتل بحجم يساوي حجم متجه SIMD. غالبًا ما يكون هذا النهج أقل بديهية، ولكنه يحقق إنتاجية الذاكرة لنهج SoA، مع كونه أكثر ملاءمة لبنية موضع ذاكرة التخزين المؤقت ومنافذ التحميل في المعالجات الحديثة. [ 2 ] على وجه الخصوص، يجب تلبية طلبات الذاكرة في المعالجات الحديثة بعرض ثابت (مثل حجم سطر ذاكرة التخزين المؤقت [ 3 ] ). يُحاذي التخزين المُجزأ في AoSoA نمط الوصول إلى الذاكرة مع العرض الثابت للطلبات، مما يؤدي إلى تقليل عمليات الوصول لإكمال طلب الذاكرة وبالتالي زيادة الكفاءة. [ 4 ]

على سبيل المثال، لتخزين N نقطة في الفضاء ثلاثي الأبعاد باستخدام مصفوفة من هياكل المصفوفات بعرض سجل SIMD يبلغ 8 أرقام عشرية (أو 8 × 32 = 256 بت):

struct Vector3x8 {float x [ 8 ];float y [ 8 ];float z [ 8 ];};struct Vector3x8 points [( N + 7 ) / 8 ];float get_point_x ( size_t i ) {return points [ i / 8 ]. x [ i % 8 ];}

قد يتطلب الأمر عرضًا مختلفًا اعتمادًا على عرض سجل SIMD الفعلي. ويمكن استبدال المصفوفات الداخلية بأنواع SIMD، كما هو الحال float32x8في اللغات التي تدعم هذه الميزة.

البدائل

متجهات رباعية الأبعاد

يُتيح نظام AoS مقابل نظام SoA خيارًا عند النظر في بيانات المتجهات ثلاثية أو رباعية الأبعاد على أجهزة مزودة بمعالجات SIMD رباعية المسارات. عادةً ما تُصمم مجموعات تعليمات SIMD للبيانات المتجانسة، إلا أن بعضها يوفر تعليمات الضرب النقطي [ 5 ] وتباديل إضافية، مما يُسهّل التعامل مع حالة AoS.

على الرغم من أن معظم أجهزة معالجة الرسومات قد تحولت من استخدام تعليمات رباعية الأبعاد إلى خطوط أنابيب SIMT العددية ، [ 6 ] إلا أن نوى الحوسبة الحديثة التي تستخدم SoA بدلاً من AoS لا تزال قادرة على تقديم أداء أفضل بفضل تجميع الذاكرة. [ 7 ]

دعم البرامج

تدعم معظم اللغات تنسيق AoS بشكل طبيعي أكثر من خلال الجمع بين السجلات وأنواع البيانات المجردة المختلفة للمصفوفات .

توجد بنية الخدمات الموجهة (SoA) في الغالب في اللغات أو المكتبات أو أدوات البرمجة الوصفية المستخدمة لدعم التصميم الموجه نحو البيانات . ومن الأمثلة على ذلك:

  • "إطارات البيانات"، كما تم تنفيذها في R ، وحزمة Pandas الخاصة بـ Python ، وحزمة DataFrames.jl الخاصة بـ Julia ، هي واجهات للوصول إلى SoA مثل AoS.
  • تتيح حزمة جوليا StructArrays.jl الوصول إلى SoA كـ AoS لدمج أداء SoA مع سهولة استخدام AoS.
  • مولدات التعليمات البرمجية للغة C، بما في ذلك Datadraw وتقنية X Macro .

يُعدّ إنشاء AoSoA تلقائيًا أكثر تعقيدًا. يوجد مثال على AoSoA في البرمجة الوصفية في مكتبة Cabana التابعة لمختبر لوس ألاموس الوطني (LANL ) والمكتوبة بلغة C++؛ حيث تفترض عرضًا متجهيًا يبلغ 16 مسارًا افتراضيًا. [ 8 ]

مراجع

  1. "كيفية معالجة بنية البيانات لتحسين استخدام الذاكرة" . إنتل. 9 فبراير 2012. تم الاطلاع عليه بتاريخ 17 مارس 2019 .
  2. "تحويلات تخطيط الذاكرة" . إنتل. 2019-03-26 . تم الاسترجاع في 2019-06-02 .
  3. "دليل تحليل أداء النواة" (ملف PDF) . NVIDIA. 2022-12-01 . تم الاطلاع عليه بتاريخ 2022-01-14 .)
  4. ^ فاي ، يون (ريموند) ؛ هوانغ، يوهان؛ Gao, Ming (2021)، “مبادئ نحو المحاكاة في الوقت الحقيقي لطريقة النقاط المادية على وحدات معالجة الرسومات الحديثة”، الصفحات من 1 إلى 16، أرخايف : 2111.00699 [ cs.GR ] 
  5. "الخصائص الداخلية لعملية الضرب النقطي في نظام SSE4 من إنتل" . إنتل. مؤرشف من الأصل بتاريخ 24-06-2016 . تم الاطلاع عليه بتاريخ 17-03-2019 .
  6. "معمارية وحدة معالجة الرسومات الحديثة (انظر خطوط الأنابيب الموحدة العددية)" (ملف PDF) . إنفيديا. مؤرشف من الأصل (ملف PDF) بتاريخ 17 مايو 2018. تم الاطلاع عليه بتاريخ 17 مارس 2019 .
  7. كيم، هيسون (2010-02-08). "استراتيجيات تحسين CUDA" (ملف PDF) . CS4803 تصميم منصات ألعاب الفيديو . تم الاطلاع عليه بتاريخ 2019-03-17 .
  8. ^ "ECP-copa/Cabana: AoSoA" . جيثب .