CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
for (i = 0; i + 3 < n; i += ____) { sum += a[i] + a[i+1] + a[i+2] + a[i+3]; }
Cevap
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.

İleri seviye bölümündeki tüm dersler