Sobes.tech
Senior

Որոնք են ARM (NEON) համար հատուկ օպտիմիզացիաները։

sobes.tech AI

Պատասխան AI-ից

NEON-ը ARM-ի SIMD ընդարձակում է, որը թույլ է տալիս կատարել պառլելային գործողություններ տվյալների վեկտորների վրա, ինչը կարևոր է ML և մուլտիմեդիա առաջադրանքների արագացման համար մոբայլ և edge սարքերում:

NEON-ի հիմնական օպտիմիզացիաները՝

  • Վեկտորիզացիա՝ հաշվարկների փոխարեն օգտագործել վեկտորային գործողություններ՝ միաժամանակ մի քանի տվյալ տարրեր մշակելու համար:
  • Մասնագիտացված հրահանգների օգտագործում՝ օրինակ, FMA (բազմապատկում և գումարում), հրահանգներ ֆիքսված և թռուցիկ կետային աշխատանքների համար:
  • Տվյալների հարթեցում՝ արդյունավետ բեռնման և պահպանում համար կարևոր է տվյալների հարթեցումը 16 կամ 32 բայթ սահմաններում:
  • Ավելի քիչ ճյուղավորում՝ NEON-ը լավ է աշխատում կանխատեսելի հոսքերի հետ, ուստի պետք է խուսափել ճյուղավորումներից վեկտորային ցիկլերում:
  • Բեռնման և հաշվարկների պառլելիզացիա՝ օգտագործելով բեռնման/արտահանում հրահանգներ պիպլայնով:

C-ում NEON ինտրինսիկների օգտագործմամբ երկու float զանգվածների բազմապատկման օրինակ՝

#include <arm_neon.h>

void multiply_arrays(const float* a, const float* b, float* result, int length) {
    int i;
    for (i = 0; i < length; i += 4) {
        float32x4_t va = vld1q_f32(&a[i]);
        float32x4_t vb = vld1q_f32(&b[i]);
        float32x4_t vr = vmulq_f32(va, vb);
        vst1q_f32(&result[i], vr);
    }
}

Այս մոտեցումը զգալիորեն արագացնում է հաշվարկները համեմատած սովորական ցիկլի հետ: