احصل على دول مجلس التعاون الخليجي للحفاظ على سجل SSE خلال وظيفة تستخدم ASM مضمنة

StackOverflow https://stackoverflow.com/questions/1250083

سؤال

أنا أكتب برنامجا في C الذي يحتاج إلى القيام ببعض حسابات الرياضيات السريعة. أنا أستخدم إرشادات تجميع SSE المضمنة للحصول على بعض الإجراءات SIMD (باستخدام أرقام النقطة العائمة المزدوجة المزدوجة). أنا أروي باستخدام دول مجلس التعاون الخليجي على لينكس.

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

للتوضيح مع بعض الكود:

struct vect2 {
    fltpt x;
    fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;


void function()
{
    /* get a specific value set up in xmm1, and keep it there for the 
     * rest of the loop. */
    for( int i = 0, i<N; i++ ){
        asm(
            "Some calculations;"
            "on an element of;"
            "a data set.;"
            "The value in xmm1;"
            "is needed;"
        );
    }
}

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

register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */

register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */

لا أحب أن أفترض أن دول مجلس التعاون الخليجي لن يغير سجل XMM1، فهو أكبر من الشياطين تحلق من أنف واحد "نوع شيء :-). لذلك أنا آمل أن تكون هناك طريقة مناسبة للقيام بذلك.

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

المحلول

أعتقد أن الحل هنا هو جعل دول مجلس التعاون الخليجي تدرك ذلك vec2_t النوع هو في الواقع متجه؛ ثم يمكنك فقط حساب قيمة الحلقة الثابتة وعلاجها كمتغير عادي (باستثناء المحول البرمجي يعرف أنه نوع متجه):

typedef double vec2_t __attribute__ ((vector_size (16)));

void function()
{
  /* get a specific value set up, e.g. */
  vec2_t invariant;
  asm( "some calculations, soring result in invariant."
       : "=x" (invariant) );

  for( int i = 0; i<N; i++ ){
    asm(
            "Some calculations;"
            "on an element of;"
            "a data set.;"
            "The value in xmm1;"
            "is needed;"
            : "x" (invariant) // and other SSE arguments
       );
   }
}

أنا فقط جمعت هذا الأمر بحساب بسيط داخل الحلقة، ومع مستوى تحسين على الأقل 1 قيمة invariant يتم الاحتفاظ بها في سجل XMM أثناء الحلقة.

(هذا يفترض أنك لا يحتاج حلقة الخاص بك ثابتة في سجل XMM صريح؛ ويمكنك استخدام تخصيص تسجيل GCC العادي).

نصائح أخرى

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

حظا سعيدا

ربما تكون هذه المواقع مثيرة للاهتمام للنظر في.

وظائف GCC X86 المدمجة

العمل مع SIMD مع دول مجلس التعاون الخليجي

أنا معتاد على العمل مع التجمع و C وماذا أفعله هنا هو أنني سأكتب الوظيفة بأكملها في التجميع. إذا كان لديك نظام صنع مرن، أوصي بتجميع وظيفة ASM بشكل منفصل وربطها في طلبك. المشكلة الوحيدة في هذا هي أن الوظيفة لا يمكن إبزيمها بواسطة المحول البرمجي.

وظيفة الفراغ (باطلة)؛ // ج

وظيفة خارجية "C" (باطلة)؛ // c ++.

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