πŸ“Œ β€œLoop unrolling ΠΏΡ€ΠΈ нСизвСстном числС итСраций”

Π Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠ° (unrolling) Ρ†ΠΈΠΊΠ»Π° β€” Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° копируСтся нСсколько Ρ€Π°Π· для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹. Если количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ нСизвСстно Π½Π° этапС компиляции, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΡƒ с хвостовой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ.

🧠 Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ИдСя: Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΏΠΎ нСсколько ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π·Π° Ρ€Π°Π·, Π° Π·Π°Ρ‚Π΅ΠΌ β€” остаток, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ дСлится Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: частичная Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠ° ΠΏΠΎ 4

void process(int *a, int n) {
    int i = 0;
    for (; i + 3 < n; i += 4) {
        a[i]   *= 2;
        a[i+1] *= 2;
        a[i+2] *= 2;
        a[i+3] *= 2;
    }
    for (; i < n; i++) {
        a[i] *= 2; // хвост
    }
}
  • Основной Π±Π»ΠΎΠΊ: ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎ 4 элСмСнта

  • Π₯востовой Π±Π»ΠΎΠΊ: ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ остаток n % 4

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, gcc, clang) ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это автоматичСски с Ρ„Π»Π°Π³Π°ΠΌΠΈ -funroll-loops, Π½ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π΄Π°Ρ‘Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… мСстах.

βš™οΈ Π“Π΄Π΅ примСняСтся

ΠžΠ±Π»Π°ΡΡ‚ΡŒΠ¦Π΅Π»ΡŒ
DSP / SIMDΠ‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹
HPCΠ£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ILP (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ инструкций)
EmbeddedΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния
Compiler designГСнСрация эффСктивного ΠΊΠΎΠ΄Π°

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • ΠŸΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° CPU с ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ

  • Π£Π»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Instruction cache

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SIMD (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с AVX, NEON)

❌ НСдостатки

  • Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° (Code bloat)

  • ΠœΠΎΠΆΠ΅Ρ‚ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ ICache-Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

  • Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ настройки unroll-factor

  • НСэффСктивСн ΠΏΡ€ΠΈ ΠΌΠ°Π»ΠΎΠΌ числС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ