c / expert
Snippet
Cache-freundliche Matrix-Verarbeitung durch lineare Speicher-Stride-Traversierung
In C werden mehrdimensionale Arrays im Row-Major-Format im Speicher abgelegt. Die Iteration über Spalten in der inneren Schleife maximiert L1-Cache-Hits und die Effizienz des CPU-Prefetchings gegenüber Column-Major-Iteration.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>#define ROWS 4#define COLS 4long sum_matrix_row_major(const int matrix[ROWS][COLS]) {long total = 0;for (int r = 0; r < ROWS; r++) {for (int c = 0; c < COLS; c++) {total += matrix[r][c];}}return total;}int main(void) {int data[ROWS][COLS] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 16}};printf("Sum: %ld\n", sum_matrix_row_major(data));return 0;}
Erklärung
1
for (int r = 0; r < ROWS; r++)
Die äußere Schleife durchläuft die Zeilen sequenziell und behält so eine lineare Speicheradressierung bei.
2
total += matrix[r][c];
Greift sequenziell auf benachbarte Elemente zu (Stride 1), was Hardware-Prefetching ermöglicht.