كيف يمكنني إعادة ترتيب بيانات المتجهات باستخدام ARM NEONINCICS؟
-
26-09-2019 - |
سؤال
هذا يرتبط على وجه التحديد بترميز ARM Neon Simd. أنا أستخدم ARM Neon Instrinsics لوحدة معينة في وحدة فك ترميز الفيديو. لدي بيانات متجهة على النحو التالي:
هناك أربعة عناصر 32 بت في سجل النيون - على سبيل المثال ، Q0 - بحجم 128 بت.
3B 3A 1B 1A
هناك أربعة عناصر أخرى ، 32 بت في سجل النيون الآخر يقول Q1 الذي يبلغ حجمه 128 بت.
3D 3C 1D 1C
أريد أن تكون البيانات النهائية بالترتيب كما هو موضح أدناه:
1D 1C 1B 1A
3D 3C 3B 3A
ما الذي يمكن أن يحققه Instrinsics النيون ترتيب البيانات المطلوب؟
المحلول
ماذا عن شيء مثل هذا:
int32x4_t q0, q1;
/* split into 64 bit vectors */
int32x2_t q0_hi = vget_high_s32 (q0);
int32x2_t q1_hi = vget_high_s32 (q1);
int32x2_t q0_lo = vget_low_s32 (q0);
int32x2_t q1_lo = vget_low_s32 (q1);
/* recombine into 128 bit vectors */
q0 = vcombine_s32 (q0_lo, q1_lo);
q1 = vcombine_s32 (q0_hi, q1_hi);
من الناحية النظرية ، يجب أن يتجمع هذا إلى تعليمات تحركين فقط لأن VGET_HIGH و VGET_LOW يعتزمان فقط تفسير سجلات 12 بت Q كـ اثنين من السجلات D 64 بت. يجمع VCombine Otoh فقط إلى واحد أو تحركتين (يعتمد على تخصيص التسجيل).
أوه - وترتيب الأعداد الصحيحة في الإخراج يمكن أن يكون الطريق الخطأ بالضبط. إذا كان الأمر كذلك ، فما عليك سوى تبديل الحجج إلى vCombine_S32.
نصائح أخرى
تذكر أن كل سجل Q يتكون من سجلين D ، على سبيل المثال الجزء المنخفض من Q0 هو D0 والجزء العالي D1. في الواقع ، هذه العملية هي مجرد تبديل D0 و D3 (أو D1 و D2 ، فهي غير واضحة تمامًا من عرض البيانات الخاص بك). هناك حتى تعليمات المبادلة للقيام بذلك في تعليمات واحدة!
إخلاء المسئولية: لا أعرف الجوهارات النيون (أنا رمز مباشرة في التجميع) ، على الرغم من أنني سأفاجأ إذا لم يكن من الممكن القيام بذلك باستخدام الجوهارات.
يبدو أنك يجب أن تكون قادرًا على استخدام VTRN
التعليمات (على سبيل المثال vtrnq_u32
) لهذا.
بيير على حق.
VSWP D0 ، D3
من شأنها أن تفعل.
pierre: قرأت المنشور عن النيون على مدونتك منذ عدة أشهر. لقد فوجئت بسرور بوجود شخص مثلي - كتابة رموز التجميع المحسنة باليد ، كل من ARM و NEON. من الجميل أن أراك.