معالج المتجهات
في الحوسبة ، معالج المتجهات أو معالج المصفوفات هو وحدة معالجة مركزية (CPU) تنفذ مجموعة تعليمات حيث تم تصميم تعليماتها للعمل بكفاءة وفعالية على مصفوفات كبيرة أحادية البعد من البيانات تسمى المتجهات . وهذا على النقيض من المعالجات القياسية ، التي تعمل تعليماتها على عناصر بيانات مفردة فقط، وعلى النقيض من بعض نفس المعالجات القياسية التي تحتوي على تعليمات مفردة إضافية أو بيانات متعددة (SIMD) أو SIMD داخل وحدات حسابية مسجلة (SWAR). يمكن لمعالجات المتجهات تحسين الأداء بشكل كبير على أحمال عمل معينة، ولا سيما المحاكاة العددية والمهام المماثلة. تعمل تقنيات معالجة المتجهات أيضًا في أجهزة وحدة تحكم ألعاب الفيديو وفي مسرعات الرسومات .
ظهرت الآلات المتجهة في أوائل سبعينيات القرن العشرين وهيمنت على تصميم الحواسيب العملاقة خلال السبعينيات وحتى التسعينيات، وخاصة منصات Cray المختلفة . أدى الانخفاض السريع في نسبة السعر إلى الأداء في تصميمات المعالجات الدقيقة التقليدية إلى انخفاض الحواسيب العملاقة المتجهة خلال التسعينيات.
تاريخ
البحث والتطوير المبكر
بدأ تطوير معالجة المتجهات في أوائل الستينيات في شركة ويستنجهاوس إلكتريك في مشروع سولومون . كان هدف سولومون هو زيادة أداء الرياضيات بشكل كبير باستخدام عدد كبير من المعالجات المساعدة البسيطة تحت سيطرة وحدة معالجة مركزية رئيسية واحدة . قامت وحدة المعالجة المركزية بتغذية تعليمة مشتركة واحدة لجميع وحدات المنطق الحسابي (ALUs)، واحدة لكل دورة، ولكن مع نقطة بيانات مختلفة لكل منها للعمل عليها. سمح هذا لجهاز سولومون بتطبيق خوارزمية واحدة على مجموعة بيانات كبيرة ، يتم تغذيتها في شكل مصفوفة. [ بحاجة لمصدر ]
في عام 1962، ألغت شركة ويستنجهاوس المشروع، ولكن تم استئناف الجهود من قبل جامعة إلينوي في أوربانا-شامبين باسم ILLIAC IV . كانت نسختهم من التصميم تدعو في الأصل إلى جهاز 1 جيجا فلوب مع 256 وحدة حسابية منطقية، ولكن عندما تم تسليمه أخيرًا في عام 1972، كان به 64 وحدة حسابية منطقية فقط ويمكن أن يصل إلى 100 إلى 150 مليون فلوب فقط. ومع ذلك، فقد أظهر أن المفهوم الأساسي كان سليمًا، وعند استخدامه في التطبيقات كثيفة البيانات، مثل ديناميكيات السوائل الحسابية ، كان ILLIAC أسرع جهاز في العالم. إن نهج ILLIAC المتمثل في استخدام وحدات حسابية منطقية منفصلة لكل عنصر بيانات ليس شائعًا في التصميمات اللاحقة، وغالبًا ما يُشار إليه ضمن فئة منفصلة، الحوسبة المتوازية الضخمة . في هذا الوقت تقريبًا، صنف فلين هذا النوع من المعالجة على أنه شكل مبكر من التعليمة الفردية والخيوط المتعددة (SIMT). [ بحاجة لمصدر ]
سعت شركة International Computers Limited إلى تجنب العديد من الصعوبات المرتبطة بمفهوم ILLIAC من خلال تصميمها الخاص لمعالج المصفوفات الموزعة (DAP)، وتصنيف ILLIAC وDAP كمعالجات مصفوفات خلوية من المحتمل أن تقدم فوائد أداء كبيرة مقارنة بتصميمات معالجات المتجهات التقليدية مثل CDC STAR-100 وCray 1. [1]
كمبيوتر للعمليات ذات الوظائف
تم تقديم وتطوير جهاز كمبيوتر للعمليات ذات الوظائف بواسطة كارتسيف في عام 1967. [ 2 ]
أجهزة الكمبيوتر العملاقة
لا يستشهد هذا القسم بأي مصادر . ( يوليو 2023 ) |
كانت أول أجهزة الكمبيوتر العملاقة المتجهة هي جهاز STAR-100 من شركة Control Data Corporation وجهاز الكمبيوتر العلمي المتقدم (ASC) من شركة Texas Instruments ، واللذان تم تقديمهما في عامي 1974 و1972 على التوالي.
استخدمت وحدة الحساب والمنطق الأساسية (ASC) (أي "أنبوب واحد") بنية خط أنابيب تدعم كل من الحسابات القياسية والمتجهية، مع أداء ذروة يصل إلى حوالي 20 MFLOPS، وهو ما تم تحقيقه بسهولة عند معالجة المتجهات الطويلة. تدعم تكوينات وحدة الحساب والمنطق الموسعة "أنبوبين" أو "أربعة أنابيب" مع زيادة في الأداء 2X أو 4X. كان عرض النطاق الترددي للذاكرة كافياً لدعم هذه الأوضاع الموسعة.
كان جهاز STAR-100 أبطأ من أجهزة الكمبيوتر العملاقة التابعة لشركة CDC مثل جهاز CDC 7600 ، ولكن في المهام المتعلقة بالبيانات كان بإمكانه مواكبة ذلك مع كونه أصغر حجمًا وأقل تكلفة. ومع ذلك، استغرق الجهاز أيضًا وقتًا طويلاً في فك شفرة تعليمات المتجه والاستعداد لتشغيل العملية، لذلك كان يتطلب مجموعات بيانات محددة للغاية للعمل عليها قبل تسريع أي شيء بالفعل.
تم استغلال تقنية المتجه بالكامل لأول مرة في عام 1976 بواسطة Cray-1 الشهير . بدلاً من ترك البيانات في الذاكرة مثل STAR-100 وASC، كان تصميم Cray يحتوي على ثمانية سجلات متجهة ، والتي تحتوي على أربعة وستين كلمة بطول 64 بت لكل منها. تم تطبيق تعليمات المتجه بين السجلات، وهو أسرع بكثير من التحدث إلى الذاكرة الرئيسية. بينما كان STAR-100 يطبق عملية واحدة عبر متجه طويل في الذاكرة ثم ينتقل إلى العملية التالية، كان تصميم Cray يحمل قسمًا أصغر من المتجه في السجلات ثم يطبق أكبر عدد ممكن من العمليات على تلك البيانات، وبالتالي تجنب العديد من عمليات الوصول إلى الذاكرة الأبطأ كثيرًا.
استخدم تصميم Cray التوازي في خطوط الأنابيب لتنفيذ تعليمات المتجهات بدلاً من وحدات الحساب والمنطق المتعددة. بالإضافة إلى ذلك، كان التصميم يحتوي على خطوط أنابيب منفصلة تمامًا لتعليمات مختلفة، على سبيل المثال، تم تنفيذ الجمع/الطرح في أجهزة مختلفة عن الضرب. سمح هذا بتوجيه مجموعة من تعليمات المتجهات إلى كل وحدة فرعية من وحدات الحساب والمنطق، وهي التقنية التي أطلقوا عليها تسلسل المتجهات . كان أداء Cray-1 عادةً حوالي 80 MFLOPS، ولكن مع تشغيل ما يصل إلى ثلاث سلاسل، يمكن أن يصل إلى ذروته عند 240 MFLOPS ومتوسط حوالي 150 - أسرع بكثير من أي جهاز في ذلك العصر.

وتبع ذلك أمثلة أخرى. حاولت شركة Control Data Corporation إعادة دخول السوق الراقية مرة أخرى بجهازها ETA-10 ، لكن مبيعاته لم تكن جيدة واستغلت الشركة ذلك كفرصة لمغادرة مجال الحوسبة الفائقة تمامًا. في أوائل ومنتصف الثمانينيات، قدمت شركات يابانية ( Fujitsu و Hitachi و Nippon Electric Corporation (NEC) آلات متجهة تعتمد على السجلات تشبه Cray-1، وكانت عادةً أسرع قليلاً وأصغر حجمًا بكثير. قامت شركة Floating Point Systems (FPS) ومقرها ولاية أوريغون ببناء معالجات صفيف إضافية لأجهزة الكمبيوتر الصغيرة ، ثم قامت لاحقًا ببناء أجهزة الكمبيوتر الفائقة الصغيرة الخاصة بها .
طوال الوقت، استمرت Cray في كونها رائدة الأداء، حيث تغلبت باستمرار على المنافسة بسلسلة من الآلات التي أدت إلى Cray-2 و Cray X-MP و Cray Y-MP . منذ ذلك الحين، ركزت سوق أجهزة الكمبيوتر العملاقة بشكل أكبر على المعالجة المتوازية الضخمة بدلاً من التنفيذات الأفضل لمعالجات المتجهات. ومع ذلك، وإدراكًا لفوائد معالجة المتجهات، طورت IBM بنية المتجهات الافتراضية لاستخدامها في أجهزة الكمبيوتر العملاقة التي تربط بين العديد من المعالجات القياسية للعمل كمعالج متجه.
على الرغم من أن أجهزة الكمبيوتر العملاقة المتجهة التي تشبه Cray-1 أصبحت أقل شعبية هذه الأيام، إلا أن شركة NEC استمرت في تصنيع هذا النوع من أجهزة الكمبيوتر حتى يومنا هذا من خلال سلسلة أجهزة الكمبيوتر SX . ومؤخرًا، وضعت SX-Aurora TSUBASA المعالج و24 أو 48 جيجابايت من الذاكرة على وحدة HBM 2 داخل بطاقة تشبه فعليًا معالج الرسوميات المساعد، ولكن بدلاً من العمل كمعالج مساعد، فهي الكمبيوتر الرئيسي مع الكمبيوتر المتوافق مع الكمبيوتر الشخصي الذي يتم توصيله به لأداء وظائف الدعم.
وحدة معالجة الرسوميات
تتضمن وحدات معالجة الرسوميات الحديثة ( GPUs ) مجموعة من خطوط أنابيب التظليل التي قد يتم تشغيلها بواسطة نوى الحوسبة ، ويمكن اعتبارها معالجات متجهة (باستخدام استراتيجية مماثلة لإخفاء أوقات استجابة الذاكرة). كما هو موضح في ورقة فلين لعام 1972، فإن العامل المميز الرئيسي لوحدات معالجة الرسوميات القائمة على SIMT هو أنها تحتوي على جهاز فك تشفير-بث تعليمات واحد ولكن النوى التي تتلقى وتنفذ نفس التعليمات تكون طبيعية بشكل معقول بخلاف ذلك: وحدات المنطق الحسابية الخاصة بها وملفات السجل الخاصة بها ووحدات التحميل/التخزين الخاصة بها وذاكرة التخزين المؤقت للبيانات L1 المستقلة الخاصة بها. وبالتالي، على الرغم من أن جميع النوى تنفذ نفس التعليمات بالضبط في نفس الوقت مع بعضها البعض، إلا أنها تفعل ذلك ببيانات مختلفة تمامًا من مواقع ذاكرة مختلفة تمامًا. هذا أكثر تعقيدًا وتداخلًا بشكل كبير من "Packed SIMD" ، والذي يقتصر بشكل صارم على تنفيذ العمليات الحسابية المتوازية فقط. على الرغم من أن التفاصيل الداخلية الدقيقة لوحدات معالجة الرسومات التجارية اليوم تعتبر أسرارًا خاصة، إلا أن فريق MIAOW [3] كان قادرًا على تجميع معلومات قصصية كافية لتنفيذ مجموعة فرعية من بنية AMDGPU. [4]
التطورات الأخيرة
يتم تصميم العديد من بنيات وحدة المعالجة المركزية الحديثة كمعالجات متجهة. يتبع امتداد متجه RISC-V مبادئ مماثلة لمعالجات المتجهات المبكرة، ويتم تنفيذه في المنتجات التجارية مثل Andes Technology AX45MPV. [5] هناك أيضًا العديد من بنيات معالجات المتجهات مفتوحة المصدر قيد التطوير، بما في ذلك ForwardCom و Libre-SOC .
مقارنة مع العمارة الحديثة
اعتبارًا من عام 2016، [تحديث]تنفذ معظم وحدات المعالجة المركزية التجارية بنيات تتميز بتعليمات SIMD ذات الطول الثابت. عند الفحص الأول، يمكن اعتبار هذه شكلاً من أشكال معالجة المتجهات لأنها تعمل على مجموعات بيانات متعددة (متجهة، بطول صريح)، وتستعير ميزات من معالجات المتجهات. ومع ذلك، بحكم التعريف، لا يمكن لإضافة SIMD، في حد ذاتها، أن تؤهل المعالج كمعالج متجه فعلي ، لأن SIMD بطول ثابت ، والمتجهات بطول متغير . يتم توضيح الفرق أدناه بأمثلة توضح وتقارن الفئات الثلاث: SIMD النقية، وSIMD المتوقعة، ومعالجة المتجهات النقية. [ بحاجة لمصدر ]
- SIMD النقية (الثابتة) - والمعروفة أيضًا باسم "SIMD المعبأة"، [6] SIMD داخل سجل (SWAR)، والمعالج الموجه في تصنيف فلين. تشمل الأمثلة الشائعة التي تستخدم SIMD مع ميزات مستوحاة من معالجات المتجهات ما يلي: تعليمات MMX و SSE و AVX الخاصة بـ Intel x86، وامتدادات 3DNow! الخاصة بـ AMD، وARM NEON ، وامتداد VIS الخاص بـ Sparc ، و AltiVec الخاص بـ PowerPC و MSA الخاص بـ MIPS . في عام 2000، تعاونت IBM و Toshiba و Sony لإنشاء معالج Cell ، وهو أيضًا SIMD.
- SIMD المتوقعة - تُعرف أيضًا باسم المعالجة الترابطية . هناك مثالان بارزان لهما تنبؤ لكل عنصر (على أساس المسار) وهما ARM SVE2 و AVX-512
- المتجهات النقية - كما تم تصنيفها في تصنيف Duncan - تتضمن Cray-1 الأصلي و Convex C-Series و NEC SX و RISC-V RVV . على الرغم من أنه يعتمد على الذاكرة، إلا أن CDC STAR-100 كان أيضًا معالجًا متجهًا.
تتضمن تصميمات وحدة المعالجة المركزية الأخرى بعض التعليمات المتعددة لمعالجة المتجهات على مجموعات بيانات متعددة (متجهة)، والمعروفة عادةً باسم MIMD (تعليمات متعددة، بيانات متعددة) ويتم تنفيذها باستخدام VLIW (كلمة تعليمات طويلة جدًا) و EPIC (حوسبة تعليمات متوازية صريحة). يجمع معالج Fujitsu FR-V VLIW/vector بين التقنيتين.
الفرق بين معالجات SIMD ومعالجات المتجهات
تفتقر مجموعات تعليمات SIMD إلى ميزات أساسية عند مقارنتها بمجموعات تعليمات المتجهات. وأهم هذه الميزات هو أن معالجات المتجهات، بحكم التعريف والتصميم، كانت دائمًا متغيرة الطول منذ إنشائها.
في حين أن SIMD النقي (عرض ثابت، بدون تنبؤ) غالبًا ما يُزعم خطأً أنه "متجه" (لأن SIMD تعالج البيانات التي تصادف أنها متجهات)، من خلال التحليل الدقيق ومقارنة ISAs التاريخية والحديثة، يمكن ملاحظة أن ISAs المتجهة الفعلية تتمتع بالميزات التالية التي لا يمتلكها أي SIMD ISA: [ بحاجة لمصدر ]
- طريقة لتعيين طول المتجه، مثل
vsetvlالتعليمات الموجودة في RISCV RVV، [7] أوlvlالتعليمات الموجودة في NEC SX، [8] دون تقييد الطول بقوة اثنين أو مضاعف لعرض بيانات ثابت. - التكرار والاختزال على العناصر داخل المتجهات.
SIMD المتوقعة (جزء من تصنيف فلين ) والتي هي أقنعة تنبؤ شاملة على مستوى العناصر الفردية لكل تعليمة متجه كما هو متاح الآن في ARM SVE2. [9] و AVX-512 ، مؤهلة تقريبًا كمعالج متجه. [ كيف؟ ] تستخدم SIMD المتوقعة وحدات SIMD ALU ذات العرض الثابت ولكنها تسمح بالتنشيط المحلي (المتوقع) للوحدات لتوفير مظهر متجهات ذات طول متغير. تساعد الأمثلة أدناه في شرح هذه التمييزات التصنيفية.
نظرًا لاستخدام SIMD لمعالجة الدفعات ذات العرض الثابت، فهي غير قادرة من حيث التصميم على التعامل مع التكرار والاختزال. ويتضح هذا بمزيد من التفصيل من خلال الأمثلة أدناه.

بالإضافة إلى ذلك، يمكن أن تكون معالجات المتجهات أكثر كفاءة في استخدام الموارد من خلال استخدام أجهزة أبطأ وتوفير الطاقة، ولكنها لا تزال تحقق الإنتاجية ويكون لديها زمن انتقال أقل من SIMD، من خلال تسلسل المتجهات . [10] [11]
لنفترض أن معالج SIMD ومعالج متجه يعملان على 4 عناصر 64 بت، ويقومان بتسلسل LOAD وADD وMULTIPLY وSTORE. إذا كان عرض SIMD 4، فيجب على معالج SIMD تحميل أربعة عناصر بالكامل قبل أن يتمكن من الانتقال إلى ADDs، ويجب أن يكمل جميع ADDs قبل أن يتمكن من الانتقال إلى MULTIPLYs، وبالمثل يجب أن يكمل جميع MULTIPLYs قبل أن يتمكن من بدء STOREs. هذا بحكم التعريف والتصميم. [12]
إن الاضطرار إلى إجراء 4 عمليات تحميل 64 بت ومخازن 64 بت في وقت واحد على نطاق واسع أمر مكلف للغاية في الأجهزة (مسارات بيانات 256 بت إلى الذاكرة). وبالمثل، فإن وجود 4 وحدات حسابية منطقية 64 بت، وخاصة MULTIPLY. لتجنب هذه التكاليف المرتفعة، يجب أن يحتوي معالج SIMD على عملية تحميل 64 بت بعرض واحد، ووحدة تخزين 64 بت بعرض واحد، ووحدتي حسابية منطقية 64 بت بعرضين فقط. وكما هو موضح في الرسم التخطيطي، والذي يفترض نموذج تنفيذ متعدد المشكلات ، فإن العواقب هي أن العمليات تستغرق الآن وقتًا أطول لإكمالها. إذا لم يكن تعدد المشكلات ممكنًا، فإن العمليات تستغرق وقتًا أطول لأنه قد لا يتم إصدار LD (بدء تشغيله) في نفس وقت عمليات الإضافة الأولى، وهكذا. إذا كان هناك 4 وحدات SIMD ALU ذات عرض 64 بت فقط، فإن وقت الإكمال يكون أسوأ: فقط عندما تكتمل عمليات التحميل الأربعة يمكن أن تبدأ عمليات SIMD، وفقط عندما تكتمل عمليات ALU يمكن أن تبدأ عمليات STOREs.
على النقيض من ذلك، حتى لو كان معالج المتجهات أحادي الإصدار ولا يستخدم وحدات حسابية منطقية منطقية SIMD، والذي يحتوي فقط على LOAD بعرض 1 وبسعة 64 بت وSTORE بعرض 1 وبسعة 64 بت (وكما هو الحال في Cray-1 ، القدرة على تشغيل MULTIPLY في وقت واحد مع ADD)، فقد يكمل العمليات الأربع بشكل أسرع من معالج SIMD مع LOAD بعرض 1 وبسعة 1 وSTORE بعرض 2 وSIMD بعرض 2. يعد هذا الاستخدام الأكثر كفاءة للموارد، بسبب تسلسل المتجهات ، ميزة واختلافًا رئيسيًا مقارنةً بـ SIMD. لا يمكن لـ SIMD، بحكم التصميم والتعريف، إجراء تسلسل إلا للمجموعة الكاملة من النتائج. [13]
وصف
بشكل عام، تستطيع وحدات المعالجة المركزية التعامل مع قطعة أو قطعتين من البيانات في وقت واحد. على سبيل المثال، تحتوي معظم وحدات المعالجة المركزية على تعليمة تقول في الأساس "أضف A إلى B وضع النتيجة في C". يمكن ترميز البيانات الخاصة بـ A وB وC مباشرة في التعليمات - من الناحية النظرية على الأقل. ومع ذلك، نادرًا ما تكون الأمور بهذه البساطة في التنفيذ الفعال. نادرًا ما يتم إرسال البيانات في شكل خام، وبدلاً من ذلك يتم "الإشارة إليها" عن طريق تمرير عنوان إلى موقع ذاكرة يحمل البيانات. يستغرق فك تشفير هذا العنوان وإخراج البيانات من الذاكرة بعض الوقت، وخلال هذا الوقت، كانت وحدة المعالجة المركزية تقليديًا تنتظر ظهور البيانات المطلوبة. ومع زيادة سرعات وحدة المعالجة المركزية، أصبح هذا التأخير في الذاكرة تاريخيًا عائقًا كبيرًا للأداء؛ انظر ذاكرة الوصول العشوائي § جدار الذاكرة .
من أجل تقليل مقدار الوقت الذي تستغرقه هذه الخطوات، تستخدم معظم وحدات المعالجة المركزية الحديثة تقنية تُعرف باسم خط أنابيب التعليمات حيث تمر التعليمات عبر عدة وحدات فرعية بدورها. تقرأ الوحدة الفرعية الأولى العنوان وتفك شفرته، ثم "تجلب" الوحدة الفرعية التالية القيم الموجودة في تلك العناوين، ثم تقوم الوحدة الفرعية التالية بالعملية الحسابية بنفسها. في خط الأنابيب، تتمثل "الحيلة" في البدء في فك شفرة التعليمات التالية حتى قبل أن تغادر الأولى وحدة المعالجة المركزية، على غرار خط التجميع ، بحيث يكون فك تشفير العنوان قيد الاستخدام باستمرار. تستغرق أي تعليمة معينة نفس القدر من الوقت لإكمالها، وهو الوقت المعروف باسم زمن الوصول ، ولكن وحدة المعالجة المركزية يمكنها معالجة دفعة كاملة من العمليات، بطريقة متداخلة، بشكل أسرع وأكثر كفاءة مما لو فعلت ذلك واحدة تلو الأخرى.
وتذهب معالجات المتجهات إلى أبعد من هذا المفهوم. فبدلاً من توجيه التعليمات فقط، فإنها تقوم أيضاً بتوجيه البيانات نفسها. ويتلقى المعالج تعليمات لا تنص فقط على إضافة A إلى B، بل وأيضاً إضافة جميع الأرقام "من هنا إلى هنا" إلى جميع الأرقام "من هناك إلى هناك". وبدلاً من الاضطرار إلى فك تشفير التعليمات باستمرار ثم جلب البيانات اللازمة لاستكمالها، يقرأ المعالج تعليمة واحدة من الذاكرة، ويضمن تعريف التعليمة نفسها ببساطة أن التعليمات ستعمل مرة أخرى على عنصر آخر من البيانات، عند عنوان أكبر بمقدار زيادة واحدة من العنوان السابق. وهذا يسمح بتوفير كبير في وقت فك التشفير.
ولتوضيح الفرق الذي يمكن أن يحدثه هذا، فلنتأمل المهمة البسيطة المتمثلة في جمع مجموعتين من 10 أرقام معًا. ففي لغة برمجة عادية، يكتب المرء "حلقة" تلتقط كل زوج من الأرقام بالترتيب، ثم تجمعها. وبالنسبة لوحدة المعالجة المركزية، سيبدو هذا الأمر على هذا النحو:
آلة RISC افتراضية
؛ افترض أن a وb وc هي مواقع ذاكرة في سجلاتها الخاصة
؛ أضف 10 أرقام في a إلى 10 أرقام في b، وقم بتخزين النتائج في c.
نقل 10 ، count ؛ count := 10 حلقة: تحميل r1 ، a تحميل r2 ، b إضافة r3 ، r1 ، r2 ؛ r3 := r1 + r2 تخزين r3 ، c إضافة a ، a ، $4 ؛ نقل إضافة b ، b ، $4 إضافة c ، c ، $4 تقليل count ؛ تقليل jnez count ، حلقة ؛ العودة إلى الوراء إذا لم يكن count 0 بعد ret
ولكن بالنسبة لمعالج المتجهات، تبدو هذه المهمة مختلفة إلى حد كبير:
; افترض أن لدينا سجلات متجهة v1-v3
؛ بحجم يساوي أو أكبر من 10
move $10 ، count ؛ count = 10 vload v1 ، a ، count vload v2 ، b ، count vadd v3 ، v1 ، v2 vstore v3 ، c ، count ret
لاحظ الافتقار التام للتكرار في التعليمات، لأن الأجهزة هي التي قامت بأداء 10 عمليات متتالية: في الواقع، يكون عدد الحلقات على أساس كل تعليمة على حدة .
تتخذ ISAs المتجهة على غرار Cray خطوة أبعد من ذلك وتوفر سجل "عد" عالميًا، يسمى طول المتجه (VL):
؛ مرة أخرى افترض أن لدينا سجلات متجهات v1-v3
؛ بحجم أكبر من أو يساوي 10
setvli $10 # تعيين طول المتجه VL=10 vload v1 ، a # 10 تحميلات من a vload v2 ، b # 10 تحميلات من b vadd v3 ، v1 ، v2 # 10 يضيف vstore v3 ، c # 10 يخزن في c ret
هناك العديد من المدخرات المتأصلة في هذا النهج. [14]
- لا يلزم سوى ثلاث ترجمات للعناوين. واعتمادًا على البنية المعمارية، يمكن أن يمثل هذا في حد ذاته توفيرًا كبيرًا.
- هناك طريقة أخرى لتوفير المال وهي جلب التعليمات وفك تشفيرها نفسها، وهو أمر يجب القيام به مرة واحدة فقط بدلاً من عشر مرات.
- كما أن الكود نفسه أصغر حجمًا، مما قد يؤدي إلى استخدام أكثر كفاءة للذاكرة، وتقليل حجم ذاكرة التخزين المؤقت لتعليمات L1، وتقليل استهلاك الطاقة.
- مع تقليل حجم البرنامج، أصبحت مهمة التنبؤ بالفرع أسهل.
- مع عدم تضمين الطول (المكافئ لعرض SIMD) في التعليمات، فإن التشفير ليس أكثر إحكاما فحسب، بل إنه أيضًا "مستعد للمستقبل" ويسمح حتى لتصميمات المعالجات المضمنة بالتفكير في استخدام المتجهات بحتة للحصول على جميع المزايا الأخرى، بدلاً من الذهاب إلى الأداء العالي.
بالإضافة إلى ذلك، في معالجات المتجهات الأكثر حداثة، تم تقديم "الفشل أولاً" أو "الخطأ أولاً" (انظر أدناه) مما يوفر المزيد من المزايا.
ولكن أكثر من ذلك، قد يحتوي معالج متجه عالي الأداء على وحدات وظيفية متعددة تجمع هذه الأرقام بالتوازي. ولا يلزم التحقق من التبعيات بين هذه الأرقام لأن تعليمات المتجه تحدد عمليات مستقلة متعددة. وهذا يبسط منطق التحكم المطلوب، ويمكن أن يحسن الأداء بشكل أكبر من خلال تجنب التوقف. وبالتالي، تكتمل العمليات الحسابية بشكل أسرع بكثير بشكل عام، والعامل المحدد هو الوقت المطلوب لجلب البيانات من الذاكرة.
لا يمكن حل جميع المشاكل بهذا النوع من الحلول. فإدراج هذه الأنواع من التعليمات يضيف بالضرورة تعقيدًا إلى وحدة المعالجة المركزية الأساسية. وهذا التعقيد يجعل التعليمات الأخرى تعمل بشكل أبطأ عادةً، أي عندما لا يتم جمع العديد من الأرقام على التوالي. كما تضيف التعليمات الأكثر تعقيدًا إلى تعقيد أجهزة فك التشفير، مما قد يؤدي إلى إبطاء فك تشفير التعليمات الأكثر شيوعًا مثل الإضافة العادية. ( يمكن التخفيف من هذا إلى حد ما من خلال الاحتفاظ بمبادئ ISA بالكامل إلى RISC : يضيف RVV حوالي 190 تعليمة متجهة فقط حتى مع الميزات المتقدمة. [15] )
تم تصميم معالجات المتجهات تقليديًا للعمل بشكل أفضل فقط عندما تكون هناك كميات كبيرة من البيانات التي يجب العمل عليها. لهذا السبب، تم العثور على هذه الأنواع من وحدات المعالجة المركزية في المقام الأول في أجهزة الكمبيوتر العملاقة ، حيث تم العثور على أجهزة الكمبيوتر العملاقة نفسها، بشكل عام، في أماكن مثل مراكز التنبؤ بالطقس ومختبرات الفيزياء، حيث يتم "ضغط" كميات هائلة من البيانات. ومع ذلك، كما هو موضح أعلاه وأثبته RISC-V RVV، فإن كفاءة ISAs المتجهة تجلب فوائد أخرى مقنعة حتى لحالات الاستخدام المضمنة.
تعليمات المتجه
يأتي مثال الكود الزائف للمتجه أعلاه بافتراض كبير مفاده أن الكمبيوتر المتجه يمكنه معالجة أكثر من عشرة أرقام في دفعة واحدة. بالنسبة لكمية أكبر من الأرقام في سجل المتجه، يصبح من غير الممكن للكمبيوتر أن يكون لديه سجل بهذا الحجم. ونتيجة لذلك، يكتسب معالج المتجه القدرة على تنفيذ الحلقات بنفسه، أو يعرض نوعًا ما من سجل التحكم في المتجه (الحالة) للمبرمج، والمعروف عادةً باسم طول المتجه.
توجد التعليمات التي تتكرر ذاتيًا في أجهزة الكمبيوتر المتجهة المبكرة مثل STAR-100، حيث يتم وصف الإجراء المذكور أعلاه في تعليمة واحدة (مثل vadd c, a, b, $10). توجد أيضًا في بنية x86 كبادئة REP. ومع ذلك، لا يمكن إجراء سوى حسابات بسيطة للغاية بشكل فعال في الأجهزة بهذه الطريقة دون زيادة كبيرة في التكلفة. نظرًا لأن جميع المتغيرات يجب أن تكون في الذاكرة لبنية STAR-100، فقد أصبح التأخير الناتج عن الوصول ضخمًا أيضًا.
أدرجت شركة Broadcom مساحة في جميع عمليات المتجهات في Videocore IV ISA لحقل REP، ولكن على عكس STAR-100 الذي يستخدم الذاكرة لتكراراته، فإن تكرارات Videocore IV موجودة في جميع العمليات بما في ذلك عمليات المتجهات الحسابية. يمكن أن يكون طول التكرار نطاقًا صغيرًا من قوة اثنين أو مصدره أحد السجلات القياسية. [16]
قدم Cray -1 فكرة استخدام سجلات المعالج لتخزين بيانات المتجهات في دفعات. يمكن ضبط أطوال الدفعات (طول المتجه، VL) ديناميكيًا بتعليمات خاصة، والأهمية مقارنة بـ Videocore IV (وكما سيتضح أدناه، SIMD أيضًا) هي أن طول التكرار لا يجب أن يكون جزءًا من ترميز التعليمات. بهذه الطريقة، يمكن القيام بمزيد من العمل بشكل كبير في كل دفعة؛ كما أن ترميز التعليمات أكثر أناقة وإحكاما أيضًا. العيب الوحيد هو أنه من أجل الاستفادة الكاملة من سعة معالجة الدفعات الإضافية هذه، كان لابد من زيادة سرعة تحميل الذاكرة والتخزين وفقًا لذلك أيضًا. يُزعم أحيانًا [ من قبل من؟ ] أن هذا عيب في معالجات المتجهات على غرار Cray: في الواقع إنه جزء من تحقيق معدل إنتاجية عالي الأداء، كما هو الحال في وحدات معالجة الرسومات ، التي تواجه نفس المشكلة تمامًا.
تزعم أجهزة الكمبيوتر الحديثة التي تعمل بنظام SIMD أنها تعمل على تحسين أداء Cray المبكر من خلال استخدام وحدات حسابية منطقية متعددة بشكل مباشر، وذلك للحصول على درجة أعلى من التوازي مقارنة باستخدام خط الأنابيب القياسي العادي فقط. تجمع معالجات المتجهات الحديثة (مثل SX-Aurora TSUBASA ) بين الأمرين، وذلك من خلال إصدار بيانات متعددة إلى وحدات حسابية منطقية منطقية متعددة متصلة بخط أنابيب داخلي، حيث يتم اختيار العدد الصادر ديناميكيًا بواسطة برنامج المتجه في وقت التشغيل. يمكن استخدام الأقنعة لتحميل وتخزين البيانات بشكل انتقائي في مواقع الذاكرة، واستخدام نفس الأقنعة لتعطيل عنصر المعالجة في وحدات حسابية منطقية منطقية SIMD بشكل انتقائي. بعض المعالجات التي تعمل بنظام SIMD ( AVX-512 وARM SVE2 ) قادرة على هذا النوع من المعالجة الانتقائية لكل عنصر ( "المتوقعة" )، وهي التي تستحق إلى حد ما تسمية "معالج متجه" أو على الأقل تستحق الادعاء بأنها قادرة على "معالجة متجهة". لا تتمتع معالجات SIMD التي لا تعمل بنظام التنبؤ لكل عنصر ( MMX و SSE و AltiVec ) بهذا الوصف بشكل قاطع.
تستخدم وحدات معالجة الرسوميات الحديثة، التي تحتوي على العديد من وحدات الحوسبة الصغيرة، كل منها مع وحدات SIMD ALUs المستقلة الخاصة بها، تقنية خيوط متعددة للتعليمات الفردية (SIMT). تعمل وحدات SIMT من وحدة تعليمات متزامنة مشتركة. "سجلات المتجهات" واسعة جدًا وتميل خطوط الأنابيب إلى أن تكون طويلة. يتضمن جزء "الترابط" من تقنية خيوط متعددة للتعليمات الفردية الطريقة التي يتم بها التعامل مع البيانات بشكل مستقل على كل وحدة حوسبة.
بالإضافة إلى ذلك، قد تستخدم وحدات معالجة الرسوميات مثل Broadcom Videocore IV ومعالجات المتجهات الخارجية الأخرى مثل NEC SX-Aurora TSUBASA وحدات متجهية أقل مما يوحي به العرض: فبدلاً من وجود 64 وحدة لسجل بعرض 64 رقمًا، قد تقوم الأجهزة بدلاً من ذلك بحلقة خطية على 16 وحدة لنهج هجين. كما أن Broadcom Videocore IV قادر على هذا النهج الهجين: حيث ينص اسميًا على أن محرك SIMD QPU الخاص به يدعم عمليات مصفوفة FP بطول 16 في تعليماته، ولكنه في الواقع يقوم بها 4 في المرة الواحدة، كشكل (آخر) من "الخيوط". [17]
مثال على تعليمات المتجه
يبدأ هذا المثال بخوارزمية ("IAXPY")، حيث يتم عرضها أولاً في تعليمات قياسية، ثم SIMD، ثم SIMD المتوقعة، وأخيرًا تعليمات متجهية. يساعد هذا بشكل تدريجي في توضيح الفرق بين معالج متجه تقليدي ومعالج SIMD حديث. يبدأ المثال بمتغير عدد صحيح مكون من 32 بت لدالة "DAXPY"، في لغة C :
void iaxpy ( size_t n ، int a ، const int x []، int y []) { بالنسبة إلى ( size_t i = 0 ؛ i < n ؛ i ++ ) y [ i ] = a * x [ i ] + y [ i ]؛ }
في كل تكرار، يحتوي كل عنصر من y على عنصر من x مضروبًا في a ومضافًا إليه. يتم التعبير عن البرنامج في شكل خطي قياسي لسهولة القراءة.
مُجمِّع قياسي
ستقوم النسخة القياسية من هذا بتحميل واحد من كل من x وy، ومعالجة حساب واحد، وتخزين نتيجة واحدة، والتكرار:
حلقة:
load32 r1 , x ؛ تحميل بيانات 32 بت واحدة load32 r2 , y mul32 r1 , a , r1 ; r1 := r1 * a add32 r3 , r1 , r2 ; r3 := r1 + r2 store32 r3 , y addl x , x , $4 ; x := x + 4 addl y , y , $4 subl n , n , $1 ; n := n - 1 jgz n ، حلقة ؛ حلقة للخلف إذا كان n > 0 خارج: ret
يظل الكود المشابه لـ STAR موجزًا، ولكن نظرًا لأن عملية تحويل البيانات إلى متجهات في STAR-100 كانت مبنية على أساس الوصول إلى الذاكرة، فإن الأمر يتطلب الآن فتحة إضافية من الذاكرة لمعالجة المعلومات. كما أن هناك حاجة إلى ضعف زمن الوصول بسبب المتطلب الإضافي للوصول إلى الذاكرة.
; افترض أن tmp مُخصص مسبقًا
vmul tmp ، a ، x ، n ؛ tmp[i] = a * x[i] vadd y ، y ، tmp ، n ؛ y[i] = y[i] + tmp[i] ret
SIMD نقية (غير متوقعة، معبأة)
يمكن لهندسة SIMD المعبأة الحديثة، والمعروفة بالعديد من الأسماء (المدرجة في تصنيف فلين )، أن تقوم بمعظم العملية على دفعات. يشبه الكود في الغالب الإصدار القياسي. يُفترض أن كل من x وy محاذيان بشكل صحيح هنا (يبدأ فقط بمضاعف 16) وأن n مضاعف 4، وإلا فستكون هناك حاجة إلى بعض أكواد الإعداد لحساب قناع أو لتشغيل إصدار قياسي. يمكن أيضًا افتراض، من أجل التبسيط، أن تعليمات SIMD بها خيار لتكرار المتغيرات القياسية تلقائيًا، مثل ARM NEON. [18] إذا لم يكن الأمر كذلك، فيجب استخدام "splat" (بث)، لنسخ وسيطة القياسية عبر سجل SIMD:
splatx4 v4 ، a ؛ v4 = a،a،a،a
سيكون الوقت المستغرق هو نفسه بشكل أساسي لتنفيذ المتجه y = mx + cالموصوف أعلاه.
vloop:
load32x4 v1 ، x load32x4 v2 ، y mul32x4 v1 ، a ، v1 ؛ v1 := v1 * a add32x4 v3 ، v1 ، v2 ؛ v3 := v1 + v2 store32x4 v3 ، y addl x ، x ، $16 ؛ x := x + 16 addl y ، y ، $16 subl n ، n ، $4 ؛ n := n - 4 jgz n ، vloop ؛ العودة إذا كان n > 0 خارج: ret
لاحظ أن كلاً من مؤشري x وy يتم زيادتهما بمقدار 16، لأن هذا هو طول أربعة أعداد صحيحة مكونة من 32 بت (بالبايت). وقد تم اتخاذ القرار بأن الخوارزمية يجب أن تتعامل فقط مع SIMD بعرض 4 بتات، وبالتالي فإن الثابت مبرمج بشكل ثابت في البرنامج.
لسوء الحظ بالنسبة لـ SIMD، كان الدليل في الافتراض أعلاه، "أن n هو مضاعف لـ 4" بالإضافة إلى "الوصول المحاذي"، والذي من الواضح أنه حالة استخدام متخصصة محدودة.
من الناحية الواقعية، بالنسبة للحلقات ذات الأغراض العامة مثل تلك الموجودة في المكتبات المحمولة، حيث لا يمكن تقييد n بهذه الطريقة، فإن التكلفة الإضافية لإعداد وتنظيف SIMD من أجل التعامل مع مضاعفات عرض SIMD، يمكن أن تتجاوز بكثير عدد التعليمات داخل الحلقة نفسها. بافتراض أن أسوأ حالة هي أن الأجهزة لا يمكنها القيام بعمليات وصول غير محاذية إلى ذاكرة SIMD، فإن الخوارزمية الواقعية سوف:
- أولاً، يجب أن يكون لدينا قسم تحضيري يعمل على البيانات غير المحاذية الأولية، حتى النقطة الأولى حيث يمكن لعمليات محاذاة ذاكرة SIMD أن تتولى الأمر. سيتضمن هذا إما عمليات قياسية (أبطأ) فقط أو عمليات SIMD مضغوطة ذات حجم أصغر. تنفذ كل نسخة الحلقة الداخلية للخوارزمية الكاملة.
- قم بإجراء حلقة SIMD المحاذية عند أقصى عرض SIMD حتى العناصر القليلة الأخيرة (العناصر المتبقية التي لا تتناسب مع عرض SIMD الثابت)
- تتضمن مرحلة التنظيف، والتي، مثل القسم التحضيري، تكون كبيرة ومعقدة بنفس القدر.
يتطلب SIMD ذو الثماني عرض تكرار خوارزمية الحلقة الداخلية أولاً مع عناصر SIMD ذات الأربعة عرض، ثم SIMD ذات العرضين، ثم عنصر واحد (عددي)، مع اختبار وفرع بين كل عنصر، من أجل تغطية عناصر SIMD الأولى والأخيرة المتبقية (0 <= n <= 7).
يؤدي هذا إلى زيادة حجم الكود بأكثر من ثلاثة أضعاف ، وفي الواقع في الحالات القصوى يؤدي ذلك إلى زيادة في عدد التعليمات بمقدار مرتبة واحدة ! يمكن إثبات ذلك بسهولة من خلال تجميع مثال iaxpy لـ AVX-512 ، باستخدام الخيارات "-O3 -march=knl"في gcc .
مع مرور الوقت ومع تطور ISA لزيادة الأداء باستمرار، يؤدي هذا إلى قيام مهندسي ISA بإضافة SIMD بعرضين، ثم SIMD بعرض أربعة، ثم بعرض ثمانية وما فوق. وبالتالي، يمكن أن نرى سبب وجود AVX-512 في x86.
بدون التنبؤ، كلما اتسع عرض SIMD، كلما ساءت المشاكل، مما يؤدي إلى انتشار هائل للرموز التشغيلية، وتدهور الأداء، واستهلاك إضافي للطاقة وتعقيد غير ضروري للبرامج. [19]
من ناحية أخرى، تم تصميم معالجات المتجهات لإصدار عمليات حسابية بطول متغير لعدد عشوائي، n، وبالتالي تتطلب القليل جدًا من الإعداد، ولا تتطلب أي تنظيف. حتى بالمقارنة مع معالجات SIMD ISAs التي تحتوي على أقنعة (ولكن بدون setvlتعليمات)، تنتج معالجات المتجهات تعليمات برمجية أكثر إحكاما لأنها لا تحتاج إلى إجراء حساب قناع صريح لتغطية العناصر القليلة الأخيرة (كما هو موضح أدناه).
SIMD المتوقعة
بافتراض وجود SIMD ISA افتراضي (قادر على استخدام القناع)، وبافتراض أن تعليمات SIMD يمكنها التعامل مع البيانات غير المتوافقة، فإن حلقة التعليمات ستبدو مثل هذا:
vloop:
# تحضير القناع. تحتوي بعض ISAs على min على الرغم من أن min t0 و n و $4 ؛ t0 = min(n، 4) shift m و $1 و t0 ؛ m = 1<<t0 sub m و m و $1 ؛ m = (1<<t0)-1 # قم الآن بالعملية، مقنعة بواسطة m بت load32x4 v1 و x و m load32x4 v2 و y و m mul32x4 v1 و a و v1 و m ؛ v1 := v1 * a add32x4 v3 و v1 و v2 و m ؛ v3 := v1 + v2 store32x4 v3 و y و m # تحديث x و y و n للحلقة التالية addl x و t0 * 4 ؛ x := x + t0*4 addl y , t0 * 4 subl n , n , t0 ; n := n - t0 # حلقة؟ jgz n , vloop ; العودة إذا كان n > 0 خارج: ret
هنا يمكن ملاحظة أن الكود أكثر نظافة ولكنه معقد بعض الشيء: على الأقل، لا يوجد إعداد أو تنظيف: في آخر تكرار للحلقة، سيتم تعيين قناع التنبؤ إما على 0b0000 أو 0b0001 أو 0b0011 أو 0b0111 أو 0b1111، مما يؤدي إلى إجراء ما بين 0 و4 عمليات لعناصر SIMD على التوالي. هناك تعقيد محتمل آخر: بعض RISC ISAs لا تحتوي على تعليمة "min"، وتحتاج بدلاً من ذلك إلى استخدام فرع أو مقارنة تنبؤية قياسية.
من الواضح أن SIMD المتنبأ بها تستحق على الأقل مصطلح "قادرة على التعامل مع المتجهات"، لأنها قادرة على التعامل مع المتجهات ذات الطول المتغير باستخدام أقنعة التنبؤ. ومع ذلك، فإن الخطوة الأخيرة في التطور نحو ISA المتجه "الحقيقي" هي عدم وجود أي دليل في ISA على الإطلاق على عرض SIMD، مما يترك الأمر بالكامل للأجهزة.
متجه نقي (حقيقي) ISA
بالنسبة لـ Cray-style vector ISAs مثل RVV، يتم استخدام تعليمة تسمى "setvl" (تعيين طول المتجه). يحدد الجهاز أولاً عدد قيم البيانات التي يمكنه معالجتها في "متجه" واحد: يمكن أن يكون هذا إما سجلات فعلية أو يمكن أن يكون حلقة داخلية (النهج الهجين، المذكور أعلاه). يُطلق على هذا الحد الأقصى (عدد "مسارات" الأجهزة) اسم "MVL" (أقصى طول للمتجه). لاحظ أنه، كما هو موضح في SX-Aurora وVideocore IV، قد يكون MVL كمية مسار أجهزة فعلية أو كمية افتراضية . (ملاحظة: كما هو مذكور في البرنامج التعليمي ARM SVE2، يجب ألا يرتكب المبرمجون خطأ افتراض عرض متجه ثابت: وبالتالي فإن MVL ليست كمية يحتاج المبرمج إلى معرفتها. قد يكون هذا مربكًا بعض الشيء بعد سنوات من عقلية SIMD). [ نغمة ]
عند استدعاء setvl بعدد عناصر البيانات المتبقية المراد معالجتها، يُسمح لـ "setvl" (وهو أمر مطلوب بشكل أساسي) بتقييد ذلك إلى أقصى طول متجه (MVL) وبالتالي إرجاع العدد الفعلي الذي يمكن معالجته بواسطة الأجهزة في تعليمات المتجه اللاحقة، وتعيين السجل الخاص الداخلي، "VL"، إلى نفس المقدار. تشير ARM إلى هذه التقنية باعتبارها برمجة "لا تعتمد على طول المتجه" في دروسها التعليمية على SVE2. [20]
فيما يلي مُجمِّع متجه على غرار Cray لنفس حلقة SIMD ذات النمط أعلاه. لاحظ أن t0 (التي تحتوي على نسخة ملائمة من VL، ويمكن أن تختلف) تُستخدم بدلاً من الثوابت المبرمجة:
vloop:
setvl t0 , n # VL=t0=min(MVL, n) vld32 v0 , x # متجه التحميل x vld32 v1 , y # متجه التحميل y vmadd32 v1 , v0 , a # v1 += v0 * a vst32 v1 , y # تخزين Y إضافة y , t0 * 4 # تقدم y بواسطة VL*4 إضافة x , t0 * 4 # تقدم x بواسطة VL*4 sub n , t0 # n -= VL (t0) bnez n , vloop # كرر إذا لم يكن n = 0
هذا ليس مختلفًا بشكل أساسي عن إصدار SIMD (يعالج 4 عناصر بيانات لكل حلقة)، أو عن إصدار Scalar الأولي (يعالج عنصرًا واحدًا فقط). لا يزال n يحتوي على عدد عناصر البيانات المتبقية للمعالجة، ولكن t0 يحتوي على نسخة VL - الرقم الذي سيتم معالجته في كل تكرار. يتم طرح t0 من n بعد كل تكرار، وإذا كان n يساوي صفرًا، فهذا يعني أنه تمت معالجة جميع العناصر.
هناك عدد من الأشياء التي يجب ملاحظتها عند المقارنة مع متغير تجميع SIMD Predicated:
- تحتوي التعليمات على تعليمات
setvlمضمنة بداخلهاmin - حيث قام متغير SIMD بترميز العرض (4) في إنشاء القناع وفي عرض SIMD (load32x4 وما إلى ذلك)، فإن مكافئات ISA المتجهة لا تحتوي على مثل هذا الحد. وهذا يجعل برامج المتجهات محمولة ومستقلة عن البائع ومستعدة للمستقبل.
- يؤدي إعداد VL بشكل فعال إلى إنشاء قناع مسند مخفي يتم تطبيقه تلقائيًا على المتجهات
- في حين أن طول بت القناع في SIMD المتنبأ به يقتصر على ما يمكن الاحتفاظ به في سجل قياسي (أو سجل قناع خاص)، فإن سجلات قناع ISA المتجهة لا تحتوي على مثل هذا القيد. يمكن أن تكون متجهات Cray-I أكثر من 1000 عنصر (في عام 1977).
وبالتالي، يمكننا أن نرى بوضوح شديد كيف تعمل ISAs المتجهة على تقليل عدد التعليمات.
لاحظ أيضًا أنه تمامًا مثل متغير SIMD المتوقع، يتم تقدم المؤشرات إلى x وy بمقدار t0 مرات أربعة لأنهما يشيران إلى بيانات 32 بت، ولكن يتم تقليل n بمقدار t0 مباشرة. بالمقارنة مع مجمع SIMD ذي الحجم الثابت، لا يوجد فرق واضح للغاية: يتم تقدم x وy بالثابت المبرمج الثابت 16، ويتم تقليل n بمقدار 4 مبرمج ثابت، لذلك من الصعب في البداية تقدير الأهمية. يأتي الاختلاف في إدراك أن أجهزة المتجهات يمكن أن تكون قادرة على القيام بـ 4 عمليات متزامنة، أو 64، أو 10000، سيكون نفس مجمع المتجهات تمامًا لجميعها ولن يكون هناك كود تنظيف SIMD . حتى بالمقارنة مع SIMD القادر على التنبؤ، فإنه لا يزال أكثر إحكاما وأكثر وضوحًا وأناقة ويستخدم موارد أقل.
ليس فقط أنه برنامج أكثر إحكاما (يوفر في حجم ذاكرة التخزين المؤقت L1)، ولكن كما ذكرنا سابقًا، يمكن لإصدار المتجه إصدار معالجة بيانات أكثر بكثير إلى وحدات المنطق والحساب، مما يوفر الطاقة مرة أخرى لأن فك تشفير التعليمات وإصدارها يمكن أن يظل خاملاً.
بالإضافة إلى ذلك، يمكن أن يبدأ عدد العناصر التي تدخل إلى الوظيفة من الصفر. يؤدي هذا إلى تعيين طول المتجه إلى الصفر، مما يعطل فعليًا جميع تعليمات المتجه، ويحولها إلى عمليات غير قابلة للتنفيذ ، في وقت التشغيل. وبالتالي، على عكس SIMD غير المتوقعة، حتى عندما لا توجد عناصر لمعالجتها، لا يزال لا يوجد كود تنظيف مهدر.
مثال على تقليل المتجه
يبدأ هذا المثال بخوارزمية تتضمن الاختزال. وكما هو الحال مع المثال السابق، سيتم عرضه أولاً في تعليمات قياسية، ثم SIMD، وأخيرًا تعليمات متجهية، بدءًا من c :
void ( size_t n ، int a ، const int x []) { int y = 0 ؛ بالنسبة إلى ( size_t i = 0 ؛ i < n ؛ i ++ ) y += x [ i ]؛ إرجاع y ؛ }
هنا، يتم استخدام المتراكم (y) لجمع كل القيم في المصفوفة، x.
مُجمِّع قياسي
ستقوم النسخة القياسية من هذا بتحميل كل x، وإضافته إلى y، والتكرار:
تعيين y ، 0 ؛ y تم تهيئة إلى الصفر حلقة: load32 r1 ، x ؛ تحميل بيانات 32 بت واحدة add32 y ، y ، r1 ؛ y := y + r1 addl x ، x ، $4 ؛ x := x + 4 subl n ، n ، $1 ؛ n := n - 1 jgz n ، حلقة ؛ حلقة للخلف إذا كان n > 0 خارج: ret y ؛ إرجاع النتيجة، y
هذا واضح جدًا. يبدأ "y" من الصفر، ويتم تحميل الأعداد الصحيحة المكونة من 32 بت واحدة تلو الأخرى إلى r1، وإضافتها إلى y، ونقل عنوان المصفوفة "x" إلى العنصر التالي في المصفوفة.
تخفيض SIMD
وهنا تبدأ المشاكل. فنظام SIMD غير قادر على إجراء عمليات حسابية "بين العناصر" بسبب تصميمه. ويمكن إضافة العنصر 0 من أحد سجلات SIMD إلى العنصر 0 من سجل آخر، ولكن لا يمكن إضافة العنصر 0 إلى أي شيء آخر غير العنصر 0 الآخر. وهذا يفرض بعض القيود الشديدة على التطبيقات المحتملة. ومن أجل التبسيط، يمكن افتراض أن n يساوي 8 بالضبط:
إضافة r3 ، x ، 16 ؛ للمجموعات الأربع الثانية من x load32x4 v1 ، x ؛ أول 4 مجموعات من x load32x4 v2 ، r3 ؛ المجموعات الأربع الثانية من x add32x4 v1 ، v2 ، v1 ؛ أضف مجموعتين
في هذه المرحلة تم إجراء أربع إضافات:
x[0]+x[4]- إضافة SIMD الأولى: تمت إضافة العنصر 0 من المجموعة الأولى إلى العنصر 0 من المجموعة الثانيةx[1]+x[5]- إضافة SIMD الثانية: تم إضافة العنصر 1 من المجموعة الأولى إلى العنصر 1 من المجموعة الثانيةx[2]+x[6]- إضافة SIMD الثالثة: تم إضافة العنصر 2 من المجموعة الأولى إلى العنصر 2 من المجموعة الثانيةx[3]+x[7]- إضافة SIMD الرابعة: إضافة العنصر 3 من المجموعة الأولى إلى العنصر 2 من المجموعة الثانية
ولكن مع عدم قدرة SIMD ذات العرض الرباعي على الإضافة x[0]+x[1]على سبيل المثال، فإن الأمور تتجه نحو الانحدار بسرعة كما حدث مع الحالة العامة لاستخدام SIMD لحلقات IAXPY للأغراض العامة. ولتلخيص النتائج الجزئية الأربع، يمكن استخدام SIMD ذات العرضين، متبوعًا بإضافة عددية واحدة، لإنتاج الإجابة في النهاية، ولكن في كثير من الأحيان، يجب نقل البيانات خارج سجلات SIMD المخصصة قبل إجراء آخر حساب عددي.
حتى مع وجود حلقة عامة (n غير ثابتة)، فإن الطريقة الوحيدة لاستخدام SIMD بعرض 4 هي افتراض وجود أربعة "تيارات" منفصلة، كل منها مفصولة بأربعة عناصر. أخيرًا، يجب جمع النتائج الجزئية الأربعة. تتضمن التقنيات الأخرى الخلط: يمكن العثور على أمثلة عبر الإنترنت لـ AVX-512 حول كيفية إجراء "الجمع الأفقي" [21] [22]
وبعيدًا عن حجم البرنامج وتعقيده، تنشأ مشكلة محتملة إضافية إذا كان الأمر يتعلق بالحساب بالفاصلة العائمة: فحقيقة أن القيم لا يتم جمعها بالترتيب الصارم (أربع نتائج جزئية) قد تؤدي إلى أخطاء التقريب.
تخفيض متجه ISA
تتضمن مجموعات تعليمات المتجهات عمليات اختزال حسابية مدمجة في ISA. إذا افترضنا أن n أقل من أو يساوي الحد الأقصى لطول المتجه، فلن تكون هناك حاجة إلا إلى ثلاث تعليمات:
setvl t0 ، n # VL=t0=min(MVL، n) vld32 v0 ، x # متجه التحميل x vredadd32 y ، v0 # تقليل-إضافة إلى y
إن الكود عندما يكون n أكبر من الحد الأقصى لطول المتجه ليس أكثر تعقيدًا بكثير، وهو نمط مشابه للمثال الأول ("IAXPY").
تعيين y ، 0 vloop: setvl t0 ، n # VL=t0=min(MVL، n) vld32 v0 ، x # تحميل متجه x vredadd32 y ، y ، v0 # إضافة كل x إلى y إضافة x ، t0 * 4 # تقدم x بمقدار VL*4 sub n ، t0 # n -= VL (t0) bnez n ، vloop # كرر إذا لم يكن n = 0 ret y
إن بساطة الخوارزمية صارخة بالمقارنة مع SIMD. مرة أخرى، تمامًا كما هو الحال مع مثال IAXPY، فإن الخوارزمية لا تعتمد على الطول (حتى في التطبيقات المضمنة حيث يمكن أن يكون الحد الأقصى لطول المتجه واحدًا فقط).
قد تقوم التطبيقات في الأجهزة، إذا كانت متأكدة من إنتاج الإجابة الصحيحة، بإجراء الاختزال بالتوازي. تقدم بعض تطبيقات ISA للمتجهات وضع الاختزال بالتوازي كخيار صريح، عندما يعرف المبرمج أن أي أخطاء تقريب محتملة لا تهم، وأن زمن الوصول المنخفض أمر بالغ الأهمية. [23]
يسلط هذا المثال الضوء مرة أخرى على اختلاف أساسي مهم بين معالجات المتجهات الحقيقية ومعالجات SIMD، بما في ذلك معظم وحدات معالجة الرسومات التجارية، المستوحاة من ميزات معالجات المتجهات.
رؤى من الأمثلة
بالمقارنة بأي معالج SIMD يدعي أنه معالج متجه، فإن التخفيض في حجم البرنامج بمقدار 100% أمر صادم تقريبًا. ومع ذلك، فإن هذا المستوى من الأناقة على مستوى ISA له ثمن باهظ للغاية على مستوى الأجهزة:
- من مثال IAXPY، يمكن ملاحظة أنه على عكس معالجات SIMD، التي يمكنها تبسيط أجهزتها الداخلية من خلال تجنب التعامل مع الوصول غير المتوافق إلى الذاكرة، لا يمكن لمعالج المتجهات التخلص من هذا التبسيط: تتم كتابة الخوارزميات التي تعتمد بشكل جوهري على نجاح تحميل المتجهات وتخزينها، بغض النظر عن محاذاة بداية المتجه.
- في حين أنه من الممكن أن نرى من مثال الاختزال أنه، بصرف النظر عن تعليمات التبديل ، يتجنب SIMD بحكم التعريف العمليات بين المسارات بالكامل (لا يمكن إضافة العنصر 0 إلا إلى عنصر آخر 0)، فإن معالجات المتجهات تعالج هذه المشكلة بشكل مباشر. ما يضطر المبرمجون إلى القيام به في البرامج (باستخدام الخلط والحيل الأخرى، لتبديل البيانات إلى "المسار" الصحيح) يجب على معالجات المتجهات القيام به في الأجهزة، تلقائيًا.
بشكل عام، هناك خيار بين أن يكون لديك
- البرمجيات المعقدة والأجهزة المبسطة (SIMD)
- برمجيات مبسطة وأجهزة معقدة (معالجات متجهة)
هذه الاختلافات الصارخة هي ما يميز المعالج المتجه عن المعالج الذي يحتوي على SIMD.
مميزات معالج المتجهات
حيث تستعير العديد من معالجات المتجهات SIMD أو تستلهمها من القائمة أدناه، فإن الميزات النموذجية التي يتمتع بها معالج المتجهات هي: [24] [25] [26]
- تحميل المتجهات وتخزينها – تحتوي بنيات المتجهات ذات التصميم من سجل إلى سجل (على غرار بنيات التحميل والتخزين للمعالجات القياسية) على تعليمات لنقل عناصر متعددة بين الذاكرة وسجلات المتجهات. وعادةً ما يتم دعم أوضاع عنونة متعددة. ويعد وضع عنونة الخطوة الوحدوية ضروريًا؛ كما تدعم بنيات المتجهات الحديثة عادةً أيضًا خطوات ثابتة عشوائية، بالإضافة إلى وضع عنونة التشتت/التجميع (يُسمى أيضًا وضع الفهرس ). وقد تتضمن البنيات المتقدمة أيضًا دعمًا لتحميل القطاعات وتخزينها، ومتغيرات الفشل أولاً لتحميل المتجهات وتخزينها القياسي. تقرأ أحمال القطاعات متجهًا من الذاكرة، حيث يكون كل عنصر عبارة عن بنية بيانات تحتوي على أعضاء متعددة. يتم استخراج الأعضاء من بنية البيانات (العنصر)، ويتم وضع كل عضو مستخرج في سجل متجه مختلف.
- العمليات المقنعة – تسمح أقنعة التنبؤات بإنشاءات if/then/else متوازية دون اللجوء إلى الفروع. وهذا يسمح بتحويل التعليمات البرمجية التي تحتوي على عبارات شرطية إلى متجهات.
- الضغط والتوسيع – عادةً باستخدام قناع بت، يتم ضغط البيانات أو توسيعها (إعادة توزيعها) بشكل خطي بناءً على ما إذا كانت البتات في القناع مضبوطة أو ممسوحة، مع الحفاظ دائمًا على الترتيب التسلسلي وعدم تكرار القيم أبدًا (على عكس Gather-Scatter المعروف أيضًا باسم permute). تظهر هذه التعليمات في AVX-512 .
- سجل التجميع، التشتت (المعروف أيضًا باسم التبديل) [27] - تنويعة أقل تقييدًا وأكثر عمومية لموضوع الضغط/التوسيع والذي يأخذ بدلاً من ذلك متجهًا واحدًا لتحديد المؤشرات لاستخدامها "لإعادة ترتيب" متجه آخر. يعد التجميع/التشتت أكثر تعقيدًا في التنفيذ من الضغط/التوسيع، ولأنه غير متسلسل بطبيعته، يمكن أن يتداخل مع تسلسل المتجهات . لا ينبغي الخلط بينه وبين أوضاع تحميل/تخزين ذاكرة التجميع والتشتت ، حيث تعمل عمليات متجه التجميع/التشتت على سجلات المتجهات، وغالبًا ما يطلق عليها تعليمات تبديل بدلاً من ذلك.
- Splat وExtract – مفيدان للتفاعل بين المقياس والمتجه، حيث يبثان قيمة واحدة عبر متجه، أو يستخرجان عنصرًا واحدًا من متجه، على التوالي.
- Iota – تعليمة بسيطة للغاية ومفيدة استراتيجيًا تقوم بإسقاط العناصر المباشرة المتزايدة بشكل تسلسلي إلى عناصر متتالية. وعادةً ما تبدأ من الصفر.
- الاختزال والتكرار – العمليات التي تقوم باختزال الخريطة على متجه (على سبيل المثال، إيجاد القيمة القصوى لمتجه بأكمله، أو جمع كل العناصر). التكرار يكون من الشكل
x[i] = y[i] + x[i-1]حيث يكون الاختزال من الشكلx = y[0] + y[1]… + y[n-1] - دعم مضاعفة المصفوفات - إما عن طريق تحميل البيانات خوارزميًا من الذاكرة، أو إعادة ترتيب (إعادة تعيين) الوصول الخطي عادةً إلى عناصر المتجهات، أو توفير "المجمعات"، يمكن معالجة المصفوفات ذات الأحجام التعسفية بكفاءة. يوفر IBM POWER10 تعليمات MMA [28] على الرغم من أن تقنيات تكرار البيانات الخاصة بعرض المصفوفات التعسفي التي لا تتناسب مع حجم SIMD الدقيق مطلوبة وهو ما يؤدي إلى إهدار موارد ملف السجل. [29] [30] توفر NVidia واجهة برمجة تطبيقات Matrix CUDA عالية المستوى على الرغم من عدم توفر التفاصيل الداخلية. [31] إن التقنية الأكثر كفاءة في استخدام الموارد هي إعادة ترتيب الوصول إلى بيانات متجه خطية في مكانها.
- تنسيقات الرياضيات المتقدمة - غالبًا ما تتضمن حساب حقل جالوا ، ولكن يمكن أن تتضمن عددًا عشريًا مشفرًا ثنائيًا أو عددًا عشريًا ثابتًا، ودعمًا لعمليات حسابية أكبر كثيرًا (دقة تعسفية) من خلال دعم النقل المتوازي والنقل الخارجي
- التلاعب بالبتات - بما في ذلك الإصدارات المتجهة لعمليات تبديل مستوى البت، وإدخال واستخراج حقل البتات، وعمليات الطرد المركزي، وحساب السكان، وغيرها الكثير .
ميزات معالجة متجهات وحدة معالجة الرسوميات
مع وجود العديد من تطبيقات التظليل ثلاثية الأبعاد التي تتطلب عمليات مثلثية بالإضافة إلى متجهات قصيرة للعمليات الشائعة (RGB، ARGB، XYZ، XYZW)، فإن الدعم لما يلي موجود عادةً في وحدات معالجة الرسومات الحديثة، بالإضافة إلى تلك الموجودة في معالجات المتجهات:
- المتجهات الفرعية - قد تحتوي العناصر عادةً على عنصرين أو ثلاثة أو أربعة عناصر فرعية (vec2، vec3، vec4) حيث ينطبق أي جزء معين من قناع المسند على vec2/3/4 بالكامل، وليس على العناصر الموجودة في المتجه الفرعي. يتم تقديم المتجهات الفرعية أيضًا في RISC-V RVV (يُطلق عليها "LMUL"). [32] تُعد المتجهات الفرعية جزءًا لا يتجزأ من مواصفات Vulkan SPIR-V .
- تبديل المتجهات الفرعية – المعروف أيضًا باسم "خلط المسارات" والذي يسمح بإجراء عمليات حسابية بين العناصر الفرعية للمتجهات دون الحاجة إلى تعليمات إضافية (مكلفة ومضيعة) لتحريك العناصر الفرعية إلى "مسارات" SIMD الصحيحة كما يوفر أيضًا بتات قناع التنبؤ. في الواقع، يعد هذا تبديلًا صغيرًا أثناء الطيران للمتجه الفرعي، ويتميز بكثافة في ثنائيات 3D Shader، وهو مهم بدرجة كافية ليكون جزءًا من مواصفات Vulkan SPIR-V. يستخدم Broadcom Videocore IV مصطلح "تدوير المسارات" [33] حيث يستخدم بقية الصناعة مصطلح "التبديل" . [34]
- من الواضح أن العمليات المثلثية المتسامية مثل الجيب وجيب التمام واللوغاريتم تظهر بشكل أكثر هيمنة في 3D مقارنة بالعديد من أحمال عمل HPC المتطلبة. ومع ذلك، من المثير للاهتمام أن السرعة أكثر أهمية بكثير من الدقة في 3D لوحدات معالجة الرسومات، حيث لا يتطلب حساب إحداثيات البكسل دقة عالية. تعترف مواصفات Vulkan بهذا وتضع متطلبات دقة منخفضة بشكل مدهش، بحيث يمكن لأجهزة GPU تقليل استخدام الطاقة. يتم استكشاف مفهوم تقليل الدقة حيث لا تكون هناك حاجة إليها ببساطة في ملحق MIPS-3D .
الخطأ (أو الفشل) أولاً
تم تقديم مفهوم الأحمال المتجهة المتسلسلة المضاربة في ARM SVE2 وRISC-V RVV. يحتوي ARM SVE2 على سجل خاص يسمى "سجل الخطأ الأول"، [35] حيث يقوم RVV بتعديل (قطع) طول المتجه (VL). [36]
المبدأ الأساسي لـ ffirst هو محاولة تحميل متجه متسلسل كبير، ولكن للسماح للأجهزة بتقليص الكمية الفعلية المحملة بشكل تعسفي إما إلى الكمية التي ستنجح دون إثارة خطأ في الذاكرة أو ببساطة إلى كمية (أكبر من الصفر) الأكثر ملاءمة. العامل المهم هو أن التعليمات اللاحقة يتم إخطارها أو قد تحدد بالضبط عدد عمليات التحميل الناجحة بالفعل، باستخدام هذه الكمية لتنفيذ العمل فقط على البيانات التي تم تحميلها بالفعل.
قارن هذا الوضع مع SIMD، وهو عرض تحميل ثابت (غير مرن) وعرض معالجة بيانات ثابت، غير قادر على التعامل مع الأحمال التي تتجاوز حدود الصفحة، وحتى لو كانت كذلك فهي غير قادرة على التكيف مع ما نجح بالفعل، ومع ذلك، وبشكل متناقض، إذا كان برنامج SIMD يحاول حتى معرفة مسبقًا (في كل حلقة داخلية، في كل مرة) ما قد ينجح بشكل مثالي، فإن هذه التعليمات لا تؤدي إلا إلى إعاقة الأداء لأنها ستكون بالضرورة جزءًا من الحلقة الداخلية الحرجة.
يبدأ هذا في التلميح إلى السبب وراء كون ffirst مبتكرًا للغاية، ويتضح ذلك بشكل أفضل من خلال memcpy أو strcpy عند تنفيذهما باستخدام SIMD غير متوقعة وغير ffirst قياسية 128 بت. بالنسبة لـ IBM POWER9، فإن عدد التعليمات المحسنة يدويًا لتنفيذ strncpy يتجاوز 240. [37] وعلى النقيض من ذلك، فإن روتين strncpy نفسه في مجمع RVV المحسن يدويًا هو 22 تعليمة فقط. [38]
قد يتعطل مثال SIMD المذكور أعلاه ويفشل في نهاية الذاكرة، بسبب محاولات قراءة قيم كثيرة جدًا: كما قد يتسبب أيضًا في حدوث عدد كبير من أخطاء الصفحات أو الأخطاء غير المتوافقة عن طريق تجاوز الحدود بشكل مماثل. على النقيض من ذلك، من خلال السماح لهندسة المتجه بحرية تحديد عدد العناصر المراد تحميلها، فإن الجزء الأول من strncpy، إذا بدأ في البداية على حدود ذاكرة غير مثالية، قد يعيد عددًا كافيًا من الأحمال بحيث يتم محاذاة دفعات قراءات الذاكرة المتجهية بشكل مثالي مع ذاكرات التخزين المؤقت الأساسية وترتيبات الذاكرة الافتراضية في التكرارات اللاحقة للحلقة. بالإضافة إلى ذلك، قد تختار الأجهزة استخدام الفرصة لإنهاء قراءات الذاكرة لأي تكرار حلقة معينة بالضبط على حدود الصفحة (تجنب البحث المكلف في TLB الثاني)، مع تنفيذ مضاربي لإعداد صفحة الذاكرة الافتراضية التالية بينما لا تزال البيانات قيد المعالجة في الحلقة الحالية. يتم تحديد كل هذا بواسطة الأجهزة، وليس البرنامج نفسه. [39]
الأداء والتسريع
ليكن r هو نسبة سرعة المتجه و f هو نسبة المتجه. إذا كان الوقت الذي تستغرقه وحدة المتجه لإضافة مصفوفة من 64 رقمًا أسرع بعشر مرات من نظيرتها القياسية المكافئة، فإن r = 10. أيضًا، إذا كان العدد الإجمالي للعمليات في البرنامج 100، منها 10 فقط قياسية (بعد المتجه)، فإن f = 0.9، أي أن 90% من العمل يتم بواسطة وحدة المتجه. ويتبع ذلك التسريع الذي يمكن تحقيقه:
لذا، حتى لو كان أداء وحدة المتجه مرتفعًا جدًا ( ) فهناك تسارع أقل من ، مما يشير إلى أن النسبة f ضرورية للأداء. تعتمد هذه النسبة على كفاءة التجميع مثل التجاور بين العناصر في الذاكرة.
انظر أيضا
- هندسة SX
- تصنيف دنكان لمعالجات المتجهات الخطية
- وحدة معالجة الرسومات العامة
- حساب النواة
- معالجة التدفق
- التوجيه التلقائي
- التسلسل (معالجة المتجهات)
- كمبيوتر للعمليات ذات الوظائف
- RISC-V ، وهو معيار ISA مفتوح مع امتداد متجه ذو عرض متغير مرتبط به .
- معالج البراميل
- وحدة معالجة الموتر
- تاريخ الحوسبة الفائقة
- هندسة الحاسوب العملاق
مراجع
- ^ باركنسون، دينيس (17 يونيو 1976). "أجهزة الكمبيوتر بالآلاف". مجلة نيو ساينتست . ص 626-627 . تم الاسترجاع في 7 يوليو 2024 .
- ^ BN Malinovsky (1995). تاريخ تكنولوجيا الكمبيوتر في وجوههم (بالروسية) . KIT. ISBN 5770761318.
- ^ مجموعة أبحاث MIAOW العمودية
- ^ وحدة معالجة الرسوميات MIAOW
- ^ "Andes Announces RISC-V Multicore 1024-bit Vector Processor: AX45MPV" (بيان صحفي). GlobeNewswire. 7 ديسمبر 2022. تم الاسترجاع في 23 ديسمبر 2022 .
- ^ Miyaoka, Y.; Choi, J.; Togawa, N.; Yanagisawa, M.; Ohtsuki, T. (2002). خوارزمية توليد وحدة الأجهزة لتوليف نواة المعالج باستخدام تعليمات من نوع SIMD المعبأة . مؤتمر آسيا والمحيط الهادئ للدوائر والأنظمة. المجلد 1. ص 171-176. doi :10.1109/APCCAS.2002.1114930. hdl : 2065/10689 .
- ^ "Riscv-v-spec/V-spec.adoc في الملف الرئيسي · riscv/Riscv-v-spec". جيثب . 16 يونيو 2023.
- ^ "دليل مرجعي للغة تجميع محرك المتجهات" (PDF) . 16 يونيو 2023.
- ^ "التوثيق – مطور Arm".
- ^ "هندسة المتجهات". 27 أبريل 2020.
- ^ معالجات Vector وSIMD، الشرائح 12-13
- ^ معالجة المصفوفات مقابل معالجة المتجهات، الشرائح 5-7
- ^ SIMD مقابل Vector GPU، الشرائح 22-24
- ^ باترسون، ديفيد أ .؛ هينيسي، جون ل. (1998). تنظيم وتصميم الكمبيوتر: واجهة الأجهزة/البرمجيات، الصفحة 751-2 (الطبعة الثانية). مورجان كوفمان. ص 751-2. ISBN 155860491X.
- ^ "Riscv-v-spec/V-spec.adoc في الملف الرئيسي · riscv/Riscv-v-spec". جيثب . 19 نوفمبر 2022.
- ^ دليل مبرمج Videocore IV
- ^ تحليل Videocore IV QPU بواسطة Jeff Bush
- ^ "الترميز للغة النيون - الجزء الثالث من عملية ضرب المصفوفات". 11 سبتمبر 2013.
- ^ SIMD يعتبر ضارًا
- ^ برنامج تعليمي ARM SVE2
- ^ "Sse - البث من 1 إلى 4 والتقليل من 4 إلى 1 في AVX-512".
- ^ "التجميع - أسرع طريقة لإجراء مجموع متجه SSE الأفقي (أو الاختزال بطريقة أخرى)".
- ^ "Riscv-v-spec/V-spec.adoc في الملف الرئيسي · riscv/Riscv-v-spec". جيثب . 19 نوفمبر 2022.
- ^ نظرة عامة على كراي
- ^ RISC-V RVV ISA
- ^ نظرة عامة على SX-Arora
- ^ تعليمات جمع وتشتيت سجل RVV
- ^ "معالج IBM POWER10 - ويليام ستارك وبريان دبليو تومبتو، IBM". يوتيوب . مؤرشف من الأصل في 11 ديسمبر 2021.
- ^ موريرا ، خوسيه إي. بارتون، كيت؛ باتل ستيفن. بيرجنر، بيتر؛ برتران، رامون؛ بهات، بونيث؛ كالديرا، بيدرو؛ ادلسون، ديفيد؛ فوسوم، جوردون. فراي، براد. ايفانوفيتش، نيمانيا؛ كيرشنر، تشيب؛ ليم، فنسنت. كابور، شاكتي؛ توليو ماتشادو فيلهو؛ سيلفيا ميليتا مولر؛ أولسون، بريت؛ ساداسيفام، ساتيش؛ سليل، بابتيست؛ شميدت، بيل. سرينيفاساراغافان، راجالاكشمي؛ سريفاتسان، شريشاران؛ تومتو، بريان. فاغنر، أندرياس. وو، نيلسون (2021). “مرفق رياضيات مصفوفة لمعالجات Power ISA(TM)”. أرخايف : 2104.03142 [cs.AR].
- ^ Krikelis, Anargyros (1996). "معالج متوازي ضخم معياري لمعالجة التصور الحجمي". الحوسبة عالية الأداء للرسومات الحاسوبية والتصور . ص. 101-124. doi :10.1007/978-1-4471-1011-8_8. ISBN 978-3-540-76016-0.
- ^ "دليل برمجة CUDA C++".
- ^ LMUL > 1 في RVV
- ^ براءة اختراع أمريكية مهجورة رقم US20110227920-0096
- ^ فيديوكور الرابع QPU
- ^ مقدمة إلى ARM SVE2
- ^ أحمال الخطأ الأولى RVV
- ^ تم إضافة PATCH إلى libc6 لإضافة strncpy POWER9 المحسّن
- ^ مثال على RVV strncpy
- ^ ورقة ARM SVE2 بقلم ن. ستيفنز
