c / expert
Snippet
Zeilenweise Vektorisierbare Dynamische Multidimensionale Array-Indizierung
Die Linearisierung von mehrdimensionalen Array-Zugriffen in einen zusammenhängenden 1D-Puffer eliminiert Zeiger-Indirektions-Overhead und Layout-Fragmentierung. Die Verwendung des Schlüsselworts restrict informiert den Compiler darüber, dass Zeiger nicht überlappen, was automatische Vektorisierungsoptimierungen ermöglicht.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
#include <stddef.h>void compute_tensor_3d(float *restrict data, size_t depth, size_t rows, size_t cols) {for (size_t d = 0; d < depth; ++d) {for (size_t r = 0; r < rows; ++r) {for (size_t c = 0; c < cols; ++c) {size_t index = d * (rows * cols) + r * cols + c;data[index] = data[index] * 2.0f + 1.0f;}}}}
Erklärung
1
void compute_tensor_3d(float *restrict data, size_t depth, size_t rows, size_t cols)
Nutzt den restrict-Qualifizierer zur Gewährleistung eindeutigen Speicherzugriffs für SIMD-Vektorisierung.
2
size_t index = d * (rows * cols) + r * cols + c;
Berechnet den flachen zeilenweisen linearen Offset für den Zugriff im 3D-Koordinatenraum.
3
data[index] = data[index] * 2.0f + 1.0f;
Führt in-place Arithmetik auf zusammenhängendem Speicher aus, optimiert für L1-Cache-Prefetching.