Men Android-da bir nechta real vaqtda DSP algoritmlarini yozish ustida ishlayapman, shuning uchun hamma narsani iloji boricha optimallashtirish va matematikani maksimal darajada engillashtirish uchun ARM-ni to'g'ridan-to'g'ri Assambleyada dasturlashga qaror qildim. Avvaliga men hech qanday ma'noga ega bo'lmagan tezlik ko'rsatkichlarini oldim, shuning uchun men quvur liniyasining xavf-xatarlari, ikki tomonlama muammolar imkoniyatlari va boshqalar haqida o'qishni boshladim. Olayotgan raqamlarim meni haligacha hayratda qoldirdi, shuning uchun kimdir men olgan narsamni nima uchun olishimga oydinlik kiritishi mumkin degan umidda ularni shu yerda joylashtiryapman. Xususan, NEON har bir operatsiyani aynan bitta siklda bajarishga daʼvo qilsa ham, har xil maʼlumotlar turlari boʻyicha hisob-kitoblarni bajarish uchun nima uchun har xil vaqt talab qilishi meni qiziqtiradi. Mening topilmalarim quyidagicha.
Men taqqoslash uchun juda oddiy halqadan foydalanmoqdaman va uni 2 000 000 iteratsiya uchun ishlataman. Mana mening funksiyam:
hzrd_test:
@use received argument an number of iterations in a loop
mov r3 , r0
@come up with some simple values
mov r0, #1
mov r1, #2
@Initialize some NEON registers (Q0-Q11)
vmov.32 d0, r0, r1
vmov.32 d1, r0, r1
vmov.32 d2, r0, r1
...
vmov.32 d21, r0, r1
vmov.32 d22, r0, r1
vmov.32 d23, r0, r1
hzrd_loop:
@do some math
vadd.s32 q0, q0, q1
vadd.s32 q1, q0, q1
vadd.s32 q2, q0, q1
vadd.s32 q3, q0, q1
vadd.s32 q4, q0, q1
vadd.s32 q5, q0, q1
vadd.s32 q6, q0, q1
vadd.s32 q7, q0, q1
vadd.s32 q8, q0, q1
vadd.s32 q9, q0,s q1
vadd.s32 q10, q0, q1
vadd.s32 q11, q0, q1
@decrement loop counter, branch to loop again or return
subs r3, r3, #1
bne hzrd_loop
@return
mov r0, r3
mov pc, lr
Vektor qo'shish (vadd
) va imzolangan 32-bit int (s32
) sifatida ko'rsatilgan hisoblash operatsiyasi va ma'lumotlar turiga e'tibor bering. Ushbu operatsiya ma'lum vaqt ichida yakunlanadi (quyidagi natijalar jadvaliga qarang). ushbu ARM Cortex-A8 hujjati va keyingi sahifalarga ko'ra, deyarli barchasi NEON-da elementar arifmetik operatsiya bir tsiklda bajarilishi kerak, ammo men buni olaman:
vmul.f32 ~62ms vmul.u32 ~125ms vmul.s32 ~125ms vadd.f32 ~63ms vadd.u32 ~29ms vadd.s32 ~30ms
Men ularni yuqoridagi tsikldagi hamma narsaning operatsiyalari va ma'lumotlar turlarini almashtirish orqali qilaman. vadd.u32
vadd.f32
dan ikki baravar tezroq va vmul.f32
vmul.u32
dan ikki barobar tezroq bo'lishiga sabab bormi?
Salom! =)