C
Cache etkisi
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", ...).
Örnek çözümü göster
#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;
}
Kendini test et
-
Cache kavramlarını eşle
- cache satırı
- Ardışık veri
- satır major
- Cache dostu
- sütun major
- Cache düşmanı
- yerellik
- Yakın erişim
-
Hangi erişim biçimi cache dostudur?
- Sütun major
- Satır major
- Rastgele erişim
- Ters sıra
Cevabı göster
Satır major — Satır major ardışık erişir; cache'i iyi kullanır.
-
Satır major erişim
for (int j = 0; j < N; j++) sum += a[____][j];
Cevabı göster
for (int j = 0; j < N; j++) sum += a[i][j];
Sıradaki ders: Döngü optimizasyonu