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.