CodeBlanks Logo Icon CodeBlanks

Cache etkisi

  • C kursu
  • İleri seviye
  • Ders 74/83
  • 5 dk

CPU cache etkisini ve veri yerelliğini öğrenirsin.

Cache etkisi

CPU cache'i belleğe göre çok hızlıdır; aynı satırdaki veriler cache'te tutulur. Veri yerelliği (data locality), art arda erişilen verilerin aynı cache satırında olmasını sağlar; bu da performansı artırır.

İki boyutlu bir dizide satır major erişim (önce satır sonra sütun) cache'ten yararlanır; sütun major erişim her seferinde yeni cache satırı yükler ve yavaşlar. Bu derste her iki yöntemi de yazıp aynı sonucu (136) basıyoruz; fark yalnızca hızdır.

Satır ve sütun toplamı

4x4 bir tamsayı dizisi tanımlarız: {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}. Toplam 1+2+...+16 = 136'dır.

Satır major: for (i) for (j) sum += a[i][j]; — her a[i][j] ardışık bellekte. Sütun major: for (j) for (i) sum += a[i][j]; — her adımda yeni cache satırı. Bu derste her ikisi de 136 sonucunu verir; gerçek fark milyonlarca elemanla belirginleşir. İşlev imzaları: int sum_row_major(int a[N][N]) ve int sum_col_major(int a[N][N]).

Uygulama Satır ve sütun toplamı

#define N 4 tanımla. int sum_row_major(int a[N][N]) yaz: dış i iç j döngüsüyle sum += a[i][j]. int sum_col_major(int a[N][N]) yaz: dış j iç i döngüsüyle sum += a[i][j]. main'de {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}} ile dizi tanımla; iki işlevi çağır ve printf("satır: %d\n", ...), printf("sütun: %d\n", ...).

Başlangıç kodu

main.c
#include <stdio.h>

#define N 4

// sum_row_major yaz: dış i iç j, a[i][j] topla
// sum_col_major yaz: dış j iç i, a[i][j] topla
// main: 4x4 dizi tanımla, iki işlevi çağır ve sonuçları yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

#define N 4

int sum_row_major(int a[N][N]) {
    int sum = 0;
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            sum += a[i][j];
    return sum;
}

int sum_col_major(int a[N][N]) {
    int sum = 0;
    for (int j = 0; j < N; j++)
        for (int i = 0; i < N; i++)
            sum += a[i][j];
    return sum;
}

int main(void) {
    int a[N][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    printf("satır: %d\n", sum_row_major(a));
    printf("sütun: %d\n", sum_col_major(a));
    return 0;
}

Beklenen çıktı

satır: 136
sütun: 136

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Cache kavramlarını eşle

Kavram Anlamı
cache satırı Ardışık veri
satır major Cache dostu
sütun major Cache düşmanı
yerellik Yakın erişim

2 Hangi erişim biçimi cache dostudur?

  • Sütun major
  • Satır major Doğru cevap
  • Rastgele erişim
  • Ters sıra

Açıklama: Satır major ardışık erişir; cache'i iyi kullanır.

3 Satır major erişim

Soru
for (int j = 0; j < N; j++) sum += a[____][j];
Cevap
for (int j = 0; j < N; j++) sum += a[i][j];

Açıklama: a[i][j] satır major erişimdir; cache dostudur.

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