استدعاء وظيفة أقل في البرنامج النصي من دالة أعلى في البرنامج النصي

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

سؤال

أحاول التوصل إلى طريقة لجعل الكمبيوتر يقوم ببعض العمل من أجلي. أنا أستخدم SIMD (SSE2 & SSE3) لحساب المنتج المتقاطع ، وكنت أتساءل عما إذا كان يمكن أن يذهب بشكل أسرع. حاليا لدي ما يلي:

const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y

__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
   // (y * other.z) - (z * other.y)
   // (z * other.x) - (x * other.z)
   // (x * other.y) - (y * other.x)

   return
   (
      _mm_sub_ps
      (
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
         ),
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
         )
      )
   );
}

كما ترون ، هناك أربعة _mm_shuffle_psهناك ، وتساءلت عما إذا كان بإمكاني استبدالها بمزيج من _mm_unpackhi_ps و _mm_unpacklo_ps التي تعود a2 a3 b2 b3 و a0 a1 b0 b1 على التوالي وهي أسرع قليلا.

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

لقد عملت مع Multiply ، فإنه يعيد هذا عندما أريد أن يعود (3 ، 12 ، 27 ، 0):

startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)

جميل جدا ، إذا قلت ذلك بنفسي.

ومع ذلك ، عندما أردت تنفيذ الفجوة ، تعثرت في مشكلة. Multiply لا يجب أن يتصل فقط بالاتصال ، بل يجب عليه أيضًا استدعاء الفجوة. حسنًا ، لذلك نضع الفجوة أعلاه مضاعفة. لكن Divide ليس فقط للاتصال بالفجوة ، بل يجب أن يتصل أيضًا بالاتصال ، وهو أقل في البرنامج النصي ، لذلك غير موجود بعد.

لقد بدأت بتطبيق وحدة تحكم فارغة في Visual C ++ ووضع كل شيء في quadtests.cpp.

كيف أتأكد من أن هاتين الوظيفتين يمكن أن تتصل ببعضهما البعض؟

شكرا لك مقدما.

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

المحلول

فقط للتأكيد ، مشكلتك هي أن الوظائف مرتبة مثل هذه لا تعمل ، لأن doStuff لم يتم إعلانه بحلول الوقت الذي تسميه منه getFoo:

int getFoo(int bar) {
    doStuff(bar + 1);
}

int doStuff(bar) {
    if (bar == 2) {
        return getFoo(bar);
    }

    return bar * 8;
}

لإصلاح هذا ، تحتاج إلى عمل ملف إعلان إلى الأمام من int doStuff(int). في كثير من الأحيان ، يتم ذلك مع ملف رأس - في كلتا الحالتين ، تحتاج فقط إلى إضافة شيء مثل هذا:

// #includes, etc. go here

int doStuff(int);
int getFoo(int);

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