سؤال

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

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

المحلول

تحتوي العديد من وحدات المعالجة المركزية على مجموعات تعليمات "ناقلة" أو "SIMD" والتي تطبق نفس العملية في وقت واحد على قطعتين أو أربع قطع أو أكثر من البيانات.تحتوي شرائح x86 الحديثة على تعليمات SSE، والعديد من شرائح PPC تحتوي على تعليمات "Altivec"، وحتى بعض شرائح ARM تحتوي على مجموعة تعليمات متجهة تسمى NEON.

"التوجيه" (المبسط) هو عملية إعادة كتابة حلقة بحيث بدلاً من معالجة عنصر واحد من مصفوفة N مرات، فإنه يعالج (على سبيل المثال) 4 عناصر من المصفوفة في وقت واحد N/4 مرات.

(اخترت 4 لأنه من المرجح أن تدعمه الأجهزة الحديثة بشكل مباشر؛يستخدم المصطلح "vectorization" أيضًا لوصف تحويل برمجي عالي المستوى حيث يمكنك فقط تجريد الحلقة تمامًا ووصف التشغيل على المصفوفات بدلاً من العناصر التي تتكون منها)


الفرق بين التوجيه وفتح الحلقة:خذ بعين الاعتبار الحلقة البسيطة التالية التي تضيف عناصر صفيفين وتخزن النتائج في صفيف ثالث.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

سيؤدي فتح هذه الحلقة إلى تحويلها إلى شيء مثل هذا:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

ومن ناحية أخرى، فإن تحويله إلى اتجاه ينتج شيئًا مثل هذا:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

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

نصائح أخرى

وكمية موجهة هو عبارة عن تحويل برنامج العددية لبرنامج النواقل. ويمكن لبرامج Vectorized تشغيل عمليات متعددة من تعليمة واحدة، في حين العددية يمكن أن تعمل فقط على أزواج من المعاملات في وقت واحد.

ويكيبيديا :

ونهج العددية:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

ونهج Vectorized:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

ويشير إلى القدرة على القيام عملية حسابية واحدة على لائحة - أو "ناقلات" - من الأرقام في خطوة واحدة. ترى في كثير من الأحيان مع فورتران لأن المقترن الحوسبة العلمية، الذي يرتبط مع الخارقة، حيث الحساب vectorized ظهرت للمرة الأولى. في الوقت الحاضر تقريبا جميع وحدات المعالجة المركزية سطح المكتب تقدم شكلا من أشكال الحساب vectorized، من خلال تقنيات مثل SSE إنتل. كما تقدم وحدات معالجة الرسومات شكل من أشكال الحساب vectorized.

التوجيه يتم استخدامه بشكل كبير في الحوسبة العلمية حيث تحتاج أجزاء ضخمة من البيانات إلى المعالجة بكفاءة.

في تطبيق البرمجة الحقيقي، أعلم أنه يُستخدم في NUMPY (لست متأكدًا من تطبيقات أخرى).

Numpy (حزمة للحوسبة العلمية في بايثون)، الاستخدامات ناقلات للمعالجة السريعة للمصفوفة ذات الأبعاد n، والتي تكون بشكل عام أبطأ إذا تم ذلك باستخدام خيارات python المضمنة للتعامل مع المصفوفات.

على الرغم من وجود الكثير من التفسيرات، إليك ما حدث الاتجاه تم تعريفه كما هو الحال في صفحة الوثائق العددية

يصف التوجيه غياب أي حلقات واضحة أو فهرسة وما إلى ذلك في الكود - هذه الأشياء تحدث، بالطبع، فقط "وراء الكواليس" في كود C المحسن والمجمع مسبقًا.الكود المتجه له العديد من المزايا، من بينها:

  1. الكود المتجه أكثر إيجازًا وأسهل في القراءة

  2. عدد أقل من أسطر التعليمات البرمجية يعني عمومًا عددًا أقل من الأخطاء

  3. يشبه الكود إلى حد كبير التدوين الرياضي القياسي (مما يجعل من الأسهل ، عادة ، ترميز الرياضيات بشكل صحيح يبني)

  4. ينتج عن التوجيه المزيد من التعليمات البرمجية "Pythonic".بدون المتجه ، سيتم تناثر الكود الخاص بنا مع عدم كفاءة و من الصعب قراءة الحلقات.

وكمية موجهة، في كلمات بسيطة، يعني تحسين خوارزمية بحيث يمكن الاستفادة تعليمات SIMD في المعالجات.

وAVX، AVX2 وAVX512 هي مجموعات التعليمات (إنتل) التي تؤدي نفس العملية على بيانات متعددة في تعليمة واحدة. على سبيل المثال ل. AVX512 يعني أنك يمكن أن تعمل في 16 قيم الأعداد الصحيحة (4 بايت) في وقت واحد. ما يعنيه ذلك هو أنه إذا كان لديك متجه من 16 الأعداد الصحيحة وكنت ترغب في مضاعفة هذه القيمة في كل الأعداد الصحيحة ومن ثم إضافة 10 إلى ذلك. يمكنك إما القيم الحمل إلى السجل العام [أ، ب، ج] 16 مرات وإجراء نفس العملية أو يمكنك تنفيذ نفس العملية عن طريق تحميل جميع القيم 16 إلى SIMD يسجل [XMM، YMM] وتنفيذ العملية مرة واحدة. وهذا يتيح تسريع حساب بيانات المتجه.

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

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

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

وأو يمكننا تصميم نموذج لحالة في عملية حسابية خلق حالة ناقلات ج،

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

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

وكمية موجهة لا يقل أهمية عن الموازاة. وبالتالي، يجب علينا الاستفادة منها قدر الإمكان. كل الأيام المعالجات الحديثة لديهم تعليمات SIMD لأعباء العمل الثقيلة حساب. يمكننا تحسين نظامنا لاستخدام هذه التعليمات SIMD باستخدام كمية موجهة، وهذا هو مماثل لparrallelizing متاحة لدينا لتشغيل على النوى المتعددة المتاحة على معالجات الحديثة.

وأود أن أترك ذكر قانون الزواج، والتي تتيح يو vectorize الشفرة باستخدام pragmas. I تنظر فيه بوصفه نقطة انطلاق جيدة. نفس الشيء يمكن أن يقال عن OpenACC.

وانظر جواب المذكورتين أعلاه. أنا فقط أريد أن أضيف أن السبب لأنه يريد أن يفعل كمية موجهة هو أن هذه العمليات يمكن بسهولة أن يؤديها في paraell من أجهزة الكمبيوتر العملاقة والمعالجات متعددة، مما أسفر عن كسب الأداء الكبير. على أجهزة الكمبيوتر معالج واحد لن يكون هناك كسب الأداء.

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