Bosh sahifa Wiki Loop Vectorization

Loop Vectorization

Loop Vectorization — sikldagi bir nechta scalar iteratsiyani SIMD vektor instructionlari yordamida bir vaqtda bajaradigan optimallashtirish. Bir instruction bir nechta elementga amal qilgani uchun throughput oshishi mumkin.

SIMD bajarilishi

a[i] = b[i] + c[i] sikli width 4 bo‘lgan vektorda to‘rtta b va c elementini yuklab, vector add va store bajaradi. N vektor widthga bo‘linmasa scalar epilogue, masked instruction yoki predication qolgan elementlarni qayta ishlaydi.

Qonuniylik va xarajat

Vectorizer loop-carried true dependence yo‘qligini isbotlashi kerak. Pointerlar alias qilishi mumkin bo‘lsa runtime overlap check ikki versiya yaratadi. Alignment, stride, data type va target ISA instructionlari profitabilityga ta’sir qiladi. Gather/scatter non-contiguous accessni qo‘llasa ham, contiguous load’dan qimmatroq bo‘lishi mumkin.

Reductionlar

Reduction, masalan sum, dependencega ega ko‘rinsa-da, parallel partial accumulatorlar bilan vectorize qilinishi mumkin. Floating-point qo‘shish associativ emas; qayta guruhlash bit-level natijani o‘zgartiradi. Strict IEEE rejimida bu taqiqlanishi, fast-math rejimida esa ruxsat etilishi mumkin.

Compiler qarori

Compiler vector IR, cost model va legality analysis orqali width tanlaydi. Predication branchli body’ni mask bilan bajarishi mumkin, ammo ikki yo‘lning qimmat amallari mask ostida ham xarajat qilishi ehtimol. Optimization remark vectorization muvaffaqiyatsizligining dependence, cost yoki unsupported operation sababini beradi.

Sinov va o‘lchov

Tekshiruv turli N, alignment, overlapping slice, NaN/Infinity va tail elementlarda o‘tkaziladi. Scalar reference bilan natija solishtiriladi; floating-point policyga mos tolerance yoki bitwise talab belgilanadi. Hardware counter SIMD instruction va memory bandwidth o‘zgarishini tasdiqlaydi.

Loop Vectorization bo‘yicha tahlil natijasi faqat yakuniy xulosa bilan emas, uni hosil qilgan IR versiyasi, target xususiyatlari va qo‘llangan taxminlar bilan birga saqlanadi. Compiler passlari ketma-ket o‘zgarganda oldingi natija avtomatik ravishda haqiqiy deb olinmaydi: tegishli dependencylar invalidatsiya qilinib, zarur qism qayta hisoblanadi. Debug rejimida asosiy invariant buzilgan nuqta va undan oldingi transformatsiya qayd etiladi; release rejimida esa tekshiruvlarning arzon qismi qoldiriladi. Shu yondashuv nazariy jihatdan qonuniy qoida implementatsiya xatosi yoki noto‘g‘ri cost model sabab zararli qarorga aylangan holatni ajratishga yordam beradi.

Kengaytirilgan jihatlar

Vectorization dependence proofdan tashqari cost proof ham talab qiladi. Short trip count uchun runtime check, vector prologue va tail xarajati scalar loopdan qimmat bo‘lishi mumkin; versioning threshold shu holatni cheklaydi. Scalable vector arxitekturalarda width compile vaqtida noma’lum bo‘lib, vector-length agnostic loop whilelt kabi predicate bilan yuradi. Interleaved access deinterleave instructionlar orqali vectorize qilinishi mumkin. Function call faqat vector variant yoki compiler intrinsic mavjud bo‘lsa lane’lar bo‘yicha samarali bajariladi; aks holda scalarization foydani yo‘qotadi. Vectorizer remark har rad etilgan amal uchun aniq sabab qaytarishi kerak.

Vector loopda alignment assumption runtime guard tomonidan dominate qilishi shart. Guard va scalar fallback ikkalasi ham test coverage oladi, aks holda productionda kam uchraydigan overlap yo‘li buzilishi mumkin. Performance regressiya tahlilida vector width, unroll factor, tail usuli va runtime-check costi alohida qayd etiladi.

Missed-optimization reportdagi source location va dependence jufti dasturchiga eng qimmat to‘siqni topishga yordam beradi. Faqat “not vectorized” degan umumiy xabar yetarli emas.

Bog‘liq tushunchalar

SIMD, data dependence, alignment, reduction, auto-vectorization, masked instruction