سؤال

أنا أعمل على Vectorization التلقائي مع دول مجلس التعاون الخليجي. أنا لست في وضع يمكنها من استخدام interractics أو السمات بسبب متطلبات العملاء. (لا يمكنني الحصول على إدخال المستخدم لدعم Vectorization)

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

سؤالي هو كيف لدينا لإنفاذ المحاذاة؟ إذا وجدت حلقة قابلة للنقل، فلا يجب أن أقوم بإنشاء نسختين من الحلقة بسبب معلومات المحاذاة المفقودة.

علي سبيل المثال. النظر في رمز أدناه

short a[15]; short b[15]; short c[15];
int i;

void foo()
{
    for (i=0; i<15; i++)
    {
      a[i] = b[i] ;
    }
}

تفريغ شجرة (الخيارات: -fdump-tree-optimized -ftree -ftree-Vectorize)

<SNIP>
     vector short int * vect_pa.49;
     vector short int * vect_pb.42;
     vector short int * vect_pa.35;
     vector short int * vect_pb.30;

    bb 2>:
     vect_pb.30 = (vector short int *) &b;
     vect_pa.35 = (vector short int *) &a;
     if (((signed char) vect_pa.35 | (signed char) vect_pb.30) & 3 == 0)    ;; <== (A)
       goto <bb 3>;
     else
       goto <bb 4>;

    bb 3>:
</SNIP>

في إصدار "BB 3" من التعليمات البرمجية الموجهة. في رمز "BB 4" دون أن يتم إنشاء Vectorization. يتم ذلك عن طريق التحقق من المحاذاة (بيان "A"). الآن بدون استخدام جوهري وسمات أخرى، كيف يمكنني الحصول على التعليمات البرمجية الموجهة فقط (دون فحص محاذاة وقت التشغيل هذا.)

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

المحلول

إذا تم تخصيص البيانات المعنية ثابتة، فيمكنك استخدام __align__ السمة التي يدعمها دول مجلس التعاون الخليجي لتحديد أنه يجب محاذاة الحدود اللازمة. إذا كنت تقوم بتخصيص هذه الصفائف بشكل حيوي، فيمكنك الإفراط في تخصيصها من خلال قيمة المحاذاة، ثم تصادف المؤشر المرتجع حتى المحاذاة التي تحتاج إليها.

يمكنك أيضا استخدام posix_memalign() وظيفة إذا كنت على نظام يدعمه. أخيرا، لاحظ ذلك malloc() سيتم دائما تخصيص الذاكرة محاذاة بحجم أكبر نوع مدمج، عموما 8 بايت بسبب ضعف. إذا كنت لا تحتاج أفضل من ذلك، ثم malloc يجب أن يكفي.

تعديل: . إذا كنت بحاجة إلى محاذاة إلى حدود 8 بايت، كما يبدو، سيكون ذلك شيئا a = (a + 7) & ~3;.

نصائح أخرى

أحصل على نسخة واحدة فقط من الحلقة، باستخدام الرمز الخاص بك بالضبط مع هذه الخيارات: gcc -march=core2 -c -O2 -fdump-tree-optimized -ftree-vectorize vec.c

بلدي نسخة من دول مجلس التعاون الخليجي هو gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8).

دول مجلس التعاون الخليجي تفعل شيئا ذكيا هنا. يجبر المصفوفات a و b أن تكون 16 بايت محاذاة. لا يفعل ذلك ل c, ، من المفترض أن c لا يستخدم أبدا في حلقة قابلة للتجديد.

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