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
#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
#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
for (int j = 0; j < N; j++) sum += a[____][j];
for (int j = 0; j < N; j++) sum += a[i][j];
Açıklama: a[i][j] satır major erişimdir; cache dostudur.