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

وتلتها أمثلة أخرى. حاولت شركة Control Data Corporation العودة إلى سوق الحواسيب المتطورة بجهازها ETA-10 ، لكن مبيعاته كانت ضعيفة، فاستغلت الشركة ذلك فرصةً للانسحاب نهائيًا من مجال الحوسبة الفائقة. في أوائل ومنتصف ثمانينيات القرن الماضي، قدمت شركات فوجيتسو وهيتاشي و NEC اليابانية أجهزة حاسوب متجهية تعتمد على المسجلات ، مشابهة لجهاز Cray-1، وكانت عادةً أسرع قليلًا وأصغر حجمًا بكثير: بلغت سلسلة Fujitsu VP ذروتها مع جهاز VP2600 الذي حطم الرقم القياسي العالمي لأسرع حاسوب فائق في الفترة 1990-1991. قامت شركة Floating Point Systems (FPS) التي تتخذ من ولاية أوريغون مقرًا لها ، ببناء معالجات مصفوفات إضافية للحواسيب الصغيرة ، ثم قامت لاحقًا ببناء حواسيبها الفائقة الصغيرة الخاصة بها .
طوال تلك الفترة، حافظت شركة كراي على ريادتها في الأداء، متفوقةً باستمرار على منافسيها بسلسلة من الأجهزة التي أدت إلى ظهور كراي-2 ، وكراي إكس-إم بي ، وكراي واي-إم بي . ومنذ ذلك الحين، ركز سوق الحواسيب العملاقة بشكل أكبر على المعالجة المتوازية الضخمة بدلاً من تطوير تطبيقات أفضل لمعالجات المتجهات. ومع ذلك، وإدراكًا منها لفوائد معالجة المتجهات، طورت شركة آي بي إم بنية المتجهات الافتراضية لاستخدامها في الحواسيب العملاقة، حيث تربط عدة معالجات قياسية لتعمل كمعالج متجهات. كما طبقت آي بي إم معالجة المتجهات على غرار كراي في جهاز آي بي إم 3090 مع إمكانية اختيارية لمعالجة المتجهات .
على الرغم من أن الحواسيب العملاقة المتجهة الشبيهة بجهاز Cray-1 أصبحت أقل شيوعًا في الوقت الحاضر، إلا أن شركة NEC استمرت في تصنيع هذا النوع من الحواسيب حتى يومنا هذا من خلال سلسلة حواسيب SX. وفي أحدث إصداراتها، جهاز SX-Aurora TSUBASA، الذي يضم المعالج وذاكرة بسعة 24 أو 48 جيجابايت على وحدة HBM 2 داخل بطاقة تشبه في شكلها معالجًا مساعدًا للرسومات، ولكنه بدلًا من أن يكون معالجًا مساعدًا، يُعدّ الحاسوب الرئيسي، بينما يقوم الحاسوب المتوافق مع نظام التشغيل Windows والموصول به بأداء وظائف الدعم.
وحدة معالجة الرسومات
تتضمن وحدات معالجة الرسومات الحديثة ( GPUs ) مجموعة من مسارات التظليل التي قد تُشغَّل بواسطة نوى حسابية ، ونظرًا لأنها عادةً ما تستخدم تقنية SIMT، غالبًا ما تُصنَّف خطأً على أنها معالجات متجهة، مع أن التصنيفين متشابهان جدًا في تصنيف SIMD في تصنيف فلين لتقنية SIMD عام 1972. تستخدم وحدات معالجة الرسومات استراتيجية لإخفاء زمن استجابة الذاكرة عند مواجهة شكل متطرف من " جدار الذاكرة" . وكما هو موضح في ورقة فلين عام 1972، فإن العامل المميز الرئيسي لوحدات معالجة الرسومات القائمة على تقنية SIMT هو أنها تحتوي على وحدة فك تشفير/بث تعليمات واحدة، ولكن النوى التي تستقبل وتنفذ نفس التعليمات تكون طبيعية إلى حد كبير: وحدات حساب ومنطق خاصة بها، وملفات تسجيل خاصة بها، ووحدات تحميل/تخزين خاصة بها، وذاكرة تخزين مؤقتة مستقلة من المستوى الأول (L1). وبالتالي، على الرغم من أن جميع النوى تنفذ نفس التعليمات في وقت واحد وبشكل متزامن، إلا أنها تفعل ذلك ببيانات مختلفة تمامًا من مواقع ذاكرة مختلفة تمامًا. يُعدّ هذا أكثر تعقيدًا وتشعبًا بكثير من تقنية "Packed SIMD" ، التي تقتصر تمامًا على تنفيذ العمليات الحسابية المتوازية ذات البنية الأنبوبية فقط. ورغم أن التفاصيل الداخلية الدقيقة لوحدات معالجة الرسومات التجارية الحالية تُعتبر أسرارًا خاصة، فقد تمكّن فريق MIAOW [ 4 ] من تجميع معلومات غير موثقة كافية لتنفيذ جزء من بنية AMDGPU. [ 5 ]
التطورات الأخيرة
يجري تصميم العديد من معمارية وحدات المعالجة المركزية الحديثة كمعالجات متجهة. ويتبع امتداد RISC-V المتجهي مبادئ مشابهة للمعالجات المتجهة الأولى، ويجري تطبيقه في منتجات تجارية مثل Andes Technology AX45MPV. [ 6 ] كما يجري تطوير العديد من معمارية المعالجات المتجهة مفتوحة المصدر ، بما في ذلك ForwardCom و Libre-SOC .
مقارنة مع العمارة الحديثة
اعتبارًا من عام 2016تُطبّق معظم وحدات المعالجة المركزية التجارية بنىً تتضمن تعليمات SIMD ذات طول ثابت. للوهلة الأولى، يُمكن اعتبارها نوعًا من معالجة المتجهات لأنها تعمل على مجموعات بيانات متعددة (مُحوّلة إلى متجهات، ذات طول مُحدد)، وتستعير خصائص من معالجات المتجهات. مع ذلك، لا يُمكن، بحكم التعريف، اعتبار المعالج معالج متجهات فعليًا بمجرد إضافة تعليمات SIMD ، لأن SIMD ذات طول ثابت ، بينما المتجهات ذات أطوال متغيرة . يوضح المثال التالي الفرق بين الفئات الثلاث: SIMD البحتة، وSIMD المُسندة، ومعالجة المتجهات البحتة.
- تقنية SIMD النقية (الثابتة) - والمعروفة أيضًا باسم "SIMD المعبأ" [ 7 ] ، وتقنية SIMD داخل سجل (SWAR)، والمعالج ذو البنية الأنبوبية في تصنيف فلين. تشمل الأمثلة الشائعة التي تستخدم تقنية SIMD مع ميزات مستوحاة من معالجات المتجهات ما يلي: تعليمات MMX و SSE و AVX في معالجات Intel x86 ، وامتدادات 3DNow! في معالجات AMD، و ARM NEON ، وامتداد VIS في معالجات Sparc ، و AltiVec في معالجات PowerPC ، و MSA في معالجات MIPS ، ومعالج Cell .
- تقنية SIMD المُتنبأ بها - تدعم بعض تطبيقات SIMD التنبؤ لكل عنصر على حدة ، مثل ARM SVE2 و AVX-512
- تشمل المعالجات المتجهة البحتة - وفقًا لتصنيف دنكان - معالجات Cray-1 الأصلية ، وسلسلة Convex C ، و NEC SX ، وسلسلة Fujitsu VP ، ووحدة IBM 3090 Vector ، و RISC-V RVV . وعلى الرغم من اعتمادها على الذاكرة، فإن كلاً من TI ASC و CDC STAR-100 كانا معالجين متجهين.
تتضمن تصميمات وحدات المعالجة المركزية الأخرى بعض التعليمات المتعددة لمعالجة المتجهات على مجموعات بيانات متعددة (مُوَجَّهة)، والمعروفة عادةً باسم MIMD (تعليمات متعددة، بيانات متعددة)، وتُنفَّذ باستخدام VLIW (كلمة تعليمات طويلة جدًا) و EPIC (الحوسبة المتوازية الصريحة للتعليمات). على سبيل المثال، يجمع معالج Fujitsu FR-V بين ميزات VLIW والتنبؤ وSIMD المُعَبَّر. [ 8 ]
الفرق بين معالجات SIMD ومعالجات المتجهات
تفتقر مجموعات تعليمات SIMD إلى ميزات أساسية مقارنةً بمجموعات تعليمات المتجهات. وأهم هذه الميزات أن معالجات المتجهات، بحكم تعريفها وتصميمها، صُممت منذ نشأتها للعمل على متجهات ذات أطوال متغيرة، وليست مقيدة بقوى العدد اثنين .
يُزعم خطأً في كثير من الأحيان أن تقنية SIMD النقية (ذات العرض الثابت، بدون تنبؤ) هي "متجهة" (لأنها تعالج بيانات متجهة). يُظهر التحليل والمقارنة الدقيقة بين مجموعات تعليمات المعالجات (ISA) التاريخية والحديثة أن مجموعات تعليمات المعالجات المتجهة الفعلية تتيح إمكانية تحديد طول المتجه أثناء التشغيل، بحيث لا يكون من مضاعفات العدد اثنين. بعبارة أخرى، لا يتم ترميز عدد العناصر بشكل ثابت في التعليمات كما هو الحال في مجموعات تعليمات المعالجات SIMD. وقد تم شرح ذلك في مقال "SIMD: اعتبارها ضارة". [ 9 ]
- التعليمات الأصلية لجهاز Cray-1
VL، [ 10 ] - التعليمات
vsetvlفي RISC-V RVV، [ 11 ] - التعليمات
lvlفي NEC SX، [ 12 ] - في جهاز IBM 3090، تم تسمية التعليمات المكافئة
VLVCU[ 13 ] - في أنظمة الذاكرة إلى الذاكرة، مثل سلسلة CDC_Cyber#Cyber_200، كان طول المتجه يُشفّر جزئيًا في سجلات العناوين التي تحتوي على نقطة البداية في ذاكرة المتجه. استخدم طراز Cyber 200 أول 16 بت من عنوان 64 بت لتشفير طول المتجه، لجميع متجهات المصدر والوجهة. [ 14 ]
من الميزات الرئيسية الإضافية تقنية الإخفاء المُسند على مستوى العنصر . في نموذج Cyber 200، كان قناع البت على مستوى العنصر عبارة عن متجه مُخزّن في الذاكرة. تحتوي بعض معالجات المتجهات على سجلات قناع متجه، كما هو الحال في Cray-1 الذي استخدم، مثل Cyber 200، بتًا واحدًا لكل عنصر كقناع بكفاءة. مع ذلك، اختارت مجموعات تعليمات المتجهات الأخرى، مثل RISC-V، استخدام سجل من ملف سجلات المتجهات الرئيسي. [ 15 ]
تُعدّ تقنية SIMD المُسندة (جزء من تصنيف فلين ) أقنعة إسناد شاملة على مستوى كل عنصر، كما هو متوفر الآن في ARM SVE2 [ 16 ] و AVX-512 ، ولكن لا تحتوي أي من مجموعتي التعليمات هاتين على تعليمة صريحة لـ "تحديد طول المتجه". تستخدم تقنية SIMD المُسندة وحدات حسابية ومنطقية (ALU) ثابتة العرض، ولكنها تسمح بتنشيط الوحدات محليًا (مُسند) لتوفير مظهر متجهات متغيرة الطول. تُساعد الأمثلة أدناه في توضيح هذه الفروقات الجوهرية.
ثمة فرق رئيسي آخر: تقنية SIMD، نظرًا لاستخدامها معالجة الدفعات ذات العرض الثابت، غير قادرة بطبيعتها على التعامل مع التكرار والاختزال. ويتضح ذلك أكثر من خلال الأمثلة أدناه.
تسلسل المتجهات

التسلسل هو أسلوب لتحسين الأداء يسمح باستخدام مخرجات جزئية لعملية متجهة كمدخلات لعملية لاحقة دون انتظار اكتمال العملية الأولى. [ 17 ] وقد استخدم سيمور كراي هذا الأسلوب لأول مرة في حاسوبه العملاق كراي 1 بتردد 80 ميجاهرتز عام 1976. [ 6 ]
وصف
تستطيع الحواسيب معالجة جزء واحد أو أكثر من البيانات في آنٍ واحد، باتباع تعليمات الآلة ذات المعاني المحددة مسبقًا ( مجموعة التعليمات ). فعلى سبيل المثال، قد تُنفّذ تعليمة الجمع ما يُعادل "جمع A مع B ووضع الناتج في C". يُمكن - نظريًا على الأقل - ترميز بيانات A وB وC مباشرةً في التعليمة. مع ذلك، في التطبيقات الفعّالة، نادرًا ما تكون الأمور بهذه البساطة. فنادرًا ما تُرسل البيانات بصيغتها الخام، بل يُشار إليها بتمرير عنوان إلى موقع في الذاكرة يحتوي على البيانات. ويستغرق فك ترميز هذا العنوان واستخراج البيانات من الذاكرة بعض الوقت، وخلال هذه الفترة، عادةً ما يبقى المعالج في وضع الخمول بانتظار ظهور البيانات المطلوبة. ومع ازدياد سرعات المعالجات، أصبح زمن استجابة الذاكرة هذا عائقًا كبيرًا أمام الأداء؛ انظر ذاكرة الوصول العشوائي § جدار الذاكرة .
لتقليل الوقت المستغرق في هذه الخطوات، تستخدم معظم وحدات المعالجة المركزية الحديثة تقنية تُعرف باسم " تجميع التعليمات" ، حيث تمر التعليمات عبر عدة وحدات فرعية بالتتابع. تقرأ الوحدة الفرعية الأولى العنوان وتفك تشفيره، ثم تسترجع الوحدة التالية القيم الموجودة في تلك العناوين، وتقوم الوحدة التي تليها بإجراء العمليات الحسابية. تكمن ميزة التجميع في بدء فك تشفير التعليمات التالية حتى قبل أن تغادر التعليمات الأولى وحدة المعالجة المركزية، على غرار خط التجميع ، مما يجعل وحدة فك تشفير العناوين قيد الاستخدام باستمرار. تستغرق أي تعليمة معينة نفس الوقت لإكمالها، وهو وقت يُعرف باسم زمن الاستجابة ، ولكن يمكن لوحدة المعالجة المركزية معالجة مجموعة كاملة من العمليات، بشكل متداخل، بسرعة وكفاءة أكبر بكثير مما لو عالجتها واحدة تلو الأخرى.
تُطوّر معالجات المتجهات هذا المفهوم خطوةً أخرى. فبدلاً من معالجة التعليمات فقط، تُعالج البيانات نفسها أيضاً. إذ تُغذّى المعالج بتعليمات لا تقتصر على جمع A مع B، بل تشمل جمع جميع الأرقام "من هنا إلى هنا" مع جميع الأرقام "من هناك إلى هناك". وبدلاً من فك تشفير التعليمات باستمرار ثم جلب البيانات اللازمة لتنفيذها، يقرأ المعالج تعليمة واحدة من الذاكرة، ويُفهم ضمناً من تعريف التعليمة نفسها أنها ستُطبّق مرة أخرى على عنصر بيانات آخر، عند عنوان أكبر بمقدار واحد من العنوان السابق. وهذا يُحسّن فعالية التعليمات بشكلٍ كبير.
لتوضيح مدى أهمية هذا الأمر، لنأخذ مثالًا بسيطًا وهو جمع مجموعتين من عشرة أرقام. في لغة برمجة عادية، يُكتب "حلقة تكرارية" تأخذ كل زوج من الأرقام بدوره، ثم تجمعها. بالنسبة لوحدة المعالجة المركزية، سيبدو هذا كالتالي:
آلة 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 ؛ أنقص count ، كرر ؛ عد للخلف إذا لم يكن count قد وصل إلى 0 بعد .لكن بالنسبة لمعالج المتجهات، تبدو هذه المهمة مختلفة تماماً:
لنفترض أن لدينا سجلات متجهة v1-v3 ؛ بحجم يساوي أو يزيد عن 10. نقل $10 ، count ؛ count = 10. تحميل v1 ، a ، count. تحميل v2 ، b ، count. إضافة v3 ، v1 ، v2 . تخزين v3 ، c ، count. إرجاع .لاحظ عدم وجود تكرار في التعليمات، لأن الأجهزة هي التي نفذت 10 عمليات متسلسلة: في الواقع، يتم حساب عدد التكرارات على أساس صريح لكل تعليمة .
تأخذ مجموعات تعليمات المتجهات من نوع 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تتضمن هذه المقاربة العديد من الوفورات. [ 18 ]
- لا يتطلب الأمر سوى ثلاث عمليات ترجمة للعناوين. وبحسب بنية النظام، قد يمثل هذا توفيراً كبيراً بحد ذاته.
- ومن أوجه التوفير الأخرى جلب التعليمات وفك تشفيرها، وهو ما يجب القيام به مرة واحدة فقط بدلاً من عشر مرات.
- كما أن حجم الكود نفسه أصغر، مما قد يؤدي إلى استخدام أكثر كفاءة للذاكرة، وتقليل حجم ذاكرة التخزين المؤقت للتعليمات من المستوى الأول، وتقليل استهلاك الطاقة.
- مع انخفاض حجم البرنامج، أصبحت عملية التنبؤ بالتفرع أسهل.
- مع عدم تضمين الطول (المكافئ لعرض SIMD) في التعليمات، فإن التشفير ليس أكثر إحكاما فحسب، بل إنه أيضًا "مقاوم للمستقبل" ويسمح حتى لتصميمات المعالجات المدمجة بالنظر في استخدام المتجهات فقط للحصول على جميع المزايا الأخرى، بدلاً من السعي وراء الأداء العالي.
بالإضافة إلى ذلك، في معالجات المتجهات الحديثة، تم تقديم "الفشل عند الأول" أو "الخطأ أولاً" (انظر أدناه) مما يوفر المزيد من المزايا.
بل وأكثر من ذلك، قد يحتوي معالج المتجهات عالي الأداء على وحدات وظيفية متعددة تجمع هذه الأرقام بالتوازي. ولا يتطلب الأمر التحقق من التبعيات بين هذه الأرقام لأن تعليمات المتجهات تحدد عمليات مستقلة متعددة. هذا يبسط منطق التحكم المطلوب، ويمكنه تحسين الأداء بشكل أكبر عن طريق تجنب حالات التوقف. وبالتالي، تُنجز العمليات الحسابية بشكل أسرع بكثير إجمالاً، والعامل المحدد هو الوقت اللازم لجلب البيانات من الذاكرة.
لا يمكن معالجة جميع المشاكل بهذا النوع من الحلول. فإضافة هذه الأنواع من التعليمات تزيد بالضرورة من تعقيد وحدة المعالجة المركزية. وهذا التعقيد عادةً ما يُبطئ تنفيذ التعليمات الأخرى ، أي عندما لا يتم جمع أعداد متتالية كثيرة. كما أن التعليمات الأكثر تعقيدًا تزيد من تعقيد وحدات فك التشفير، مما قد يُبطئ فك تشفير التعليمات الأكثر شيوعًا، مثل الجمع العادي. ( يمكن التخفيف من هذا إلى حد ما بالحفاظ على مبادئ RISC في بنية مجموعة التعليمات: إذ لا تضيف RVV سوى حوالي 190 تعليمة متجهة حتى مع الميزات المتقدمة. [ 19 ] )
صُممت معالجات المتجهات تقليديًا لتعمل بكفاءة عالية عند معالجة كميات هائلة من البيانات. ولهذا السبب، وُجدت هذه المعالجات بشكل أساسي في الحواسيب العملاقة ، حيث كانت هذه الحواسيب العملاقة تُستخدم عادةً في مراكز التنبؤات الجوية ومختبرات الفيزياء، حيث تُعالج كميات هائلة من البيانات. مع ذلك، وكما هو موضح أعلاه، فإن كفاءة مجموعات تعليمات المتجهات تُوفر مزايا أخرى جذابة حتى في تطبيقات الأنظمة المدمجة.
تعليمات متجهة
يفترض مثال الشفرة الزائفة المتجهة أعلاه افتراضًا أساسيًا مفاده أن الحاسوب المتجه قادر على معالجة أكثر من عشرة أرقام في دفعة واحدة. مع زيادة عدد الأرقام في سجل المتجه، يصبح من غير العملي للحاسوب امتلاك سجل بهذا الحجم. لذا، يكتسب معالج المتجهات إما القدرة على تنفيذ الحلقات بنفسه، أو يُتيح للمبرمج نوعًا من سجل التحكم (الحالة) المتجهي، والذي يُعرف عادةً باسم طول المتجه.
توجد التعليمات ذاتية التكرار في الحواسيب المتجهة القديمة مثل STAR-100، حيث يُوصف الإجراء المذكور أعلاه بتعليمات واحدة (على غرار vadd c, a, b, $10). كما توجد أيضًا في بنية x86REP كبادئة. مع ذلك، لا يمكن إجراء سوى العمليات الحسابية البسيطة جدًا بكفاءة في الأجهزة بهذه الطريقة دون زيادة كبيرة في التكلفة. ولأن جميع المعاملات يجب أن تكون في الذاكرة لبنية STAR-100، فقد أصبح زمن الوصول الناتج عن الوصول كبيرًا جدًا أيضًا.
أضافت برودكوم مساحة في جميع عمليات المتجهات في مجموعة تعليمات Videocore IV لحقل REP، ولكن على عكس STAR-100 الذي يستخدم الذاكرة للتكرار، فإن تكرارات Videocore IV موجودة في جميع العمليات بما في ذلك عمليات المتجهات الحسابية. يمكن أن يكون طول التكرار ضمن نطاق صغير من قوى العدد اثنين أو مصدره أحد سجلات القياس العددي. [ 20 ]
قدّم معالج Cray-1 فكرة استخدام سجلات المعالج لتخزين بيانات المتجهات على دفعات. ويمكن ضبط أطوال الدفعات (طول المتجه، VL) ديناميكيًا باستخدام تعليمة خاصة، وتكمن أهميته مقارنةً بمعالج Videocore IV (والأهم من ذلك، كما سيتبين لاحقًا، معالج SIMD أيضًا) في أن طول التكرار لا يُشترط أن يكون جزءًا من ترميز التعليمات. وبهذه الطريقة، يُمكن إنجاز قدر أكبر من العمل في كل دفعة؛ كما أن ترميز التعليمات أكثر أناقةً واختصارًا. العيب الوحيد هو أنه للاستفادة الكاملة من هذه السعة الإضافية لمعالجة الدفعات، كان لا بد من زيادة سرعة تحميل الذاكرة وتخزينها تبعًا لذلك. يُزعم أحيانًا أن هذا عيب في معالجات المتجهات من نوع Cray، وقد وقعت سلسلة Fujitsu VP في هذا الخطأ: في الواقع، يُعد هذا جزءًا من تحقيق إنتاجية عالية الأداء، كما هو الحال في وحدات معالجة الرسومات (GPUs) ، التي تواجه المشكلة نفسها تمامًا.
تدّعي حواسيب SIMD الحديثة أنها تتفوق على حواسيب Cray القديمة باستخدامها المباشر لوحدات حسابية ومنطقية متعددة، مما يوفر درجة أعلى من التوازي مقارنةً باستخدام خط الأنابيب القياسي فقط. تجمع معالجات المتجهات الحديثة (مثل SX-Aurora TSUBASA ) بين الطريقتين، حيث تُرسل بيانات متعددة إلى وحدات حسابية ومنطقية داخلية متعددة بتقنية SIMD، ويتم تحديد عدد الوحدات المُرسلة ديناميكيًا بواسطة برنامج المتجهات أثناء التشغيل. يمكن استخدام الأقنعة لتحميل البيانات وتخزينها بشكل انتقائي في مواقع الذاكرة، كما يمكن استخدام هذه الأقنعة نفسها لتعطيل عناصر المعالجة في وحدات حسابية ومنطقية SIMD بشكل انتقائي. بعض المعالجات المزودة بتقنية SIMD (مثل AVX-512 وARM SVE2 ) قادرة على هذا النوع من المعالجة الانتقائية لكل عنصر ( "المعالجة المُتوقعة" )، وهي التي تستحق إلى حد ما تسمية "معالج المتجهات"، أو على الأقل تستحق الادعاء بقدرتها على "معالجة المتجهات". أما معالجات SIMD التي لا تدعم التنبؤ لكل عنصر (مثل MMX و SSE و AltiVec ) فلا تدعم هذه الميزة قطعًا.
تستخدم وحدات معالجة الرسومات الحديثة، التي تضم العديد من وحدات الحوسبة الصغيرة، كل منها مزودة بوحدة حسابية منطقية (ALU) مستقلة بتقنية SIMD، تقنية التعليمات المفردة متعددة الخيوط (SIMT). تعمل وحدات SIMT من وحدة تعليمات متزامنة مشتركة للبث. تتميز "سجلات المتجهات" بعرضها الكبير، وتميل خطوط الأنابيب إلى أن تكون طويلة. يتضمن جانب "الخيوط" في تقنية SIMT كيفية معالجة البيانات بشكل مستقل على كل وحدة من وحدات الحوسبة.
بالإضافة إلى ذلك، قد تستخدم وحدات معالجة الرسومات مثل Broadcom Videocore IV ومعالجات المتجهات الخارجية الأخرى مثل NEC SX-Aurora TSUBASA عددًا أقل من وحدات المتجهات مما يوحي به عرضها: فبدلاً من استخدام 64 وحدة لمسجل بعرض 64 رقمًا، قد يقوم الجهاز بتنفيذ حلقة متسلسلة على 16 وحدة لنهج هجين. وتستطيع Broadcom Videocore IV أيضًا اتباع هذا النهج الهجين: فبينما تنص تعليماتها ظاهريًا على أن محرك SIMD QPU يدعم عمليات مصفوفة الفاصلة العائمة بطول 16، فإنها في الواقع تنفذها 4 مرات في كل مرة، كشكل آخر من أشكال "الخيوط". [ 21 ]
أمثلة على تعليمات المتجهات
يبدأ هذا المثال بخوارزمية ("IAXPY")، حيث نعرضها أولاً باستخدام التعليمات العددية، ثم SIMD، ثم SIMD المُسندة، وأخيراً تعليمات المتجهات. يساعد هذا تدريجياً في توضيح الفرق بين معالج المتجهات التقليدي ومعالج SIMD الحديث. يبدأ المثال بنسخة عددية صحيحة 32 بت من دالة "DAXPY"، مكتوبة بلغة C :
void iaxpy ( size_t n , int a , const int x [], int y []) { for ( size_t i = 0 ; i < n ; i ++ ) { y [ i ] = a * x [ i ] + y [ i ]; } }في كل تكرار، يُضاف عنصر من x مضروبًا في a إلى كل عنصر من عناصر y. يُكتب البرنامج بصيغة خطية قياسية لسهولة القراءة.
مُجمِّع قياسي
أما النسخة العددية من هذا فستقوم بتحميل نسخة واحدة من كل من x و y، ومعالجة عملية حسابية واحدة، وتخزين نتيجة واحدة، ثم التكرار:
حلقة: تحميل 32 بت r1 ، x ؛ تحميل بيانات 32 بت واحدة تحميل 32 بت r2 ، y ضرب 32 بت r1 ، a ، r1 ؛ r1 := r1 * a إضافة 32 بت r3 ، r1 ، r2 ؛ r3 := r1 + r2 تخزين 32 بت r3 ، y إضافة x ، x ، $4 ؛ x := x + 4 إضافة y ، y ، $4 طرح n ، n ، $1 ؛ n := n - 1 عدّ n ، حلقة ؛ العودة إلى الحلقة إذا كان n > 0 إخراج: إرجاعيظل الكود المشابه لـ 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] retSIMD النقي (غير المتوقع، المعبأ)
تستطيع بنية SIMD الحديثة المعبأة، والمعروفة بأسماء عديدة (مذكورة في تصنيف فلين )، تنفيذ معظم العمليات على دفعات. يتشابه الكود في معظمه مع النسخة العددية. يُفترض هنا أن كلاً من x و y مُحاذيان بشكل صحيح (يبدآن فقط من مضاعفات 16) وأن n من مضاعفات 4، وإلا سيلزم وجود كود إعداد لحساب قناع أو لتشغيل نسخة عددية. يمكن أيضًا افتراض، للتبسيط، أن تعليمات SIMD تتضمن خيارًا لتكرار المعاملات العددية تلقائيًا، كما هو الحال في ARM NEON. [ 22 ] إذا لم يكن الأمر كذلك، فيجب استخدام "البث" (broadcast) لنسخ الوسيط العددي عبر سجل SIMD.
splatx4 v4 , a ; v4 = a,a,a,aسيكون الوقت المستغرق مماثلاً بشكل أساسي لتنفيذ المتجهات y = mx + cالموصوف أعلاه.
vloop: تحميل 32x4 v1 ، x تحميل 32x4 v2 ، y ضرب 32x4 v1 ، a ، v1 ؛ v1 := v1 * a إضافة 32x4 v3 ، v1 ، v2 ؛ v3 := v1 + v2 تخزين 32x4 v3 ، y إضافة x ، x ، $ 16 ؛ x := x + 16 إضافة y ، y ، $ 16 طرح n ، n ، $4 ؛ n := n - 4 ...لاحظ أن مؤشري 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) لزيادة الأداء، أضاف مهندسو هذه البنية وحدات SIMD بعرض 2، ثم 4، ثم 8 وما فوق. لذا، يتضح سبب وجود AVX-512 في معمارية x86.
بدون التنبؤ، كلما زاد عرض شريحة SIMD، تفاقمت المشاكل، مما يؤدي إلى انتشار هائل لرموز العمليات، وتدهور الأداء، واستهلاك إضافي للطاقة، وتعقيد غير ضروري للبرمجيات. [ 23 ]
من ناحية أخرى، صُممت معالجات المتجهات لإجراء عمليات حسابية ذات طول متغير لعدد عشوائي n، وبالتالي فهي تتطلب إعدادًا بسيطًا للغاية، ولا تتطلب أي تنظيف. حتى بالمقارنة مع مجموعات تعليمات SIMD التي تحتوي على أقنعة (ولكن بدون setvlتعليمات)، تُنتج معالجات المتجهات شفرة أكثر اختصارًا لأنها لا تحتاج إلى إجراء حساب قناع صريح لتغطية العناصر القليلة الأخيرة (كما هو موضح أدناه).
SIMD المتوقع
بافتراض وجود بنية مجموعة تعليمات SIMD افتراضية (قادرة على استخدام القناع) ، وبافتراض أن تعليمات 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 out: retهنا نلاحظ أن الكود أصبح أكثر وضوحًا ولكنه أكثر تعقيدًا بعض الشيء؛ على الأقل، لا توجد عملية تهيئة أو تنظيف؛ ففي التكرار الأخير للحلقة، يتم ضبط قناع الشرط على أحد القيم التالية: 0b0000، 0b0001، 0b0011، 0b0111، أو 0b1111، مما ينتج عنه تنفيذ ما بين 0 و4 عمليات على عناصر SIMD، على التوالي. وهناك تعقيد إضافي محتمل: بعض معمارية RISC لا تحتوي على تعليمة "min"، مما يستدعي استخدام التفرع أو المقارنة الشرطية العددية.
من الواضح أن تقنية SIMD المُسندة تستحق على الأقل وصف "قادرة على التعامل مع المتجهات"، لأنها قادرة على التعامل مع المتجهات ذات الأطوال المتغيرة باستخدام أقنعة الإسناد. مع ذلك، فإن الخطوة الأخيرة نحو بنية مجموعة تعليمات متجهة "حقيقية" هي عدم وجود أي دليل في بنية مجموعة التعليمات على عرض SIMD، تاركةً ذلك بالكامل للأجهزة.
مجموعة تعليمات متجهة نقية (حقيقية)
في معمارية مجموعة تعليمات المتجهات من نوع Cray، مثل RVV، تُستخدم تعليمة تُسمى " setvl " (ضبط طول المتجه). يُحدد الجهاز أولًا عدد قيم البيانات التي يُمكنه معالجتها في "متجه" واحد: قد يكون هذا إما سجلات فعلية أو حلقة داخلية (النهج الهجين المذكور أعلاه). يُطلق على هذا الحد الأقصى (عدد "مسارات" الجهاز) اسم "MVL" (الحد الأقصى لطول المتجه). تجدر الإشارة إلى أنه، كما هو الحال في SX-Aurora وVideocore IV، قد يكون MVL عددًا فعليًا لمسارات الجهاز أو عددًا افتراضيًا . (ملاحظة: كما ذُكر في دليل ARM SVE2، يجب على المبرمجين تجنب افتراض عرض متجه ثابت؛ وبالتالي، فإن MVL ليس قيمة يحتاج المبرمج إلى معرفتها. قد يكون هذا الأمر مُربكًا بعض الشيء بعد سنوات من التفكير في SIMD).
عند استدعاء الدالة setvl مع تحديد عدد عناصر البيانات المتبقية للمعالجة، يُسمح للدالة setvl (بل يُشترط عليها) تقييد هذا العدد إلى الحد الأقصى لطول المتجه (MVL)، وبالتالي تُعيد العدد الفعلي الذي يمكن للمعالجة بواسطة الجهاز في تعليمات المتجه اللاحقة، وتُعيّن السجل الداخلي الخاص "VL" إلى نفس القيمة. تُشير ARM إلى هذه التقنية باسم البرمجة "غير المعتمدة على طول المتجه" في دروسها التعليمية حول SVE2. [ 24 ]
فيما يلي مُجمِّع المتجهات على نمط 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 add y , t0 * 4 # زيادة y بمقدار VL*4 add x , t0 * 4 # زيادة x بمقدار VL*4 sub n , t0 # n -= VL (t0) bnez n , vloop # كرر إذا كان n != 0لا يختلف هذا جوهريًا عن إصدار SIMD (الذي يعالج 4 عناصر بيانات في كل دورة إذا كان MVL يساوي 4)، أو عن الإصدار القياسي الأولي (الذي يعالج عنصرًا واحدًا فقط). لا يزال n يحتوي على عدد عناصر البيانات المتبقية للمعالجة، بينما يحتوي t0 على نسخة من VL - أي العدد الذي سيتم معالجته في كل تكرار. يُطرح t0 من n بعد كل تكرار، وإذا كان n يساوي صفرًا، فهذا يعني أنه قد تمت معالجة جميع العناصر.
هناك عدد من الأمور التي يجب ملاحظتها عند المقارنة مع متغير تجميع SIMD المتوقع:
setvlتتضمن التعليمات تعليماتminأخرى- بينما كانت صيغة SIMD تُحدد عرض الحزمة (4) بشكل ثابت عند إنشاء القناع وفي عرض SIMD (مثل load32x4)، فإن نظائرها في بنية مجموعة تعليمات المتجهات لا تخضع لهذا القيد. وهذا يجعل برامج المتجهات قابلة للنقل، ومستقلة عن الموردين، ومواكبة للتطورات المستقبلية.
- يؤدي ضبط VL فعليًا إلى إنشاء قناع مسند مخفي يتم تطبيقه تلقائيًا على المتجهات
- في حين أن طول بتات القناع في تقنية SIMD المشروطة يقتصر على ما يمكن تخزينه في سجل قياسي (أو سجل قناع خاص)، فإن سجلات القناع في بنية مجموعة التعليمات المتجهة (Vector ISA) لا تخضع لهذا القيد. ويمكن أن يصل عدد عناصر متجهات Cray-I إلى ما يزيد قليلاً عن 1000 عنصر (في عام 1977).
وهكذا يمكن أن نرى بوضوح شديد كيف تقلل مجموعات تعليمات المتجهات من عدد التعليمات.
لاحظ أيضًا، كما هو الحال في متغير SIMD المُسند، أن المؤشرين x و y يتقدمان بمقدار t0 مضروبًا في أربعة لأنهما يشيران إلى بيانات 32 بت، بينما يتم إنقاص n بمقدار t0 مباشرةً. بالمقارنة مع مُجمِّع SIMD ذي الحجم الثابت، لا يوجد فرق واضح يُذكر: يتقدم x و y بمقدار ثابت 16، ويتم إنقاص n بمقدار ثابت 4، لذا يصعب في البداية إدراك أهمية ذلك. يكمن الفرق في إدراك أن وحدة معالجة المتجهات قد تكون قادرة على تنفيذ 4 عمليات متزامنة، أو 64، أو 10000، وسيظل مُجمِّع المتجهات هو نفسه تمامًا في جميع الحالات، ولن يكون هناك أي رمز تنظيف لـ SIMD . حتى بالمقارنة مع SIMD المُسند، يظل هذا المتغير أكثر إيجازًا ووضوحًا وأناقةً، ويستهلك موارد أقل.
ليس فقط أنه برنامج أكثر إحكاما (توفير في حجم ذاكرة التخزين المؤقت L1)، ولكن كما ذكرنا سابقًا، يمكن لإصدار المتجهات إصدار معالجة بيانات أكثر بكثير إلى وحدات الحساب والمنطق، مما يوفر الطاقة مرة أخرى لأن فك تشفير التعليمات وإصدارها يمكن أن يظلا في وضع الخمول.
بالإضافة إلى ذلك، يمكن أن يبدأ عدد العناصر المُدخلة إلى الدالة من الصفر. هذا يُعيّن طول المتجه إلى الصفر، مما يُعطّل فعليًا جميع تعليمات المتجه، ويجعلها عديمة التأثير أثناء التشغيل. وبالتالي، على عكس SIMD غير المُعتمد، حتى عندما لا توجد عناصر للمعالجة، لا يوجد أي كود تنظيف أو تمهيد مُهدر: حتى عندما يكون n=0.
منشأة IBM 370 Vector
في جهاز IBM 3090 تم تحقيق فائدة إضافية (تقليل عدد التعليمات بشكل أكبر). [ 25 ]
VLVCU GR4 # تحميل VCT، تحديث GR4 وCCode vloop: vld32 v0 , x , v0 # تحميل المتجه x، تحديث v0 vld32 v1 , y # تحميل المتجه y (بدون تحديث v1) vmadd32 v1 , v0 , a # v1 += v0 * a vst32 v1 , y , v1 # تخزين Y، الآن تحديث v1 VLVCU GR4 # تحميل VCT، تحديث GR4 وCCode BC 3 , vloop # العودة للخلف إذا كان VCT>0VLVCUلن تقتصر هذه التعليمات على تحديد طول عدّ المتجهات ( VCT) فحسب، بل ستطرح أيضًا طول المتجه الجديد من سجل القيمة العددية، وتُحدّث رمز الحالة الذي يمكن للوحدة الفرعية اختباره. وبذلك، تكون قد VLVCUدمجت وظيفتين (ثلاث وظائف إذا أُضيف إليها تحديد رمز الحالة) في وظيفة واحدة.
# يقوم IBM 370 VLVCU بما يلي: setvl GR4 # VL=min(MVL, GR4) sub GR4 , VL # n -= VL (GR4)، ويتم أيضًا تعيين CCعلاوة على ذلك، يمكن لكل من تعليمات Vector-Load و Vector-Store إجراء تحديث سجلات العناوين، مما يوفر التعليمات الصريحة لإجراء حسابات العناوين التي تم إجراؤها بالفعل ، في الخفاء، عند تحميل/تخزين كل عنصر من عناصر المتجه.
يتم استخدام نفس المبدأ تمامًا في Libre-SOC ، كما هو موضح بمثال DAXPY (نقطة عائمة 64 بت): [ 26 ]
# r5: عدد n؛ r6: مؤشر x؛ r7: مؤشر y؛ fp1: a mtctr 5 # نقل n إلى CTR vloop: setvl MAXVL = 32 , VL = CTR # في الواقع VL=MIN(MAXVL,CTR) # DAXPY هو 8 بايت، وبالتالي 8(r6) و8(r7) sv.lfdup * 32 , 8 ( r6 ) # تحميل x في fp32-63، زيادة x sv.lfd / els * 64 , 8 ( r7 ) # تحميل y في fp64-95، بدون زيادة sv.fmadd * 64 ,* 64 , 1 ,* 32 # (*y) = (*y) * (*x) + a sv.stfdup * 64 , 8 ( r7 ) # التخزين في y، زيادة y بعد ذلك sv.bc / ctr vloop # قلل نسبة التحكم بمقدار VL، اقفز !صفرتُضاف أوضاع ما بعد التحديث إلى النسخ المُحسّنة من أوامر التحميل مع التحديث والتخزين مع التحديث، مما يُغني عن الحاجة إلى تعليمة منفصلة لحساب العنوان عندما تُنجز وحدة المعالجة المركزية (CPU) هذه المهمة داخليًا. تجدر الإشارة مجددًا إلى أنه كما في مثال IBM 370، يتم تحديث عنوان المتجه y بواسطة أمر التخزين مع التحديث، وليس بواسطة أمر التحميل مع التحديث. يُستخدم سجل CTR الخاص بمعالج Power ISA للعدّ الإجمالي بدلًا من سجل عددي، وتُجري التعليمة sv.bc/CTRعملية طرح قيمة CTR بمقدار طول المتجه الحالي (VL)، ثم تتحقق من كون قيمة CTR تساوي صفرًا، وفي حال كانت قيمتها لا تساوي صفرًا، يتم تنفيذ التفرع.
يختلف هذا النهج، لكنه يحقق نفس النتيجة النهائية التي يحققها معالج IBM 3090: ضغط كبير للتعليمات التي تُعتبر أصلاً مضغوطة للغاية. [ 27 ] مثال على حلقة داخلية في معالج RISC-V Vector DAXPY يتكون من 10 تعليمات، بينما يتكون كل من Libre-SOC وIBM 370، كما هو موضح أعلاه، من 6 تعليمات: أي بانخفاض قدره 40%.
مثال على اختزال المتجهات
يبدأ هذا المثال بخوارزمية تتضمن الاختزال. وكما هو الحال مع المثال السابق، سيتم عرضها أولاً باستخدام تعليمات قياسية، ثم تعليمات SIMD، وأخيراً تعليمات متجهة، بدءاً من لغة C :
void ( size_t n , int a , const int x []) { int y = 0 ; for ( size_t i = 0 ; i < n ; i ++ ) y += x [ i ]; return y ; }هنا، يتم استخدام مُجمِّع (y) لجمع كل القيم في المصفوفة x.
مُجمِّع قياسي
أما النسخة العددية من هذا فستقوم بتحميل كل قيمة من x، وإضافتها إلى y، ثم تكرار العملية:
set y , 0 ; تم تهيئة y إلى الصفر loop: 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 , loop ; العودة إلى الحلقة إذا كانت n > 0 out: ret y ; إرجاع النتيجة، yهذا أمر بسيط للغاية. يبدأ "y" من الصفر، ويتم تحميل الأعداد الصحيحة ذات 32 بت واحدًا تلو الآخر في r1، وإضافتها إلى y، ثم يتم نقل عنوان المصفوفة "x" إلى العنصر التالي في المصفوفة.
تقليل SIMD
هنا تبدأ المشاكل. نظام SIMD مصممٌ بحيث لا يسمح بإجراء عمليات حسابية "بين العناصر". يمكن جمع العنصر 0 من سجل SIMD مع العنصر 0 من سجل آخر، ولكن لا يمكن جمع العنصر 0 مع أي عنصر آخر غير العنصر 0. هذا يفرض قيودًا شديدة على التطبيقات المحتملة. ولتبسيط الأمر، يمكن افتراض أن n يساوي 8 بالضبط.
addl r3 , x , $16 ; for 2nd 4 of x load32x4 v1 , x ; first 4 of x load32x4 v2 , r3 ; 2nd 4 of x add32x4 v1 , v2 , v1 ; add 2 groupsحتى هذه المرحلة، تم تنفيذ أربع عمليات إضافة:
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 من المجموعة الأولى مع العنصر 3 من المجموعة الثانية
لكن نظرًا لأن شريحة SIMD ذات العرض 4 غير قادرة بطبيعتها على الجمع، x[0]+x[1]على سبيل المثال، فإن الأمور تتدهور بسرعة كما حدث مع الحالة العامة لاستخدام SIMD في حلقات IAXPY للأغراض العامة. لجمع النتائج الجزئية الأربعة، يمكن استخدام شريحة SIMD ذات العرض 2، متبوعة بعملية جمع عددية واحدة، للحصول على الإجابة النهائية، ولكن في كثير من الأحيان، يجب نقل البيانات من سجلات SIMD المخصصة قبل إجراء العملية الحسابية العددية الأخيرة.
حتى مع وجود حلقة تكرار عامة (حيث n غير ثابت)، فإن الطريقة الوحيدة لاستخدام SIMD بعرض 4 هي افتراض وجود أربعة "تدفقات" منفصلة، كل منها بإزاحة قدرها أربعة عناصر. وأخيرًا، يجب جمع النتائج الجزئية الأربعة. تتفاقم المشاكل مع زيادة عرض وحدة SIMD (حيث يتم إدخال مجموعة جديدة تمامًا من التعليمات)، والأسوأ من ذلك، أنه تم حذف بعض التعليمات الخاصة بالجمع الأفقي، مثل AMD XOP_instruction_set ، بعد بضع سنوات. تتضمن بعض التقنيات إعادة ترتيب العناصر: يمكن العثور على أمثلة على الإنترنت تتطلب معرفة تفصيلية للغاية حول AVX-512 و SSE لكيفية إجراء "الجمع الأفقي" [ 28 ] [ 29 ].
بصرف النظر عن حجم البرنامج وتعقيده، تنشأ مشكلة محتملة إضافية إذا تم استخدام حسابات الفاصلة العائمة: حقيقة أن القيم لا يتم جمعها بترتيب صارم (أربع نتائج جزئية) يمكن أن تؤدي إلى أخطاء في التقريب.
تقليل حجم متجه ISA
تتضمن مجموعات تعليمات المتجهات عمليات اختزال حسابية مدمجة في بنية مجموعة التعليمات. إذا افترضنا أن n أقل من أو يساوي الحد الأقصى لطول المتجه، فإن ثلاث تعليمات فقط مطلوبة:
setvl t0 , n # VL=t0=min(MVL, n) vld32 v0 , x # تحميل المتجه x vredadd32 y , v0 # دمج المتجهين في yالكود عندما يكون n أكبر من الحد الأقصى لطول المتجه ليس أكثر تعقيدًا بكثير، وهو نمط مشابه للمثال الأول ("IAXPY").
set y , 0 vloop: setvl t0 , n # VL=t0=min(MVL, n) vld32 v0 , x # تحميل المتجه x vredadd32 y , y , v0 # إضافة جميع قيم x إلى y add x , t0 * 4 # زيادة قيمة x بمقدار VL*4 sub n , t0 # n -= VL (t0) bnez n , vloop # كرر إذا كان n != 0 ret yتتميز هذه الخوارزمية ببساطتها الشديدة مقارنةً بخوارزمية SIMD. وكما هو الحال مع مثال IAXPY، فإن الخوارزمية لا تتأثر بطول المتجه (حتى في التطبيقات المضمنة حيث يكون الحد الأقصى لطول المتجه واحدًا فقط).
قد تقوم التطبيقات في الأجهزة، إذا كانت متأكدة من الحصول على الإجابة الصحيحة، بإجراء عملية الاختزال بالتوازي. توفر بعض مجموعات تعليمات المتجهات وضع الاختزال المتوازي كخيار صريح، وذلك عندما يعلم المبرمج أن أي أخطاء تقريب محتملة لا تُؤثر، وأن زمن الاستجابة المنخفض أمر بالغ الأهمية. [ 30 ]
يسلط هذا المثال الضوء مرة أخرى على فرق جوهري حاسم بين معالجات المتجهات الحقيقية ومعالجات SIMD، بما في ذلك معظم وحدات معالجة الرسومات التجارية، المستوحاة من ميزات معالجات المتجهات.
رؤى مستقاة من الأمثلة
بالمقارنة مع أي معالج SIMD يدّعي أنه معالج متجهي، فإنّ انخفاض حجم البرنامج بمقدار عشرة أضعاف يُعدّ مذهلاً. مع ذلك، فإنّ هذا المستوى من الكفاءة على مستوى مجموعة تعليمات المعالج (ISA) له ثمن باهظ على مستوى العتاد.
- من مثال IAXPY، يمكن ملاحظة أنه على عكس معالجات SIMD، التي يمكنها تبسيط أجهزتها الداخلية عن طريق تجنب التعامل مع الوصول غير المتوافق للذاكرة، لا يمكن لمعالج المتجهات أن يفلت من هذا التبسيط: تتم كتابة الخوارزميات التي تعتمد بشكل أساسي على نجاح تحميل وتخزين المتجهات، بغض النظر عن محاذاة بداية المتجه.
- بينما يتضح من مثال الاختزال أنه باستثناء تعليمات التبديل، تتجنب تقنية SIMD بحكم تعريفها عمليات الربط بين المسارات تمامًا (لا يمكن إضافة العنصر 0 إلا إلى عنصر 0 آخر)، فإن معالجات المتجهات تعالج هذه المشكلة مباشرةً. ما يضطر المبرمجون إلى فعله في البرمجيات (باستخدام التبديل وحيل أخرى، لتبديل البيانات إلى "المسار" الصحيح)، يجب على معالجات المتجهات القيام به تلقائيًا في الأجهزة.
إذن، هناك خيار إما أن يكون
- البرمجيات المعقدة والأجهزة المبسطة (SIMD)
- برامج مبسطة وأجهزة معقدة (معالجات متجهة)
هذه الاختلافات الصارخة هي ما يميز المعالج المتجهي عن المعالج الذي يحتوي على تقنية SIMD.
ميزات معالج المتجهات
في حين أن العديد من مجموعات تعليمات SIMD تستعير أو تستلهم من القائمة أدناه، فإن الميزات النموذجية التي سيحتوي عليها معالج المتجهات هي: [ 31 ] [ 32 ] [ 33 ]
- تحميل وتخزين المتجهات - تتميز بنى المتجهات ذات التصميم من سجل إلى سجل (على غرار بنى التحميل والتخزين للمعالجات العددية) بتعليمات لنقل عناصر متعددة بين الذاكرة وسجلات المتجهات. وعادةً ما تدعم هذه البنى أنماط عنونة متعددة.
- يُعد نمط العنونة بخطوة الوحدة أمرًا أساسيًا: فالعناصر متجاورة.
- تدعم بنى المتجهات الحديثة عادةً خطوات ثابتة عشوائية (إزاحات).
- كما أن البنى الحديثة تحتوي على أنماط عنونة التشتت/التجميع (وتسمى أيضًا أنماط العنونة المفهرسة ).
- قد تتضمن البنى المتقدمة أيضًا دعمًا لتحميل وتخزين البيانات في أجزاء من الذاكرة. تقرأ عمليات تحميل البيانات في أجزاء من الذاكرة متجهًا، حيث يمثل كل عنصر بنية بيانات تحتوي على عدة أعضاء. تُستخرج الأعضاء من بنية البيانات (العنصر)، ويُوضع كل عضو مُستخرج في سجل متجه مختلف.
- تحتوي بعض البنى المتقدمة على متغيرات تعتمد على الفشل أولاً من عمليات تحميل وتخزين المتجهات القياسية (الموضحة أدناه).
- كان لدى IBM 370 أيضًا تحميل/تخزين متجه متفرق يستخدم قناع بت لتحديد العناصر المراد تحميلها/تخزينها بالتسلسل: في الواقع مفهوم الضغط/التوسيع ولكن سجل الذاكرة بدلاً من (أدناه) سجل السجل.
- تتيح عمليات القناع - أقنعة المسندات - إنشاء عبارات if/then/else متوازية دون اللجوء إلى التفرعات. وهذا يسمح بتحويل التعليمات البرمجية التي تحتوي على عبارات شرطية إلى تعليمات متجهة.
- الضغط والتوسيع - عادةً باستخدام قناع بت، يتم ضغط البيانات أو توسيعها (إعادة توزيعها) بشكل خطي بناءً على ما إذا كانت البتات في القناع مضبوطة أم فارغة، مع الحفاظ دائمًا على الترتيب التسلسلي وعدم تكرار القيم (على عكس التجميع والتشتيت المعروف أيضًا باسم التبديل). تظهر هذه التعليمات في AVX-512 .
- تجميع/تشتيت السجلات (المعروف أيضًا باسم التبديل) [ 34 ] - هو شكل أقل تقييدًا وأكثر عمومية من نمط الضغط/التوسيع، حيث يأخذ متجهًا واحدًا لتحديد المؤشرات المستخدمة "لإعادة ترتيب" متجه آخر. يُعدّ التجميع/التشتيت أكثر تعقيدًا في التنفيذ من الضغط/التوسيع، ولأنه غير متسلسل بطبيعته، فقد يتداخل مع تسلسل المتجهات . يجب عدم الخلط بينه وبين أوضاع تحميل/تخزين الذاكرة للتجميع/التشتيت ، حيث تعمل عمليات متجه التجميع/التشتيت على سجلات المتجهات، وغالبًا ما يُطلق عليها اسم تعليمة التبديل.
- Splat و Extract - مفيدان للتفاعل بين القيم العددية والمتجهة، حيث يقومان ببث قيمة واحدة عبر متجه، أو استخراج عنصر واحد من متجه، على التوالي.
- إيوتا – تعليمة بسيطة للغاية ومفيدة استراتيجياً تقوم بإسقاط قيم فورية متزايدة بالتسلسل في العناصر المتتالية. تبدأ عادةً من الصفر.
- الاختزال والتكرار هما عمليتان تُنفذان عملية mapreduce على متجه (على سبيل المثال، إيجاد القيمة القصوى لمتجه كامل، أو جمع جميع عناصره). يكون التكرار على الشكل التالي:
x[i] = y[i] + x[i-1]حيث يكون الاختزال على الشكل التالي:x = y[0] + y[1]… + y[n-1] - يدعم هذا النظام ضرب المصفوفات - إما عن طريق تحميل البيانات من الذاكرة خوارزميًا، أو إعادة ترتيب (إعادة تعيين) الوصول الخطي المعتاد إلى عناصر المتجهات، أو توفير "مُجمِّعات" - مما يسمح بمعالجة المصفوفات ذات الأحجام المختلفة بكفاءة. يوفر معالج IBM POWER10 تعليمات MMA [ 35 ] ، ولكن بالنسبة لعرض المصفوفات الذي لا يتوافق تمامًا مع حجم SIMD، يلزم استخدام تقنيات تكرار البيانات، وهو ما يُهدر موارد ملفات التسجيل. [ 36 ] [ 37 ] توفر NVIDIA واجهة برمجة تطبيقات CUDA عالية المستوى للمصفوفات، على الرغم من أن التفاصيل الداخلية غير متاحة. [ 38 ] تُعد إعادة ترتيب الوصول إلى بيانات المتجهات الخطية في مكانها التقنية الأكثر كفاءة في استخدام الموارد.
- تتضمن صيغ الرياضيات المتقدمة غالبًا حسابات حقل غالوا ، ولكنها قد تشمل أيضًا الأعداد العشرية المشفرة ثنائيًا أو الأعداد العشرية ذات النقطة الثابتة، ودعمًا لعمليات حسابية أكبر بكثير (بدقة اختيارية) من خلال دعم عمليات الحمل المتوازية للإدخال والإخراج.
- معالجة البتات - بما في ذلك الإصدارات المتجهة من عمليات التبديل على مستوى البت، وإدراج واستخراج حقول البت، وعمليات الطرد المركزي، وحساب عدد السكان، وغيرها الكثير .
ميزات معالجة المتجهات لوحدة معالجة الرسومات
نظراً لأن العديد من تطبيقات التظليل ثلاثية الأبعاد تحتاج إلى عمليات حساب المثلثات بالإضافة إلى متجهات قصيرة للعمليات الشائعة (RGB، ARGB، XYZ، XYZW)، فإن دعم ما يلي موجود عادةً في وحدات معالجة الرسومات الحديثة، بالإضافة إلى تلك الموجودة في معالجات المتجهات:
- المتجهات الفرعية - قد تحتوي العناصر عادةً على عنصرين أو ثلاثة أو أربعة عناصر فرعية (vec2، vec3، vec4)، حيث ينطبق أي بت مُعطى من قناع المسند على المتجه vec2/3/4 بأكمله، وليس على العناصر الموجودة في المتجه الفرعي. وقد تم تقديم المتجهات الفرعية أيضًا في RISC-V RVV (المُسمى "LMUL"). [ 39 ] تُعد المتجهات الفرعية جزءًا أساسيًا لا يتجزأ من مواصفات Vulkan SPIR-V .
- تبديل المتجهات الفرعية - المعروف أيضًا باسم "خلط المسارات" - يسمح بإجراء عمليات حسابية بين عناصر المتجهات الفرعية دون الحاجة إلى تعليمات إضافية (مكلفة ومُهدرة) لنقل العناصر الفرعية إلى "مسارات" SIMD الصحيحة، كما يوفر بتات قناع التنبؤ. وهو في الواقع تبديل مصغر للمتجه الفرعي أثناء التنفيذ، ويُستخدم بكثرة في ملفات التظليل ثلاثية الأبعاد (يصل إلى 20% من جميع التعليمات [ 40 ] )، ويُعد بالغ الأهمية لدرجة أنه جزء من مواصفات Vulkan SPIR-V. يستخدم معالج Broadcom Videocore IV مصطلح "تدوير المسارات" [ 41 ] ، بينما يستخدم باقي قطاع الصناعة مصطلح "التبديل" [ 42 ] .
- تُستخدم الدوال المتسامية - كالعمليات المثلثية مثل الجيب وجيب التمام واللوغاريتم - بشكلٍ أكبر في التطبيقات ثلاثية الأبعاد مقارنةً بالعديد من تطبيقات الحوسبة عالية الأداء . لكن المثير للاهتمام هو أن السرعة أهم بكثير من الدقة في التطبيقات ثلاثية الأبعاد بالنسبة لوحدات معالجة الرسومات، حيث لا تتطلب حسابات إحداثيات البكسل دقة عالية. تُقرّ مواصفات Vulkan بهذا الأمر وتضع متطلبات دقة منخفضة بشكلٍ ملحوظ، مما يسمح لوحدات معالجة الرسومات بتقليل استهلاك الطاقة. ويتم استكشاف مفهوم تقليل الدقة حيث لا حاجة لها في امتداد MIPS-3D .
الخطأ (أو الفشل) أولاً
يُعدّ RVV مفهومًا لتحميل المتجهات التسلسلي التخميني، وقد طُرح في معالجات ARM SVE2 وRISC-V. يحتوي معالج ARM SVE2 على سجل خاص يُسمى "سجل الخطأ الأول" [ 43 ] ، حيث يقوم RVV بتعديل (اقتطاع) طول المتجه (VL) [ 44 ] .
يقوم مبدأ ffirst الأساسي على محاولة تحميل متجه تسلسلي كبير، مع السماح للمعالج بتقليص حجم البيانات المحملة فعليًا إلى الحد الذي يضمن نجاح التحميل دون حدوث خطأ في الذاكرة، أو إلى حجم أكبر من الصفر يُعدّ الأنسب. والأهم هو أن التعليمات اللاحقة تُبلّغ، أو قد تُحدّد بدقة، عدد عمليات التحميل الناجحة، مستخدمةً هذا العدد لتنفيذ العمليات على البيانات التي تم تحميلها فعليًا فقط.
قارن هذا الوضع مع SIMD، وهو عبارة عن عرض تحميل ثابت (غير مرن) وعرض معالجة بيانات ثابت، غير قادر على التعامل مع الأحمال التي تتجاوز حدود الصفحة، وحتى لو كان كذلك، فإنه غير قادر على التكيف مع ما نجح بالفعل، ومع ذلك، ومن المفارقات، إذا حاول برنامج SIMD حتى معرفة مسبقًا (في كل حلقة داخلية، في كل مرة) ما الذي قد ينجح على النحو الأمثل، فإن هذه التعليمات لا تؤدي إلا إلى إعاقة الأداء لأنها ستكون، بالضرورة، جزءًا من الحلقة الداخلية الحرجة.
يشير هذا إلى سبب ابتكار خوارزمية ffirst ، ويتضح ذلك جليًا في خوارزميتي memcpy وstrcpy عند تنفيذهما باستخدام شريحة SIMD القياسية غير المعتمدة على ffirst ذات 128 بت . بالنسبة لمعالج IBM POWER9، يتجاوز عدد التعليمات المُحسّنة يدويًا لتنفيذ strncpy 240 تعليمة. [ 45 ] في المقابل، لا يتجاوز عدد تعليمات strncpy نفسها في مُجمّع RVV المُحسّن يدويًا 22 تعليمة. [ 46 ]
قد يفشل مثال SIMD المذكور أعلاه عند نهاية الذاكرة نتيجة محاولات قراءة عدد كبير جدًا من القيم، وقد يتسبب أيضًا في عدد كبير من أخطاء الصفحات أو أخطاء عدم المحاذاة عند تجاوز الحدود. في المقابل، بمنح بنية المتجهات حرية تحديد عدد العناصر المراد تحميلها، قد يُعيد الجزء الأول من دالة strncpy، إذا بدأ عند حد ذاكرة غير مثالي، عددًا كافيًا من عمليات التحميل بحيث تتم محاذاة دفعات قراءات الذاكرة المتجهة بشكل مثالي مع ذاكرات التخزين المؤقت وترتيبات الذاكرة الافتراضية في التكرارات اللاحقة للحلقة. إضافةً إلى ذلك، قد يختار الجهاز إنهاء قراءات الذاكرة لأي تكرار معين للحلقة عند حد الصفحة بالضبط (متجنبًا عملية بحث ثانية مكلفة في TLB)، مع تنفيذ تخميني يُهيئ صفحة الذاكرة الافتراضية التالية بينما لا تزال البيانات قيد المعالجة في الحلقة الحالية. كل هذا يُحدده الجهاز، وليس البرنامج نفسه. [ 47 ]
الأداء والسرعة
لنفترض أن r هي نسبة سرعة المتجهات و f هي نسبة التحويل إلى متجهات. إذا كان الوقت الذي تستغرقه وحدة المتجهات لجمع مصفوفة من 64 رقمًا أسرع بعشر مرات من نظيرتها العددية المكافئة، فإن r = 10. كذلك، إذا كان إجمالي عدد العمليات في برنامج ما 100 عملية، منها 10 عمليات عددية فقط (بعد التحويل إلى متجهات)، فإن f = 0.9، أي أن 90% من العمل تُنجزه وحدة المتجهات. ويترتب على ذلك زيادة السرعة الممكنة التالية:
لذا، حتى لو كان أداء وحدة المتجهات عالياً جداً () هناك تسارع أقل منوهذا يشير إلى أن النسبة f حاسمة للأداء. وتعتمد هذه النسبة على كفاءة عملية الترجمة، مثل تجاور العناصر في الذاكرة.
انظر أيضاً
- التحويل التلقائي إلى متجه
- معالج البراميل
- المعالجة المتسلسلة (معالجة المتجهات)
- مصفوفة قابلة لإعادة التشكيل ذات حبيبات خشنة
- حساب النواة
- حاسوب للعمليات ذات الوظائف
- تصنيف دنكان للمعالجات المتجهة ذات البنية الأنبوبية
- GPGPU
- تاريخ الحوسبة الفائقة
- RISC-V ، وهو معيار ISA مفتوح مع امتداد متجه متغير العرض مرتبط به .
- معالجة البيانات المتدفقة
- بنية الحواسيب العملاقة
- بنية SX
- وحدة معالجة الموترات
مراجع
- ↑ "asm-lessons/lesson_01/index.md at main · FFmpeg/asm-lessons" . GitHub . تم الاسترجاع في 25-04-2025 .
- ↑ باركنسون، دينيس (17 يونيو 1976). "أجهزة كمبيوتر بالآلاف" . مجلة نيو ساينتست . الصفحات 626-627 . تاريخ الاسترجاع: 7 يوليو 2024 .
- ↑ بي إن مالينوفسكي (1995). تاريخ تكنولوجيا الحاسوب من خلال وجوههم (باللغة الروسية) . KIT. ISBN 5770761318.
- ↑ مجموعة أبحاث MIAOW العمودية
- ↑ وحدة معالجة الرسومات MIAOW
- ١ ٢ "أنديس تعلن عن معالج RISC-V متعدد النوى ذو 1024 بت: AX45MPV" (بيان صحفي). جلوب نيوزواير. ٧ ديسمبر ٢٠٢٢. تم الاطلاع عليه بتاريخ ٢٣ ديسمبر ٢٠٢٢ .
- ↑ مياوكا، ي.؛ تشوي، ج.؛ توغاوا، ن.؛ ياناغيساوا، م.؛ أوتسوكي، ت. (2002). خوارزمية لتوليد وحدات الأجهزة لتوليف نواة المعالج باستخدام تعليمات SIMD المعبأة . مؤتمر آسيا والمحيط الهادئ للدوائر والأنظمة. المجلد 1. الصفحات 171-176 . doi : 10.1109/APCCAS.2002.1114930 . hdl : 2065/10689 .
- ↑
- دليل تعليمات عائلة FR400 (ملف PDF) . فوجيتسو. 2004-01-01.
- ↑ ديفيد باترسون ؛ أندرو ووترمان (18 سبتمبر 2017). "تعليمات SIMD تُعتبر ضارة" . هندسة الحاسوب اليوم .
على عكس SIMD، يحتوي على مسجل طول متجه vl، مما يجعل تعليمات المتجه تعمل عند أي قيمة لـ n.
- ↑ دليل مرجعي لأجهزة سلسلة Cray-1 S (ملف PDF) . أبحاث Cray. نوفمبر 1981. ص 6 - 12.
- ^ "Riscv-v-spec/V-spec.adoc في الماجستير · riscv/Riscv-v-spec" . جيثب . 16 يونيو 2023.
- ↑ "دليل مرجعي للغة تجميع محرك المتجهات" (ملف PDF) . 16 يونيو 2023.
- ↑ عمليات المتجهات لنظام IBM System/370 (ملف PDF) (الطبعة الثالثة ). شركة IBM. أغسطس 1986. SA22-7125-2 . تم الاطلاع عليه في 20 سبتمبر 2018 .
- ↑ دليل مرجعي لأجهزة نظام الكمبيوتر CDC Cyber 200 طراز 205 (ملف PDF) . شركة Control Data. 11 نوفمبر 1983.
- ↑ "إصدار امتداد متجه الإصدار 1.0، مُجمّد للمراجعة العامة · riscvarchive/Riscv-v-spec" . GitHub .
- ↑ "الوثائق - مطور Arm" .
- ↑ "المعرفة والمراجع" . تايلور وفرانسيس . 2015-05-03 . تم الاطلاع عليه بتاريخ 2026-02-19 .
- ↑ باترسون، ديفيد أ .؛ هينيسي، جون ل. (1998). تنظيم وتصميم الحاسوب: واجهة الأجهزة/البرمجيات، صفحة 751-752 ( الطبعة الثانية). مورغان كوفمان. ص 751-752 . ISBN 155860491X.
- ^ "Riscv-v-spec/V-spec.adoc في الماجستير · riscv/Riscv-v-spec" . جيثب . 19 نوفمبر 2022.
- ↑ دليل مبرمج Videocore IV
- ↑ تحليل وحدة معالجة الكميات (QPU) في برنامج Videocore IV بواسطة جيف بوش
- ↑ "البرمجة لـ Neon - الجزء 3 ضرب المصفوفات" . 11 سبتمبر 2013.
- ↑ يُعتبر SIMD ضارًا
- ↑ برنامج تعليمي لـ ARM SVE2
- ↑ عمليات المتجهات لنظام IBM System/370 (ملف PDF) (الطبعة الثالثة ). شركة IBM. أغسطس 1986. SA22-7125-2 . تم الاطلاع عليه في 20 سبتمبر 2018 .
- ↑ "مثال Daxpy" .
- ↑ "تعليمات SIMD تعتبر ضارة" . 18 سبتمبر 2017.
- ↑ "Sse - 1-to-4 broadcast and 4-to-1 reduce in AVX-512" .
- ↑ "التجميع - أسرع طريقة لإجراء مجموع متجه SSE الأفقي (أو أي اختزال آخر)" .
- ^ "Riscv-v-spec/V-spec.adoc في الماجستير · riscv/Riscv-v-spec" . جيثب . 19 نوفمبر 2022.
- ↑ نظرة عامة على كراي
- ↑ RISC-V RVV ISA
- ↑ نظرة عامة على SX-Arora
- ↑ تعليمات جمع وتوزيع سجلات RVV
- ↑ "معالج POWER10 من IBM - ويليام ستارك وبريان دبليو. ثومبتو، IBM" . يوتيوب . 25 سبتمبر 2020. مؤرشف من الأصل في 11 ديسمبر 2021.
- ^ موريرا، خوسيه إي. بارتون، كيت؛ باتل ستيفن. بيرجنر، بيتر؛ برتران، رامون؛ بهات، بونيث؛ كالديرا، بيدرو؛ ادلسون، ديفيد؛ فوسوم، جوردون. فراي، براد. ايفانوفيتش، نيمانيا؛ كيرشنر، تشيب؛ ليم، فنسنت. كابور، شاكتي؛ توليو ماتشادو فيلهو؛ سيلفيا ميليتا مولر؛ أولسون، بريت. ساداسيفام، ساتيش؛ سليل، بابتيست؛ شميدت، بيل. سرينيفاساراغافان، راجالاكشمي؛ سريفاتسان، شريشاران؛ تومتو، بريان. فاغنر، أندرياس. وو، نيلسون (2021). “مرفق رياضيات مصفوفة لمعالجات Power ISA(TM)”. أرخايف : 2104.03142 [ cs.AR ].
- ↑ كريكيليس، أنارجيروس (1996). "معالج معياري متوازي للغاية لمعالجة التصور الحجمي" . الحوسبة عالية الأداء لرسومات الحاسوب والتصور . ص 101-124 . doi : 10.1007/978-1-4471-1011-8_8 . ISBN 978-3-540-76016-0.
- ↑ "دليل برمجة CUDA C++" .
- ↑ LMUL > 1 في RVV
- ↑ "توم فورسيث - دورة حياة مجموعة التعليمات" . 22 أغسطس 2020.
- ↑ براءة اختراع أمريكية مهجورة رقم US20110227920-0096
- ↑ معالج الفيديو Videocore IV QPU
- ↑ مقدمة إلى ARM SVE2
- ↑ أحمال RVV ذات العطل الأول
- ↑ رقعة لمكتبة libc6 لإضافة دالة strncpy المحسّنة لمعالجات POWER9
- ↑ مثال RVV strncpy
- ↑ ورقة بحثية حول ARM SVE2 بقلم ن. ستيفنز
- وحدات المعالجة المركزية
- المعالجات المساعدة
- الحوسبة المتوازية
- الحواسيب العملاقة المتجهة
