Döngü optimizasyonu
- C kursu
- İleri seviye
- Ders 75/83
- 5 dk
Döngü optimizasyonu ve açma (unrolling) öğrenirsin.
Döngü optimizasyonu
Döngü açma (loop unrolling), her yinelemede birden fazla elemanı işleyerek döngü sayısını azaltır. Bu, döngü yükünü (koşul denetimi, artırma) azaltır ve komut düzeyi paralelliğini artırır.
4'lü açma örneği: for (i = 0; i + 3 < n; i += 4) { sum += a[i] + a[i+1] + a[i+2] + a[i+3]; }. Her yinelemede 4 eleman işlenir; döngü sayısı 4'e bölünür. Kalan elemanlar için ikinci bir döngü eklenir. Modern derleyiciler bunu otomatik yapar; ancak ileri seviyede elle yazmak performans kazandırır.
Kalan elemanlar
4'lü açma, dizinin boyutu 4'ün katı değilse bazı elemanları kaçırır. Bu yüzden kalan elemanlar için for (; i < n; i++) sum += a[i]; döngüsü eklenir.
Örnek: 8 elemanlı {1,2,3,4,5,6,7,8} dizisi için 4'lü açma iki yinelemede biter (i=0, i=4), kalan kalmaz; toplam 36. 10 elemanlı olsaydı 8 eleman açmayla, 2 eleman kalan döngüyle işlenirdi. Bu kalıp, hem performans hem doğruluk için gereklidir.
Uygulama 4'lü açmalı toplam
int sum_unrolled(int *a, int n) yaz: int sum = 0; int i;, döngü for (i = 0; i + 3 < n; i += 4) { sum += a[i] + a[i+1] + a[i+2] + a[i+3]; }, kalan for (; i < n; i++) sum += a[i];, return sum;. main'de int a[] = {1,2,3,4,5,6,7,8}; ve printf("toplam: %d\n", sum_unrolled(a, 8));.
Başlangıç kodu
#include <stdio.h>
// sum_unrolled yaz: 4'lü açma + kalan döngü
// main: 8 elemanlı dizi tanımla, sum_unrolled çağır ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
int sum_unrolled(int *a, int n) {
int sum = 0;
int i;
for (i = 0; i + 3 < n; i += 4) {
sum += a[i] + a[i+1] + a[i+2] + a[i+3];
}
for (; i < n; i++) sum += a[i];
return sum;
}
int main(void) {
int a[] = {1,2,3,4,5,6,7,8};
printf("toplam: %d\n", sum_unrolled(a, 8));
return 0;
}Beklenen çıktı
toplam: 36
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 4'lü açma adımı
for (i = 0; i + 3 < n; i += ____) { sum += a[i] + a[i+1] + a[i+2] + a[i+3]; }
for (i = 0; i + 3 < n; i += 4) { sum += a[i] + a[i+1] + a[i+2] + a[i+3]; }
Açıklama: 4'lü açma i += 4 ile döngüyü 4'e böler.
2 Döngü kavramlarını eşle
| Kavram | Anlamı |
|---|---|
unroll |
Çoklu eleman |
i += 4 |
4'lü adım |
kalan döngü |
Artık eleman |
koşul denetimi |
Döngü yükü |
3 Döngü açma neyi azaltır?
- Bellek kullanımını
- Dosya boyutunu
- Döngü yükünü Doğru cevap
- Satır sayısını
Açıklama: Açma döngü yükünü (koşul, artırma) azaltır.