0 Tage Serie
cpp / expert
Snippet

Linearisierter Zugriff für zusammenhängenden mehrdimensionalen Speicher

Hochleistungssysteme vermeiden verschachtelte Pointer (wie int***), da diese Cache-Misses verursachen. Stattdessen werden Daten in einem einzigen zusammenhängenden Block gespeichert und mehrdimensionale Koordinaten mittels Row-Major- oder Column-Major-Arithmetik auf einen linearen Index abgebildet.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
class Volume3D {
int* buffer;
int w, h, d;
public:
Volume3D(int x, int y, int z) : w(x), h(y), d(z) {
buffer = new int[x * y * z];
}
int& at(int x, int y, int z) {
return buffer[x + w * (y + h * z)];
}
~Volume3D() { delete[] buffer; }
};
Erklärung
1
buffer = new int[x * y * z];
Allokiert ein einzelnes flaches Array, um alle 3D-Datenpunkte zusammenhängend im Speicher zu halten.
2
return buffer[x + w * (y + h * z)];
Berechnet den exakten Speicher-Offset für 3D-Koordinaten (x, y, z) unter Verwendung der Strides der Dimensionen.