Intra Node Stencil Performance Evaluation Collection
dimension | 3D |
radius | 2 |
weighting | isotropic |
kind | box |
coefficients | constant |
datatype | double |
machine | IvyBridgeEP_E5-2660v2 |
Benchmark raw data shown on this page can be found in the according folder of the git repository.
If you have feedback, issues or found errors on this page, please submit an issue on the github page.
double a[M][N][P];
double b[M][N][P];
double c0;
for ( int k = 2; k < M - 2; k++ ) {
for ( int j = 2; j < N - 2; j++ ) {
for (int i = 2; i < P - 2; i++ ) {
b[k][j][i] = c0 *
( a[k][j][i] + a[k-2][j-2][i-2] + a[k-1][j-2][i-2]
+ a[k][j-2][i-2] + a[k+1][j-2][i-2] + a[k+2][j-2][i-2]
+ a[k-2][j-1][i-2] + a[k-1][j-1][i-2] + a[k][j-1][i-2]
+ a[k+1][j-1][i-2] + a[k+2][j-1][i-2] + a[k-2][j][i-2]
+ a[k-1][j][i-2] + a[k][j][i-2] + a[k+1][j][i-2]
+ a[k+2][j][i-2] + a[k-2][j+1][i-2] + a[k-1][j+1][i-2]
+ a[k][j+1][i-2] + a[k+1][j+1][i-2] + a[k+2][j+1][i-2]
+ a[k-2][j+2][i-2] + a[k-1][j+2][i-2] + a[k][j+2][i-2]
+ a[k+1][j+2][i-2] + a[k+2][j+2][i-2] + a[k-2][j-2][i-1]
+ a[k-1][j-2][i-1] + a[k][j-2][i-1] + a[k+1][j-2][i-1]
+ a[k+2][j-2][i-1] + a[k-2][j-1][i-1] + a[k-1][j-1][i-1]
+ a[k][j-1][i-1] + a[k+1][j-1][i-1] + a[k+2][j-1][i-1]
+ a[k-2][j][i-1] + a[k-1][j][i-1] + a[k][j][i-1]
+ a[k+1][j][i-1] + a[k+2][j][i-1] + a[k-2][j+1][i-1]
+ a[k-1][j+1][i-1] + a[k][j+1][i-1] + a[k+1][j+1][i-1]
+ a[k+2][j+1][i-1] + a[k-2][j+2][i-1] + a[k-1][j+2][i-1]
+ a[k][j+2][i-1] + a[k+1][j+2][i-1] + a[k+2][j+2][i-1]
+ a[k-2][j-2][i] + a[k-1][j-2][i] + a[k][j-2][i]
+ a[k+1][j-2][i] + a[k+2][j-2][i] + a[k-2][j-1][i]
+ a[k-1][j-1][i] + a[k][j-1][i] + a[k+1][j-1][i]
+ a[k+2][j-1][i] + a[k-2][j][i] + a[k-1][j][i]
+ a[k+1][j][i] + a[k+2][j][i] + a[k-2][j+1][i]
+ a[k-1][j+1][i] + a[k][j+1][i] + a[k+1][j+1][i]
+ a[k+2][j+1][i] + a[k-2][j+2][i] + a[k-1][j+2][i]
+ a[k][j+2][i] + a[k+1][j+2][i] + a[k+2][j+2][i]
+ a[k-2][j-2][i+1] + a[k-1][j-2][i+1] + a[k][j-2][i+1]
+ a[k+1][j-2][i+1] + a[k+2][j-2][i+1] + a[k-2][j-1][i+1]
+ a[k-1][j-1][i+1] + a[k][j-1][i+1] + a[k+1][j-1][i+1]
+ a[k+2][j-1][i+1] + a[k-2][j][i+1] + a[k-1][j][i+1]
+ a[k][j][i+1] + a[k+1][j][i+1] + a[k+2][j][i+1]
+ a[k-2][j+1][i+1] + a[k-1][j+1][i+1] + a[k][j+1][i+1]
+ a[k+1][j+1][i+1] + a[k+2][j+1][i+1] + a[k-2][j+2][i+1]
+ a[k-1][j+2][i+1] + a[k][j+2][i+1] + a[k+1][j+2][i+1]
+ a[k+2][j+2][i+1] + a[k-2][j-2][i+2] + a[k-1][j-2][i+2]
+ a[k][j-2][i+2] + a[k+1][j-2][i+2] + a[k+2][j-2][i+2]
+ a[k-2][j-1][i+2] + a[k-1][j-1][i+2] + a[k][j-1][i+2]
+ a[k+1][j-1][i+2] + a[k+2][j-1][i+2] + a[k-2][j][i+2]
+ a[k-1][j][i+2] + a[k][j][i+2] + a[k+1][j][i+2]
+ a[k+2][j][i+2] + a[k-2][j+1][i+2] + a[k-1][j+1][i+2]
+ a[k][j+1][i+2] + a[k+1][j+1][i+2] + a[k+2][j+1][i+2]
+ a[k-2][j+2][i+2] + a[k-1][j+2][i+2] + a[k][j+2][i+2]
+ a[k+1][j+2][i+2] + a[k+2][j+2][i+2] );
}
}
}
P <= 2050/13
, that is 157
P <= 16386/13
, that is 1260
P <= 1179650/13
, that is 90742
48*N*P - 32*P - 32 <= 32768
, that is 26²
48*N*P - 32*P - 32 <= 262144
, that is 73²
48*N*P - 32*P - 32 <= 26214400
, that is 739²
Have a look at the kernel source code for dimension naming.
Generate this stencil with:
stempel gen -D 3 -r 2 -t "double" -C constant -k box -i --store stencil.c
and generate the compilable benchmark code with:
stempel bench stencil.c -m IvyBridgeEP_E5-2660v2.yml --store
icc -O3 -xAVX -fno-alias -qopenmp -DLIKWID_PERFMON -I/mnt/opt/likwid-4.3.2/include -L/mnt/opt/likwid-4.3.2/lib -I./stempel/stempel/headers/ ./stempel/headers/timing.c ./stempel/headers/dummy.c solar_compilable.c -o stencil -llikwid
Comparison of the measured stencil performance (in cycles per cache line), roofline prediction and the (stacked) contributions of the ECM Performance Model predicted by kerncraft using Layer Conditions to model the cache behavior. The calculated layer conditions shown above correspond to the jumps in the ECM prediction in this plot.
Data transfers between the different cache levels and main memory. The shown data for each level contains evicted and loaded data. The measured data is represented by points and the predicted transfer rates by kerncraft by lines.
Using the generated stencil and kerncraft, all single core performance data shown on this page can be reproduced by:
kerncraft -p ECM -p RooflineIACA -p Benchmark -p LC -P LC -m IvyBridgeEP_E5-2660v2.yml stencil.c -D N $GRID_SIZE -D M $GRID_SIZE -D P $GRID_SIZE -vvv --cores 1 --compiler icc
kerncraft -p ECM -p RooflineIACA -p Benchmark -p LC -P CS -m IvyBridgeEP_E5-2660v2.yml stencil.c -D N $GRID_SIZE -D M $GRID_SIZE -D P $GRID_SIZE -vvv --cores 1 --compiler icc
The generated benchmark code can be used to reproduce the thread scaling data shown on this page by:
kerncraft -p ECM -p RooflineIACA -p Benchmark -P LC -m IvyBridgeEP_E5-2660v2.yml stencil.c -D N $GRID_SIZE -D M $GRID_SIZE -D P $GRID_SIZE -vvv --cores $CORES --compiler icc
The roofline prediction can be obtained with kerncraft and the generated stencil:
kerncraft -p RooflineIACA -P LC -m IvyBridgeEP_E5-2660v2.yml stencil.c -D N $GRID_SIZE -D M $GRID_SIZE -D P $GRID_SIZE -vvv --cores ${threads} --compiler icc
Generate benchmark code from the stencil with blocking and compile it as shown before:
stempel bench stencil.c -m IvyBridgeEP_E5-2660v2.yml -b 2 --store
OMP_NUM_THREADS=1 likwid-pin -C S0:0 ./stencil $GRID_SIZE $GRID_SIZE $GRID_SIZE $BLOCKING_M $BLOCKING_N $BLOCKING_P