سؤال

هل هي فكرة جيدة لنطق الكود؟ ما هي الممارسات الجيدة من حيث متى تفعل ذلك؟ ماذا يحدث تحتها؟

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

المحلول

يعني Vecentation أن المترجم يكتشف أنه يمكن تنفيذ تعليماتك المستقلة كواحد سيمد تعليمات. مثال معتاد هو أنه إذا فعلت شيئا مثل

for(i=0; i<N; i++){
  a[i] = a[i] + b[i];
}

سيتم مقاهيه باسم (باستخدام تدوين ناقلات)

for (i=0; i<(N-N%VF); i+=VF){
  a[i:i+VF] = a[i:i+VF] + b[i:i+VF];
}

بشكل أساسي، يختار المحول البرمجي عملية واحدة يمكن القيام بها على عناصر VF من الصفيف في نفس الوقت، وهل هذه الأوقات n / vf بدلا من القيام بعملية واحدة N مرات.

إنه يزيد من الأداء، لكنه يضع المزيد من المتطلبات على الهندسة المعمارية.

نصائح أخرى

كما ذكر أعلاه، يتم استخدام Vectorization للاستفادة من تعليمات SIMD، والتي يمكن أن تؤدي عمليات متطابقة من بيانات مختلفة معبأة في سجلات كبيرة.

هناك مبادئ توجيهية عامة لتمكين المحول البرمجي إلى الحلقة التمهيدية هي التأكد من عدم وجود عناصر بيانات B / W التدفق والمضادلة في تكرارات مختلفة من حلقة.

http://en.wikipedia.org/wiki/data_dependency.

بعض المترجمين مثل التحويل البرمجيات Intel C ++ / Fortran قادرون على كود AutoVectorization. في حالة عدم إمكانية عدم قدرة حلقة من حلقة، يكون مترجم Intel قادرا على الإبلاغ عن سبب عدم إجراء ذلك. هناك تقارير يمكن استخدامها لتعديل الكود بحيث يصبح من جديد (على افتراض أنه ممكن)

تغطي التبعيات بعمق في كتاب "تحسين المحامرة للهندسة المعمارية الحديثة: نهج يستند إلى الاعتماد"

إنه توليد رمز SSE.

لديك حلقة مع رمز مصفوفة تعويم في ذلك Matrix1 [i] [j] + matrix2 [i] [j] وإنشاء رمز SSE.

لا تحتاج إلى عرض على السجل الوحيد الذي يمكن أن يحمل بيانات كبيرة. مثل استخدام سجل 128 'بت لعقد بيانات بت' 4 × 32 '. ذلك يعتمد على القيود المعمارية. بعض العمارة لديها وحدات تنفيذ مختلفة لها سجلات خاصة بهم. في هذه الحالة، يمكن إطعام جزء من البيانات لوحدة التنفيذ هذه والنتيجة يمكن أن تؤخذ من التسجيل المقابلة لوحدة التنفيذ هذه.

على سبيل المثال، النظر في الحالة أدناه.

ل (i = 0؛ أنا <n؛ i ++)
{
a [i] = a [i] + b [i]؛
}



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

ل (i = 0؛ أنا <(n / 2)؛ i + = 2)
{
a [i] = a [i] + b [i]؛


a [i + 1] = a [i + 1] + b [i + 1]؛
}

ملاحظة: يتم اشتقاق 2 داخل العبارة من حجم ناقل.

كما أواجه وحدتي الإعدام، سيتم تغذية البيانات داخل الحلقة في وحدات الإعدام. سيتم تجميع المبلغ في وحدات التنفيذ بشكل منفصل. وأخيرا سيتم تنفيذ مجموع القيم المتراكمة (من وحدتي التنفيذ).

الممارسات الجيدة هي
1. يحتاج القيود مثل التبعية (بين التكرارات المختلفة للحلقة) إلى التحقق قبل الحلقة الموجهة.
2. يجب منع مكالمات الدالة.
3. يمكن للوصول المؤشر إنشاء التعرجات ويجب منعه.

ربما إلقاء نظرة على LIBSIMDX86 (شفرة المصدر).

مثال جميل موضح جيدا هو:

اختيار تجنب الفروع: مثال Altivec صغير

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