π β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
-
ΠΠ΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΏΡΠΈ ΠΌΠ°Π»ΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ