Page MenuHomec4science

No OneTemporary

File Metadata

Created
Wed, May 1, 04:04
This document is not UTF8. It was detected as ISO-8859-1 (Latin 1) and converted to UTF8 for display.
diff --git a/examples/openmp/dgemm.cc b/examples/openmp/dgemm.cc
index 1ecdf9a..b302e9d 100644
--- a/examples/openmp/dgemm.cc
+++ b/examples/openmp/dgemm.cc
@@ -1,45 +1,47 @@
#include <chrono>
#include <cmath>
#include <cstdio>
#include <omp.h>
#include <vector>
using clk = std::chrono::high_resolution_clock;
using second = std::chrono::duration<double>;
using time_point = std::chrono::time_point<clk>;
int main() {
int N = 2000;
std::vector<double> A(N * N), B(N * N), C(N * N);
for (auto &a : A)
a = 1.0;
for (auto &b : B)
b = 2.0;
for (auto &c : C)
c = 0.0;
auto verif = [&](auto &&A) {
double sum = 0.;
for (auto &a : A)
sum += a;
return sum;
};
+ auto nthreads = omp_get_max_threads();
+
auto t1 = clk::now();
-#pragma omp parallel for collapse(1)
+#pragma omp parallel for collapse(1) schedule(static, N / nthreads)
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k)
C[i * N + j] += A[i * N + k] * B[k * N + j];
second elapsed = clk::now() - t1;
- std::printf("DGEMM with %i threads (collapse(1)): %g GFLOP/s (verif %g)\n",
- omp_get_max_threads(), ((2. * N * N * N) / elapsed.count() / 1e8),
+ std::printf("DGEMM with %i threads, collapse(1): %g GFLOP/s (verif %g)\n",
+ nthreads, ((2. * N * N * N) / elapsed.count() / 1e8),
verif(C) / (1. * N * N * N));
return 0;
}
diff --git a/notes.org b/notes.org
index 6f9905d..34ad54e 100644
--- a/notes.org
+++ b/notes.org
@@ -1,87 +1,87 @@
* PHYS 743 - Parallel Programming
** General remarks
- QUESTION: Do we have time to visit INJ?
** Tentative agenda
*** Admin intro
**** Projects
*** Basic concepts
**** ssh, scp, rsync
**** Compilation
***** Modules
**** Debugging
*** Architecture
**** Cluster (MPI)
***** Clusters in general
***** At SCITAS
**** Multicore (OpenMP)
**** Singlecore (SIMD)
*** Optimization
**** Data access
**** Vectorization
**** Basic optimization techniques
*** Performance measurement
**** Key concepts
***** FLOPS, memory bandwidth
***** timing (speedup, scalings)
**** Profiling
**** Roofline
-*** Shared memory (OpenMP)
-**** Task parallelism
-**** OpenMP terminology / Read spec
-**** Fork-join / Omp parallel / Implicit barriers
-**** Exercise Hello World / SLURM
-**** Omp parallel for
-**** Exercise
-**** Race condition
-**** Omp critical (synchronization), atomic, accumulation in array (false sharing)
-**** Omp private
-**** Omp reduction
-**** Work sharing constructs
-**** OpenMP (new features not covered)
-**** Exercise Poisson
+*** Shared memory (OpenMP) [10/13]
+**** [X] Task parallelism
+**** [X] OpenMP terminology / Read spec
+**** [X] Fork-join / Omp parallel / Implicit barriers
+**** [X] Exercise Hello World / SLURM
+**** [X] Omp parallel for
+**** [X] Exercise
+**** [-] Race condition
+**** [X] Omp critical (synchronization), atomic, accumulation in array (false sharing)
+**** [X] Omp private
+**** [X] Omp reduction
+**** [X] Work sharing constructs
+**** [-] OpenMP (new features not covered)
+**** [-] Exercise Poisson
*** Advanced
**** Schedule
**** NUMA / pinning / first touch
**** Collapse
**** Barriers
**** (GPU)
*** Distributed memory (MPI) basic
**** Introduction / Read spec
**** MPI enviroment / Hello world
***** Print before init
***** Print rank
***** Print conditionnaly rank
**** MPI terminology
**** Point-to-point
***** Synchronous / Deadlock
***** Asynchronous / race condition
**** Collective
***** Bcast
***** Gather/scatter
***** Reduce
**** Advanced collective
***** All
***** Gather/Scatterv
***** All to all
***** Barrier
**** MPI Fortran
***** Bindings
***** Asynchronous arrays
**** Exercise Poisson
*** Distributed memory (MPI) advanced
**** Derived types
**** (un)Pack
**** Communicator
**** Topologies
**** IO
**** One-sided
**** Persistent
**** Non blocking collectives
*** Hybrid programming
**** Mpi init
**** Task/thread Repartition
*** Recap
*** Projects
*** Pub pour SCITAS
diff --git a/src/openmp/figures/detailed_node_architecture.pdf b/src/openmp/figures/detailed_node_architecture.pdf
index e8957b2..bed3fe1 100644
Binary files a/src/openmp/figures/detailed_node_architecture.pdf and b/src/openmp/figures/detailed_node_architecture.pdf differ
diff --git a/src/openmp/figures/detailed_node_architecture.svg b/src/openmp/figures/detailed_node_architecture.svg
index 202abae..491aa58 100644
--- a/src/openmp/figures/detailed_node_architecture.svg
+++ b/src/openmp/figures/detailed_node_architecture.svg
@@ -1,1652 +1,813 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="14.355208cm"
height="11.140521cm"
viewBox="0 0 143.55208 111.40521"
version="1.1"
id="svg8"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="detailed_node_architecture.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.8101934"
- inkscape:cx="298.03446"
- inkscape:cy="259.91699"
+ inkscape:zoom="1.28"
+ inkscape:cx="110.54687"
+ inkscape:cy="368.74999"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="2263"
inkscape:window-height="1218"
inkscape:window-x="233"
inkscape:window-y="102"
inkscape:window-maximized="0"
units="cm"
fit-margin-top="0.1"
fit-margin-bottom="0.1"
fit-margin-right="0.1"
fit-margin-left="0.1"
inkscape:pagecheckerboard="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="-28.104162"
originy="-33.131249" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Full"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(-28.104164,-33.131249)">
+ transform="translate(-28.104164,-33.131249)"
+ style="display:inline">
<path
style="fill:none;stroke:#000000;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 66.145832,95.249999 v 6.614581"
id="path863" />
- <path
- style="fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 100.54167,79.375003 88.635417,79.375"
- id="path1167"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 111.125,79.375003 99.218747,79.375"
- id="path1169"
- sodipodi:nodetypes="cc" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect835"
width="136.26042"
height="96.572922"
x="31.75"
y="34.395832" />
<rect
style="fill:#0000ed;fill-opacity:0.139868;stroke:#00007d;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect845"
width="44.94347"
height="31.75"
x="43.65625"
y="63.764557" />
- <rect
- style="fill:#ff0000;fill-opacity:0.218952;stroke:#cb0000;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect857"
- width="44.979168"
- height="21.166666"
- x="43.65625"
- y="101.86458" />
- <path
- style="fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 100.54167,79.375 v 63.5"
- id="path1107" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="58.373695"
- y="115.48235"
- id="text1123"><tspan
- sodipodi:role="line"
- id="tspan1121"
- x="58.373695"
- y="115.48235"
- style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583">RAM</tspan><tspan
- sodipodi:role="line"
- x="58.373695"
- y="126.06569"
- style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583"
- id="tspan1125" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 133.61458,95.249999 v 6.614581"
id="path1131" />
<rect
style="fill:#0000ed;fill-opacity:0.139868;stroke:#00007d;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1133"
width="44.94347"
height="31.75"
x="111.125"
y="63.764557" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Shared memory"
+ style="display:none">
<rect
- style="fill:#ff0000;fill-opacity:0.218952;stroke:#cb0000;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1139"
- width="44.979168"
+ style="display:inline;fill:#ff0000;fill-opacity:0.218952;stroke:#cb0000;stroke-width:0.836686;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect1139-3"
+ width="112.44792"
height="21.166666"
- x="111.125"
- y="101.86458" />
+ x="15.552094"
+ y="68.73333" />
<text
xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="125.84245"
- y="115.48235"
- id="text1157"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;display:inline;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="38.632847"
+ y="81.516014"
+ id="text1157-6"><tspan
sodipodi:role="line"
- id="tspan1153"
- x="125.84245"
- y="115.48235"
- style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583">RAM</tspan><tspan
+ id="tspan1153-7"
+ x="38.632847"
+ y="81.516014"
+ style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583">Shared Memory</tspan><tspan
sodipodi:role="line"
- x="125.84245"
- y="126.06569"
+ x="38.632847"
+ y="92.09935"
style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583"
- id="tspan1155" /></text>
- <path
- style="fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 170.65625,142.875 H 29.104164"
- id="path1171"
- sodipodi:nodetypes="cc" />
+ id="tspan1155-5" /></text>
</g>
<g
inkscape:groupmode="layer"
id="layer2"
- inkscape:label="GPUs"
- style="display:none">
+ inkscape:label="Non essential"
+ style="display:inline">
<g
id="g1686"
transform="translate(-28.104163,-33.131249)">
<path
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 54.239583,58.208333 v 5.291666"
id="path859" />
<path
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 79.374999,58.208333 v 5.291666"
id="path861" />
<rect
style="fill:#00b400;fill-opacity:0.413011;stroke:#006400;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect849"
width="21.166666"
height="16.933332"
x="43.65625"
y="41.010418" />
<rect
style="fill:#00b400;fill-opacity:0.413011;stroke:#006400;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect851"
width="21.166666"
height="16.933332"
x="67.46875"
y="41.010418" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="46.634876"
y="52.50119"
id="text1115"><tspan
sodipodi:role="line"
id="tspan1113"
x="46.634876"
y="52.50119"
style="font-weight:normal;font-size:8.46667px;fill:#006400;fill-opacity:1;stroke-width:0.264583">GPU</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="70.44738"
y="52.50119"
id="text1119"><tspan
sodipodi:role="line"
id="tspan1117"
x="70.44738"
y="52.50119"
style="font-weight:normal;font-size:8.46667px;fill:#006400;fill-opacity:1;stroke-width:0.264583">GPU</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 121.70833,58.208333 v 5.291666"
id="path1127" />
<path
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.52201"
d="m 146.84375,58.208333 v 5.291666"
id="path1129" />
<rect
style="fill:#00b400;fill-opacity:0.413011;stroke:#006400;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1135"
width="21.166666"
height="16.933332"
x="111.125"
y="41.010418" />
<rect
style="fill:#00b400;fill-opacity:0.413011;stroke:#006400;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1137"
width="21.166666"
height="16.933332"
x="134.9375"
y="41.010418" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="114.10363"
y="52.50119"
id="text1147"><tspan
sodipodi:role="line"
id="tspan1145"
x="114.10363"
y="52.50119"
style="font-weight:normal;font-size:8.46667px;fill:#006400;fill-opacity:1;stroke-width:0.264583">GPU</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="137.91614"
y="52.50119"
id="text1151"><tspan
sodipodi:role="line"
id="tspan1149"
x="137.91614"
y="52.50119"
style="font-weight:normal;font-size:8.46667px;fill:#006400;fill-opacity:1;stroke-width:0.264583">GPU</tspan></text>
</g>
+ <rect
+ style="display:inline;fill:#ff0000;fill-opacity:0.218952;stroke:#cb0000;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect1139"
+ width="44.979168"
+ height="21.166666"
+ x="111.125"
+ y="101.86458"
+ transform="translate(-28.104163,-33.131249)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;display:inline;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="125.84245"
+ y="115.48235"
+ id="text1157"
+ transform="translate(-28.104163,-33.131249)"><tspan
+ sodipodi:role="line"
+ id="tspan1153"
+ x="125.84245"
+ y="115.48235"
+ style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583">RAM</tspan><tspan
+ sodipodi:role="line"
+ x="125.84245"
+ y="126.06569"
+ style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583"
+ id="tspan1155" /></text>
+ <path
+ style="display:inline;fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 161.78255,80.032359 V 143.53236"
+ id="path1107"
+ transform="translate(-28.104163,-33.131249)" />
+ <path
+ style="display:inline;fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 162.45665,79.78474 -6.37725,-3e-6"
+ id="path875"
+ sodipodi:nodetypes="cc"
+ transform="translate(-28.104163,-33.131249)" />
+ <path
+ style="display:inline;fill:none;stroke:#828282;stroke-width:1.32293;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 43.681157,79.78474 -6.459631,-3e-6"
+ id="path877"
+ sodipodi:nodetypes="cc"
+ transform="translate(-28.104163,-33.131249)" />
+ <path
+ style="display:inline;fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 37.862778,79.950458 V 143.45046"
+ id="path873"
+ transform="translate(-28.104163,-33.131249)" />
+ <rect
+ style="display:inline;fill:#ff0000;fill-opacity:0.218952;stroke:#cb0000;stroke-width:0.529167;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect857"
+ width="44.979168"
+ height="21.166666"
+ x="43.65625"
+ y="101.86458"
+ transform="translate(-28.104163,-33.131249)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;display:inline;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="58.373695"
+ y="115.48235"
+ id="text1123"
+ transform="translate(-28.104163,-33.131249)"><tspan
+ sodipodi:role="line"
+ id="tspan1121"
+ x="58.373695"
+ y="115.48235"
+ style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583">RAM</tspan><tspan
+ sodipodi:role="line"
+ x="58.373695"
+ y="126.06569"
+ style="font-weight:normal;font-size:8.46667px;fill:#cb0000;fill-opacity:1;stroke-width:0.264583"
+ id="tspan1125" /></text>
+ <path
+ style="display:inline;fill:none;stroke:#00007d;stroke-width:2.723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 111.00154,79.78474 -22.494082,-3e-6"
+ id="path1167"
+ sodipodi:nodetypes="cc"
+ transform="translate(-28.104163,-33.131249)" />
+ <path
+ style="display:inline;fill:none;stroke:#828282;stroke-width:1.32292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 170.65625,142.875 H 29.104164"
+ id="path1171"
+ sodipodi:nodetypes="cc"
+ transform="translate(-28.104163,-33.131249)" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="CPU Node"
- style="display:none">
+ style="display:inline">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="125.96722"
y="82.663666"
id="text1143"
transform="translate(-28.104163,-33.131249)"><tspan
sodipodi:role="line"
id="tspan1141"
x="125.96722"
y="82.663666"
style="font-weight:normal;font-size:8.46667px;fill:#00007d;fill-opacity:1;stroke-width:0.264583">CPU</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#00007d;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="58.498474"
y="82.663666"
id="text1111"
transform="translate(-28.104163,-33.131249)"><tspan
sodipodi:role="line"
id="tspan1109"
x="58.498474"
y="82.663666"
style="font-weight:normal;font-size:8.46667px;fill:#00007d;fill-opacity:1;stroke-width:0.264583">CPU</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Node Detail"
- style="display:inline">
+ style="display:none">
<g
- id="g3068"
- transform="translate(52.156377,1.8218216)">
+ id="g5033"
+ transform="translate(-0.47464864,3.0349851)">
+ <g
+ id="g4726"
+ transform="translate(-2.9305116,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931"><tspan
+ sodipodi:role="line"
+ id="tspan929"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
<g
- inkscape:label="Layer 1"
- id="layer1-5"
- transform="matrix(0.34218257,0,0,0.34218257,-52.610272,4.6243939)"
- style="display:inline">
- <g
- id="g1446"
- transform="translate(-1.0583342)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1430" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1442" />
- </g>
- <g
- id="g1452"
- transform="translate(19.3146)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1448" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1450" />
- </g>
- <g
- id="g1458"
- transform="translate(39.423026)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1454" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1456" />
- </g>
- <g
- id="g1464"
- transform="translate(60.060656)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1460" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1462" />
- </g>
- <g
- id="g1470"
- transform="translate(80.433378)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1466" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1468" />
- </g>
+ id="g4726-6"
+ style="display:inline"
+ transform="translate(5.5227744,0.19205682)">
<rect
- style="fill:none;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.458078"
- id="rect835-6"
- width="103.1875"
- height="91.281242"
- x="60.854164"
- y="71.4375" />
- <g
- id="g1243">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect839"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect841"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect843"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text931"><tspan
- sodipodi:role="line"
- id="tspan929"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text935"><tspan
- sodipodi:role="line"
- id="tspan933"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text939"><tspan
- sodipodi:role="line"
- id="tspan937"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1248">
- <rect
- style="fill:#efaff5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect837"
- width="97.895836"
- height="10.583333"
- x="63.5"
- y="148.69583" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="110.2801"
- y="155.24754"
- id="text943"><tspan
- sodipodi:role="line"
- id="tspan941"
- x="110.2801"
- y="155.24754"
- style="stroke-width:0.264583">L3</tspan></text>
- </g>
- <g
- id="g1268"
- transform="translate(20.372934)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1250"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1252"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1254"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1258"><tspan
- sodipodi:role="line"
- id="tspan1256"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1262"><tspan
- sodipodi:role="line"
- id="tspan1260"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1266"><tspan
- sodipodi:role="line"
- id="tspan1264"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1288"
- transform="translate(40.745858)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1270"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1272"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1274"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1278"><tspan
- sodipodi:role="line"
- id="tspan1276"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1282"><tspan
- sodipodi:role="line"
- id="tspan1280"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1286"><tspan
- sodipodi:role="line"
- id="tspan1284"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1308"
- transform="translate(61.118783)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1290"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1292"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1294"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1298"><tspan
- sodipodi:role="line"
- id="tspan1296"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1302"><tspan
- sodipodi:role="line"
- id="tspan1300"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1306"><tspan
- sodipodi:role="line"
- id="tspan1304"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1328"
- transform="translate(81.491712)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1310"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1312"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1314"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1318"><tspan
- sodipodi:role="line"
- id="tspan1316"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1322"><tspan
- sodipodi:role="line"
- id="tspan1320"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1326"><tspan
- sodipodi:role="line"
- id="tspan1324"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1348"
- transform="translate(0,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1330"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1332"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1334"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1338"><tspan
- sodipodi:role="line"
- id="tspan1336"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1342"><tspan
- sodipodi:role="line"
- id="tspan1340"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1346"><tspan
- sodipodi:role="line"
- id="tspan1344"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1368"
- transform="translate(20.372934,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1350"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1352"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1354"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1358"><tspan
- sodipodi:role="line"
- id="tspan1356"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1362"><tspan
- sodipodi:role="line"
- id="tspan1360"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1366"><tspan
- sodipodi:role="line"
- id="tspan1364"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1388"
- transform="translate(40.48136,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1370"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1372"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1374"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1378"><tspan
- sodipodi:role="line"
- id="tspan1376"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1382"><tspan
- sodipodi:role="line"
- id="tspan1380"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1386"><tspan
- sodipodi:role="line"
- id="tspan1384"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1408"
- transform="translate(61.11899,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1390"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1392"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1394"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1398"><tspan
- sodipodi:role="line"
- id="tspan1396"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1402"><tspan
- sodipodi:role="line"
- id="tspan1400"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1406"><tspan
- sodipodi:role="line"
- id="tspan1404"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1428"
- transform="translate(81.491712,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1410"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1412"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1414"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1418"><tspan
- sodipodi:role="line"
- id="tspan1416"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1422"><tspan
- sodipodi:role="line"
- id="tspan1420"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1426"><tspan
- sodipodi:role="line"
- id="tspan1424"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-9"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-3"><tspan
+ sodipodi:role="line"
+ id="tspan929-7"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-4"
+ style="display:inline"
+ transform="translate(13.97606,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-5"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-2"><tspan
+ sodipodi:role="line"
+ id="tspan929-5"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-47"
+ style="display:inline"
+ transform="translate(22.429346,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-4"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-4"><tspan
+ sodipodi:role="line"
+ id="tspan929-3"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0"
+ style="display:inline"
+ transform="translate(30.882632,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8"><tspan
+ sodipodi:role="line"
+ id="tspan929-6"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-8"
+ style="display:inline"
+ transform="translate(30.882632,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-8"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-4"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-3"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-1"
+ style="display:inline"
+ transform="translate(22.429346,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-4"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-9"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-2"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-0"
+ style="display:inline"
+ transform="translate(13.97606,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-6"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-8"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-9"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-2"
+ style="display:inline"
+ transform="translate(-2.9305116,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-66"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-49"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-5"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-04"
+ style="display:inline"
+ transform="translate(5.5227744,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-87"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-1"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-7"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
</g>
</g>
<g
- id="g3068-2"
- transform="translate(119.62513,1.8218216)"
+ id="g5033-2"
+ transform="translate(66.994101,3.0349851)"
style="display:inline">
<g
- inkscape:label="Layer 1"
- id="layer1-5-9"
- transform="matrix(0.34218257,0,0,0.34218257,-52.610272,4.6243939)"
- style="display:inline">
- <g
- id="g1446-1"
- transform="translate(-1.0583342)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1430-2" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1442-7" />
- </g>
- <g
- id="g1452-0"
- transform="translate(19.3146)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1448-9" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1450-3" />
- </g>
- <g
- id="g1458-6"
- transform="translate(39.423026)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1454-0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1456-6" />
- </g>
- <g
- id="g1464-2"
- transform="translate(60.060656)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1460-6" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1462-1" />
- </g>
- <g
- id="g1470-8"
- transform="translate(80.433378)">
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 71.70208,117.62217 v 35.83616"
- id="path1466-7" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.529696;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.818748,82.020833 V 153.45833"
- id="path1468-9" />
- </g>
+ id="g4726-7"
+ transform="translate(-2.9305116,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-2"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-26"><tspan
+ sodipodi:role="line"
+ id="tspan929-1"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-6-0"
+ style="display:inline"
+ transform="translate(5.5227744,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-9-6"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-3-1"><tspan
+ sodipodi:role="line"
+ id="tspan929-7-5"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-4-9"
+ style="display:inline"
+ transform="translate(13.97606,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-5-4"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-2-9"><tspan
+ sodipodi:role="line"
+ id="tspan929-5-0"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-47-9"
+ style="display:inline"
+ transform="translate(22.429346,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-4-1"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-4-7"><tspan
+ sodipodi:role="line"
+ id="tspan929-3-7"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-11"
+ style="display:inline"
+ transform="translate(30.882632,0.19205682)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-5"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-97"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-76"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-8-7"
+ style="display:inline"
+ transform="translate(30.882632,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-8-3"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-4-6"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-3-5"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-1-6"
+ style="display:inline"
+ transform="translate(22.429346,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-4-3"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-9-9"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-2-4"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-0-8"
+ style="display:inline"
+ transform="translate(13.97606,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-6-1"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-8-2"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-9-9"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-2-3"
+ style="display:inline"
+ transform="translate(-2.9305116,13.0347)">
+ <rect
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-66-9"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-49-0"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-5-8"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
+ </g>
+ <g
+ id="g4726-0-04-8"
+ style="display:inline"
+ transform="translate(5.5227744,13.0347)">
<rect
- style="fill:none;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.458078"
- id="rect835-6-2"
- width="103.1875"
- height="91.281242"
- x="60.854164"
- y="71.4375" />
- <g
- id="g1243-0">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect839-2"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect841-3"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect843-7"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text931-5"><tspan
- sodipodi:role="line"
- id="tspan929-9"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text935-2"><tspan
- sodipodi:role="line"
- id="tspan933-2"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text939-8"><tspan
- sodipodi:role="line"
- id="tspan937-9"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1248-7">
- <rect
- style="fill:#efaff5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect837-3"
- width="97.895836"
- height="10.583333"
- x="63.5"
- y="148.69583" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="110.2801"
- y="155.24754"
- id="text943-6"><tspan
- sodipodi:role="line"
- id="tspan941-1"
- x="110.2801"
- y="155.24754"
- style="stroke-width:0.264583">L3</tspan></text>
- </g>
- <g
- id="g1268-2"
- transform="translate(20.372934)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1250-9"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1252-3"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1254-1"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1258-9"><tspan
- sodipodi:role="line"
- id="tspan1256-4"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1262-7"><tspan
- sodipodi:role="line"
- id="tspan1260-8"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1266-4"><tspan
- sodipodi:role="line"
- id="tspan1264-5"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1288-0"
- transform="translate(40.745858)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1270-3"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1272-6"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1274-1"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1278-0"><tspan
- sodipodi:role="line"
- id="tspan1276-6"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1282-3"><tspan
- sodipodi:role="line"
- id="tspan1280-2"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1286-0"><tspan
- sodipodi:role="line"
- id="tspan1284-6"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1308-1"
- transform="translate(61.118783)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1290-5"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1292-5"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1294-4"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1298-7"><tspan
- sodipodi:role="line"
- id="tspan1296-6"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1302-5"><tspan
- sodipodi:role="line"
- id="tspan1300-6"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1306-9"><tspan
- sodipodi:role="line"
- id="tspan1304-3"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1328-7"
- transform="translate(81.491712)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1310-4"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1312-5"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1314-2"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1318-5"><tspan
- sodipodi:role="line"
- id="tspan1316-4"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1322-7"><tspan
- sodipodi:role="line"
- id="tspan1320-4"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1326-4"><tspan
- sodipodi:role="line"
- id="tspan1324-3"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1348-0"
- transform="translate(0,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1330-7"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1332-8"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1334-6"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1338-8"><tspan
- sodipodi:role="line"
- id="tspan1336-8"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1342-4"><tspan
- sodipodi:role="line"
- id="tspan1340-3"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1346-1"><tspan
- sodipodi:role="line"
- id="tspan1344-4"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1368-9"
- transform="translate(20.372934,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1350-2"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1352-0"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1354-6"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1358-8"><tspan
- sodipodi:role="line"
- id="tspan1356-9"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1362-2"><tspan
- sodipodi:role="line"
- id="tspan1360-6"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1366-6"><tspan
- sodipodi:role="line"
- id="tspan1364-4"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1388-9"
- transform="translate(40.48136,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1370-5"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1372-0"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1374-4"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1378-8"><tspan
- sodipodi:role="line"
- id="tspan1376-7"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1382-1"><tspan
- sodipodi:role="line"
- id="tspan1380-7"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1386-2"><tspan
- sodipodi:role="line"
- id="tspan1384-7"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1408-2"
- transform="translate(61.11899,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1390-2"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1392-6"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1394-1"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1398-0"><tspan
- sodipodi:role="line"
- id="tspan1396-6"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1402-1"><tspan
- sodipodi:role="line"
- id="tspan1400-5"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1406-9"><tspan
- sodipodi:role="line"
- id="tspan1404-4"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
- <g
- id="g1428-9"
- transform="translate(81.491712,37.041684)">
- <rect
- style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1410-0"
- width="15.875"
- height="15.875"
- x="63.76458"
- y="75.40625" />
- <rect
- style="fill:#efe6f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1412-9"
- width="15.875"
- height="5.2916665"
- x="63.76458"
- y="92.604164" />
- <rect
- style="fill:#efc5f5;fill-opacity:1;stroke:#00000d;stroke-width:0.529;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect1414-1"
- width="15.875"
- height="9.260417"
- x="63.76458"
- y="99.21875" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="67.471512"
- y="84.60379"
- id="text1418-7"><tspan
- sodipodi:role="line"
- id="tspan1416-7"
- x="67.471512"
- y="84.60379"
- style="stroke-width:0.264583">Core</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.790054"
- y="96.509178"
- id="text1422-1"><tspan
- sodipodi:role="line"
- id="tspan1420-1"
- x="69.790054"
- y="96.509178"
- style="stroke-width:0.264583">L1</tspan></text>
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
- x="69.522202"
- y="105.12623"
- id="text1426-5"><tspan
- sodipodi:role="line"
- id="tspan1424-9"
- x="69.522202"
- y="105.12623"
- style="stroke-width:0.264583">L2</tspan></text>
- </g>
+ style="fill:#87d29d;fill-opacity:1;stroke:#00000d;stroke-width:0.251881;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect839-7-87-5"
+ width="6.2434883"
+ height="9.1511784"
+ x="21.400665"
+ y="32.284355" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.20714px;line-height:1.25;font-family:'Noto Mono';-inkscape-font-specification:'Noto Mono';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0905357"
+ x="23.074785"
+ y="37.291107"
+ id="text931-8-1-0"><tspan
+ sodipodi:role="line"
+ id="tspan929-6-7-9"
+ x="23.074785"
+ y="37.291107"
+ style="stroke-width:0.0905357">Core</tspan></text>
</g>
</g>
</g>
</svg>
diff --git a/src/openmp/figures/detailed_node_architecture_essential.pdf b/src/openmp/figures/detailed_node_architecture_essential.pdf
index 166d729..3fbd569 100644
Binary files a/src/openmp/figures/detailed_node_architecture_essential.pdf and b/src/openmp/figures/detailed_node_architecture_essential.pdf differ
diff --git a/src/openmp/figures/detailed_node_architecture_w_cores.pdf b/src/openmp/figures/detailed_node_architecture_w_cores.pdf
index c1a64eb..d75b92b 100644
Binary files a/src/openmp/figures/detailed_node_architecture_w_cores.pdf and b/src/openmp/figures/detailed_node_architecture_w_cores.pdf differ
diff --git a/src/openmp/figures/detailed_node_architecture_wo_gpus.pdf b/src/openmp/figures/detailed_node_architecture_wo_gpus.pdf
index 232fa67..1376a92 100644
Binary files a/src/openmp/figures/detailed_node_architecture_wo_gpus.pdf and b/src/openmp/figures/detailed_node_architecture_wo_gpus.pdf differ
diff --git a/src/openmp/figures/fork-join.pdf b/src/openmp/figures/fork-join.pdf
new file mode 100644
index 0000000..50857be
Binary files /dev/null and b/src/openmp/figures/fork-join.pdf differ
diff --git a/src/openmp/figures/fork-join.svg b/src/openmp/figures/fork-join.svg
new file mode 100644
index 0000000..e44c8ed
--- /dev/null
+++ b/src/openmp/figures/fork-join.svg
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="6.8636513cm"
+ height="6.4822922cm"
+ viewBox="0 0 68.636514 64.82292"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+ sodipodi:docname="fork-join.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="false"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:lockguides="false"
+ showguides="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="4.1424077"
+ inkscape:cx="9.8976255"
+ inkscape:cy="119.49572"
+ inkscape:window-width="3565"
+ inkscape:window-height="1368"
+ inkscape:window-x="2"
+ inkscape:window-y="34"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ units="cm"
+ width="3.5cm">
+ <inkscape:grid
+ type="xygrid"
+ id="grid1486"
+ originx="-77.687378"
+ originy="-70.114581" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient6286"
+ inkscape:swatch="solid">
+ <stop
+ style="stop-color:#838383;stop-opacity:1;"
+ offset="0"
+ id="stop6284" />
+ </linearGradient>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27.565109,-67.468749)">
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 53.578124,72.760416 V 67.468749"
+ id="path5578" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.652409,132.29167 v -5.29168"
+ id="path5578-74" />
+ <g
+ id="g10640"
+ transform="matrix(0.50000003,0,0,0.50000003,25.135415,66.145831)">
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 56.885417,55.5625 h 15.875001 c 2.116666,0 2.645833,-0.529167 2.645833,-2.645833 l -10e-7,-2.645833"
+ id="path6739-9"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 56.885417,60.854167 V 50.270833"
+ id="path5578-7-6" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 72.760417,31.75 18.520834,1e-6 c 2.116666,0 2.645833,0.529167 2.645833,2.645833 l -10e-7,2.645833"
+ id="path6739-7"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 91.28125,31.75 18.52083,1e-6 c 2.11667,0 2.64583,0.529167 2.64583,2.645833 v 2.645833"
+ id="path6739-7-0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 72.760418,55.5625 18.520834,-10e-7 c 2.116666,0 2.645833,-0.529167 2.645833,-2.645833 l -1e-6,-2.645833"
+ id="path6739-7-3"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 91.281251,55.5625 18.520829,-10e-7 c 2.11667,0 2.64583,-0.529167 2.64583,-2.645833 v -2.645833"
+ id="path6739-7-0-6"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 56.885417,37.041667 V 26.458333"
+ id="path5578-7" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 56.885416,31.75 h 15.875001 c 2.116666,0 2.645833,0.529167 2.645833,2.645833 l -10e-7,2.645833"
+ id="path6739"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 56.885417,37.041667 V 26.458333"
+ id="path5578-7-0" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-5"
+ width="13.229166"
+ height="13.229166"
+ x="50.270836"
+ y="37.041668"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,47.625 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-3"
+ sodipodi:nodetypes="czzcc" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-5-5"
+ width="13.229166"
+ height="13.229166"
+ x="68.791672"
+ y="37.041668"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 75.40625,47.625 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-3-6"
+ sodipodi:nodetypes="czzcc" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-5-2"
+ width="13.229166"
+ height="13.229166"
+ x="87.3125"
+ y="37.041668"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 93.927081,47.625002 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-3-9"
+ sodipodi:nodetypes="czzcc" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-5-1"
+ width="13.229166"
+ height="13.229166"
+ x="105.83334"
+ y="37.041668"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 112.44792,47.624999 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-3-2"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.4325;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.578124,117.73958 h 7.937501 c 1.058334,0 1.322917,-0.26458 1.322917,-1.32291 v -1.32292"
+ id="path6739-9-8"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.578124,120.38543 v -5.29168"
+ id="path5578-7-6-4" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.4325;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 61.515625,105.83334 h 9.260417 c 1.058334,0 1.322917,0.26457 1.322917,1.32291 v 1.32292"
+ id="path6739-7-5"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.4325;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 61.515625,117.73958 h 9.260417 c 1.058335,0 1.322917,-0.26458 1.322917,-1.32291 v -1.32292"
+ id="path6739-7-3-3"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.578124,108.47917 v -5.29168"
+ id="path5578-7-1" />
+ <path
+ style="fill:none;stroke:#636363;stroke-width:0.4325;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.578124,105.83334 h 7.937501 c 1.058333,0 1.322917,0.26457 1.322917,1.32291 v 1.32292"
+ id="path6739-0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#9e9e9e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.578124,108.47917 v -5.29168"
+ id="path5578-7-0-6" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.148566;stroke-opacity:1"
+ id="rect53-5-3"
+ width="6.614583"
+ height="6.614583"
+ x="50.270832"
+ y="108.47917"
+ ry="0.94908273" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 53.578124,113.77083 c 0,-0.46772 -0.396874,-0.56531 -0.396874,-1.05833 0,-0.49302 0.79375,-0.56531 0.79375,-1.05833 0,-0.49302 -0.79375,-0.56532 -0.79375,-1.05833 0,-0.49303 0.396874,-0.45833 0.396874,-0.92605"
+ id="path1796-6-3-20"
+ sodipodi:nodetypes="czzcc" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.148566;stroke-opacity:1"
+ id="rect53-5-5-6"
+ width="6.614583"
+ height="6.614583"
+ x="59.53125"
+ y="108.47917"
+ ry="0.94908273" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 62.838542,113.77083 c 0,-0.46772 -0.396875,-0.56531 -0.396875,-1.05833 0,-0.49302 0.793749,-0.56531 0.793749,-1.05833 0,-0.49302 -0.793749,-0.56532 -0.793749,-1.05833 0,-0.49303 0.396875,-0.45833 0.396875,-0.92605"
+ id="path1796-6-3-6-1"
+ sodipodi:nodetypes="czzcc" />
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.148566;stroke-opacity:1"
+ id="rect53-5-2-5"
+ width="6.614583"
+ height="6.614583"
+ x="68.791664"
+ y="108.47917"
+ ry="0.94908273" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 72.098958,113.77083 c 0,-0.46771 -0.396876,-0.56531 -0.396876,-1.05832 0,-0.49303 0.79375,-0.56532 0.79375,-1.05834 0,-0.49302 -0.79375,-0.56531 -0.79375,-1.05833 0,-0.49303 0.396876,-0.45832 0.396876,-0.92605"
+ id="path1796-6-3-9-5"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 81.359378,113.77083 c 0,-0.46772 -0.396875,-0.56531 -0.396875,-1.05833 0,-0.49302 0.793749,-0.56531 0.793749,-1.05834 0,-0.49301 -0.793749,-0.56531 -0.793749,-1.05832 0,-0.49303 0.396875,-0.45833 0.396875,-0.92605"
+ id="path1796-6-3-2-7"
+ sodipodi:nodetypes="czzcc" />
+ <g
+ id="g10048"
+ transform="matrix(0.50000003,0,0,0.50000003,25.135415,66.145831)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ <g
+ id="g11153"
+ transform="matrix(0.50000003,0,0,0.50000003,25.135415,66.145831)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 75.40625,71.437501 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-6"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 93.927084,71.437501 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-9"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 112.44792,71.4375 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-94"
+ sodipodi:nodetypes="czzcc" />
+ <g
+ id="g10048-2"
+ transform="translate(-3.3333334e-7,47.625)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-6"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ </g>
+ <g
+ id="g11153-3"
+ transform="matrix(0.50000003,0,0,0.50000003,25.135415,89.958334)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 75.40625,71.437501 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-6-7"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 93.927084,71.437501 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-9-4"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 112.44792,71.4375 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-94-5"
+ sodipodi:nodetypes="czzcc" />
+ <g
+ id="g10048-2-2"
+ transform="translate(-3.3333334e-7,47.625)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-6-5"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-1-4"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="33.27536"
+ y="89.289124"
+ id="text13353"><tspan
+ sodipodi:role="line"
+ id="tspan13351"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="33.27536"
+ y="89.289124">Parallel</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="33.27536"
+ y="113.10163"
+ id="text13353-4"><tspan
+ sodipodi:role="line"
+ id="tspan13351-3"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="33.27536"
+ y="113.10163">Parallel</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="27.332565"
+ y="77.040947"
+ id="text18933"><tspan
+ sodipodi:role="line"
+ id="tspan18931"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="27.332565"
+ y="77.040947">Sequential</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="89.185684"
+ y="94.899818"
+ id="text13353-8"><tspan
+ sodipodi:role="line"
+ id="tspan13351-8"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="89.185684"
+ y="94.899818">Join</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="88.65686"
+ y="82.651642"
+ id="text18933-4"><tspan
+ sodipodi:role="line"
+ id="tspan18931-3"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="88.65686"
+ y="82.651642">Fork</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="27.332565"
+ y="100.85345"
+ id="text18933-0"><tspan
+ sodipodi:role="line"
+ id="tspan18931-7"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="27.332565"
+ y="100.85345">Sequential</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:3.52778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="27.332565"
+ y="124.66595"
+ id="text18933-8"><tspan
+ sodipodi:role="line"
+ id="tspan18931-6"
+ style="font-size:3.52778px;stroke-width:0.264583"
+ x="27.332565"
+ y="124.66595">Sequential</tspan></text>
+ </g>
+</svg>
diff --git a/src/openmp/figures/omp-thread.pdf b/src/openmp/figures/omp-thread.pdf
new file mode 100644
index 0000000..8fd6a55
--- /dev/null
+++ b/src/openmp/figures/omp-thread.pdf
@@ -0,0 +1,69 @@
+%PDF-1.5
+%µí®û
+4 0 obj
+<< /Length 5 0 R
+ /Filter /FlateDecode
+>>
+stream
+xœeQ=O1 Ýý+<#aì$—• ‰¡0"¤"tZþ>Nì«ZÐél?û=;qY¿[Q#¤ˆDÁ~€#0ñ’dŠ•cÁôO{¼{gÜOùóƒÖRPmÀÍ=êÿ¯ošeü€„OxD™T³: õVP2…âhE)TòV”J-«£tŽMÛ‚«×3Õä›óää8èÞÂájÝÁ¡Ï½:ÄTwG&^·Ú<Ù0UpÐñóÏUïop§ËeÑ]ý[K£¥f”ÅÉ#Õ±R‰”¹m ø‡úD†Ó‡„áÕ ö2ªÃ2©¦+-óUÇ4XàçHÔÄÃ8mǽÌ~^oÃ
+endstream
+endobj
+5 0 obj
+ 258
+endobj
+3 0 obj
+<<
+ /ExtGState <<
+ /a0 << /CA 1 /ca 1 >>
+ >>
+>>
+endobj
+2 0 obj
+<< /Type /Page % 1
+ /Parent 1 0 R
+ /MediaBox [ 0 0 19.171131 19.171131 ]
+ /Contents 4 0 R
+ /Group <<
+ /Type /Group
+ /S /Transparency
+ /I true
+ /CS /DeviceRGB
+ >>
+ /Resources 3 0 R
+>>
+endobj
+1 0 obj
+<< /Type /Pages
+ /Kids [ 2 0 R ]
+ /Count 1
+>>
+endobj
+6 0 obj
+<< /Producer (cairo 1.16.0 (https://cairographics.org))
+ /Creator <FEFF0049006E006B0073006300610070006500200031002E0031002E00310020002800680074007400700073003A002F002F0069006E006B00730063006100700065002E006F007200670029>
+ /CreationDate (D:20211108133332+01'00)
+>>
+endobj
+7 0 obj
+<< /Type /Catalog
+ /Pages 1 0 R
+>>
+endobj
+xref
+0 8
+0000000000 65535 f
+0000000674 00000 n
+0000000444 00000 n
+0000000372 00000 n
+0000000015 00000 n
+0000000350 00000 n
+0000000739 00000 n
+0000001022 00000 n
+trailer
+<< /Size 8
+ /Root 7 0 R
+ /Info 6 0 R
+>>
+startxref
+1074
+%%EOF
diff --git a/src/openmp/figures/omp-thread.svg b/src/openmp/figures/omp-thread.svg
new file mode 100644
index 0000000..6e82c04
--- /dev/null
+++ b/src/openmp/figures/omp-thread.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="6.7631493mm"
+ height="6.7631493mm"
+ viewBox="0 0 6.7631493 6.7631493"
+ version="1.1"
+ id="svg29073"
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+ sodipodi:docname="omp-thread.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview29075"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:document-units="mm"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="5.12"
+ inkscape:cx="-48.730469"
+ inkscape:cy="22.460938"
+ inkscape:window-width="1782"
+ inkscape:window-height="1368"
+ inkscape:window-x="1785"
+ inkscape:window-y="34"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs29070" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-1904.6139,2456.3523)">
+ <g
+ id="g10048"
+ transform="matrix(0.50000003,0,0,0.50000003,-445.39891,54.030679)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ <g
+ id="g10048-1"
+ transform="matrix(0.50000003,0,0,0.50000003,1879.5528,-2462.8926)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53-4"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6-9"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ </g>
+</svg>
diff --git a/src/openmp/figures/thread.pdf b/src/openmp/figures/thread.pdf
new file mode 100644
index 0000000..a1fbe9e
--- /dev/null
+++ b/src/openmp/figures/thread.pdf
@@ -0,0 +1,70 @@
+%PDF-1.5
+%µí®û
+4 0 obj
+<< /Length 5 0 R
+ /Filter /FlateDecode
+>>
+stream
+xœUŽK
+A D÷9E]À˜L÷ôç‚àbt).dA˜ÅàÂë›þ (MWòH¥ˆBìíÔD3kTuŠy¡•¤NÎìï‚盄]Eí¿èzƒ°àA'¬ÐºÑÔ"2)@GT± £ã”û ‚ä †jœ7N:”b7Q©ÅÚвšµc¬Ö¶"Ã_¢/.êwxÎÚ[WuÆMôcÎ4Œ
+endstream
+endobj
+5 0 obj
+ 159
+endobj
+3 0 obj
+<<
+ /ExtGState <<
+ /a0 << /CA 1 /ca 1 >>
+ >>
+>>
+endobj
+2 0 obj
+<< /Type /Page % 1
+ /Parent 1 0 R
+ /MediaBox [ 0 0 19.171131 19.171131 ]
+ /Contents 4 0 R
+ /Group <<
+ /Type /Group
+ /S /Transparency
+ /I true
+ /CS /DeviceRGB
+ >>
+ /Resources 3 0 R
+>>
+endobj
+1 0 obj
+<< /Type /Pages
+ /Kids [ 2 0 R ]
+ /Count 1
+>>
+endobj
+6 0 obj
+<< /Producer (cairo 1.16.0 (https://cairographics.org))
+ /Creator <FEFF0049006E006B0073006300610070006500200031002E0031002E00310020002800680074007400700073003A002F002F0069006E006B00730063006100700065002E006F007200670029>
+ /CreationDate (D:20211108133233+01'00)
+>>
+endobj
+7 0 obj
+<< /Type /Catalog
+ /Pages 1 0 R
+>>
+endobj
+xref
+0 8
+0000000000 65535 f
+0000000575 00000 n
+0000000345 00000 n
+0000000273 00000 n
+0000000015 00000 n
+0000000251 00000 n
+0000000640 00000 n
+0000000923 00000 n
+trailer
+<< /Size 8
+ /Root 7 0 R
+ /Info 6 0 R
+>>
+startxref
+975
+%%EOF
diff --git a/src/openmp/figures/thread.svg b/src/openmp/figures/thread.svg
new file mode 100644
index 0000000..ff71e0d
--- /dev/null
+++ b/src/openmp/figures/thread.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="6.7631493mm"
+ height="6.7631493mm"
+ viewBox="0 0 6.7631493 6.7631493"
+ version="1.1"
+ id="svg29073"
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+ sodipodi:docname="thread.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview29075"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:document-units="mm"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="5.12"
+ inkscape:cx="-48.730469"
+ inkscape:cy="22.460938"
+ inkscape:window-width="1782"
+ inkscape:window-height="1368"
+ inkscape:window-x="1785"
+ inkscape:window-y="34"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs29070" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-1904.6139,2456.3523)">
+ <g
+ id="g10048"
+ transform="matrix(0.50000003,0,0,0.50000003,-445.39891,54.030679)">
+ <rect
+ style="fill:#0e61cd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.297132;stroke-opacity:1"
+ id="rect53"
+ width="13.229166"
+ height="13.229166"
+ x="50.270832"
+ y="13.229167"
+ ry="1.8981653" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 56.885417,23.8125 c 0,-0.935443 -0.79375,-1.130622 -0.79375,-2.116666 0,-0.986044 1.5875,-1.130623 1.5875,-2.116667 0,-0.986044 -1.5875,-1.130623 -1.5875,-2.116667 0,-0.986044 0.79375,-0.91664 0.79375,-1.852083"
+ id="path1796-6"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.132292px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1907.9955,-2450.9863 c 0,-0.4678 -0.3969,-0.5654 -0.3969,-1.0584 0,-0.493 0.7938,-0.5653 0.7938,-1.0583 0,-0.493 -0.7938,-0.5653 -0.7938,-1.0583 0,-0.4931 0.3969,-0.4584 0.3969,-0.9261"
+ id="path1796-6-9"
+ sodipodi:nodetypes="czzcc" />
+ </g>
+</svg>
diff --git a/src/openmp/openmp.tex b/src/openmp/openmp.tex
index fec8028..e6f07d4 100644
--- a/src/openmp/openmp.tex
+++ b/src/openmp/openmp.tex
@@ -1,1875 +1,1614 @@
\renewcommand{\FIGREP}{src/openmp/figures}
\section{OpenMP}
\label{sec:openmp}
\intersec{fidis}
\subsection{Task parallelism}
\label{sec:task_parallelism}
\begin{frame}
\frametitle{Goal of this section}
\framesubtitle{}
\begin{itemize}
\item Understand the context of shared memory
\item Understand more in detail the architecture of a node
\item Get familiar with the OpenMP execution and memory model
\item Getting some speedup with Task parallelism
\end{itemize}
\end{frame}
-\begin{frame}
- \frametitle{Node architecture}
- \framesubtitle{NUMA node}
-
- \onslide<1>\addimage{\FIGREP/detailed_node_architecture}{7.5cm}{4.75cm}{1.2cm}
- \onslide<2>\addimage{\FIGREP/detailed_node_architecture_wo_gpus}{7.5cm}{4.75cm}{1.2cm}
- \onslide<3>\addimage{\FIGREP/detailed_node_architecture_w_cores}{7.5cm}{4.75cm}{1.2cm}
- \onslide<4>\addimage{\FIGREP/detailed_node_architecture_essential}{7.5cm}{4.75cm}{1.2cm}
-
- \note{}
-\end{frame}
-
-
\subsection{Introduction}
\label{sec:openmp:introduction}
\begin{frame}
\frametitle{Releases history, present and future}
\framesubtitle{}
\begin{itemize}
\item{October 1997: Fortran version 1.0 }
\item{Late 1998: C/C++ version 1.0 }
\item{June 2000: Fortran version 2.0 }
\item{April 2002: C/C++ version 2.0 }
\item{June 2005: Combined C/C++ and Fortran version 2.5}
\item{May 2008: Combined C/C++ and Fortran version 3.0}
\item{\textbf{July 2011: Combined C/C++ and Fortran version 3.1}}
\item{July 2013: Combined C/C++ and Fortran version 4.0}
\item{November 2015: Combined C/C++ and Fo version 4.5}
\item{November 2018: Combined C/C++ and Fortran version 5.0}
\item{November 2020: Combined C/C++ and Fortran version 5.1}
\end{itemize}
\addimage{\FIGREP/logo_OpenMP.png}{5cm}{10cm}{5cm}
\end{frame}
\begin{frame}
\frametitle{Terminology}
\framesubtitle{Selected extract of the specification}
\begin{itemize}
\item Specification:
\begin{itemize}
\item \href{https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-1.pdf}{Full specification}
\item \href{https://www.openmp.org/wp-content/uploads/OpenMPRefCard-5.1-web.pdf}{RefCard}
\end{itemize}
-
- \item[thread] an execution entity with a stack and a static memory (\textit{threadprivate memory})
- \item[OpenMP thread] a \textit{thread} managed by the OpenMP runtime
- \item[processor] an hardware unit on which one or more \textit{OpenMP thread} can execute
- \item[directive] a base language mechanism to specify OpenMP program behavior
- \item[construct] an OpenMP executable directive and the associated
- statement, loop nest or structured block, if any, not including the
- code in any called routines. That is, the lexical extent of an
- executable directive.
+ \item Terms:
+ \begin{description}
+ \item[thread] an execution entity with a stack \\
+ and a static memory (\textit{threadprivate memory})
+ \addimage{\FIGREP/thread}{}{11cm}{4.4cm}
+ \item[OpenMP thread] a \textit{thread} managed by the OpenMP runtime\\
+ \vspace{1em}
+ \addimage{\FIGREP/omp-thread}{}{11cm}{3.6cm}
+ \item[processor] an hardware unit on which one or more \textit{OpenMP thread} can execute
+ \item[directive] a base language mechanism to specify OpenMP program behavior
+ \item[construct] an OpenMP executable directive and the associated
+ statement, loop nest or structured block, if any, not including the
+ code in any called routines. That is, the lexical extent of an
+ executable directive.
+ \end{description}
\end{itemize}
\end{frame}
+
+\begin{frame}
+ \frametitle{Memory Model}
+ \framesubtitle{Shared memory}
+
+ \onslide<1>\addimage{\FIGREP/detailed_node_architecture}{7.5cm}{4.75cm}{1.2cm}
+ \onslide<2>\addimage{\FIGREP/detailed_node_architecture_wo_gpus}{7.5cm}{4.75cm}{1.2cm}
+ \onslide<3>\addimage{\FIGREP/detailed_node_architecture_w_cores}{7.5cm}{4.75cm}{1.2cm}
+ \onslide<4>\addimage{\FIGREP/detailed_node_architecture_essential}{7.5cm}{4.75cm}{1.2cm}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Execution Model}
+ \framesubtitle{Fork/join}
+
+ \onslide<1>\addimage{\FIGREP/fork-join}{}{4.75cm}{1.2cm}
+\end{frame}
+
+
\begin{frame}[fragile]
- \frametitle{Syntax in C/C++}
+ \frametitle{Compiling an OpenMP code}
\framesubtitle{pragmas and compilation}
\begin{itemize}
\item OpenMP directives are written as pragmas: \cxxinline{#pragma omp}
\item Use the conditional compilation flag \cxxinline{#if defined _OPENMP} for the preprocessor
\end{itemize}
\hspace{2cm}
\pause
\begin{itemize}
\item Compilation using the GNU compiler:
\begin{bashcode}
$> g++ -fopenmp ex1.c -o ex1
\end{bashcode}%$
\item Compilation using the Intel compiler:
\begin{bashcode}
$> i++ -qopenmp ex1.c -o ex1
\end{bashcode}%$
\end{itemize}
\end{frame}
-% \begin{frame}
-% \frametitle{Syntax in Fortran 90}
-% % \begin{itemize}
-% % \item{OpenMP directives are written as comments: \texttt{!\$omp omp}}
-% % \item{Sentinels \texttt{!\$} are authorized for conditional compilation (preprocessor) }
-% % \end{itemize}
-
-% \begin{block}{}
-% OpenMP directives are written as comments: \texttt{!\$omp omp}
-% \end{block}
-% \begin{block}{}
-% Sentinels \texttt{!\$} are authorized for conditional compilation (preprocessor)
-% \end{block}
-
-
-% Compilation using the GNU gfortran compiler:
-% \begin{verbatim}
-% gfortran -fopenmp ex1.f90 -o ex1
-% \end{verbatim}
-% Compilation using the Intel Fortran compiler:
-% \begin{verbatim}
-% ifort -qopenmp ex1.f90 -o ex1
-% \end{verbatim}
-% \end{frame}
-
-
\begin{frame}[fragile]
\frametitle{Hello World in C++}
\framesubtitle{Simple version}
\centering
\cxxfile[title={openmp/hello.cc}]{examples/openmp/hello.cc}
\pause
\begin{consoleoutput}
$ OMP_NUM_THREADS=4 ../build/openmp/hello
Hello from thread 2 out of 4
Hello from thread 1 out of 4
Hello from thread 0 out of 4
Hello from thread 3 out of 4
\end{consoleoutput} %$
\end{frame}
\begin{frame}[fragile]
\frametitle{Hello World in C++}
\framesubtitle{With condition compilation}
\centering
\cxxfile[%
title={openmp/hello\_cond.cc},
minted options app={
firstline=6,
}]{examples/openmp/hello_cond.cc}
\end{frame}
\begin{frame}[fragile]
\frametitle{Number of concurrent threads}
\begin{itemize}
\item Default implementation dependent (usually max hardware thread)
\item At runtime in the code
\begin{cxxcode}{}
omp_set_num_threads(nthreads);
\end{cxxcode}
\item With en environment variable
\begin{bashcode}
$> export OMP_NUM_THREADS=4
\end{bashcode}%$
\end{itemize}
-
\end{frame}
-
-% \begin{frame}[containsverbatim]
-% \frametitle{Components of OpenMP}
-% \begin{itemize}
-% \item{Compiler directives (written as comments) that allow work sharing, synchronization and data scoping}
-% \item{A runtime library (libomp.so) that contains informal, data access and synchronization directives}
-% \item{Environment variables}
-% \end{itemize}
-% \end{frame}
-
-
-% \subsubsection{The \texttt{parallel} construct}
-
+\subsection{The \texttt{parallel} construct}
\begin{frame}[fragile]
\frametitle{The \texttt{parallel} construct}
This is the mother of all constructs in OpenMP. It starts a parallel execution.
\begin{cxxcode}{Syntax}
#pragma omp parallel [clause[[,] clause]...]
{
|\emph{structured-block}|
}
\end{cxxcode}
where \textit{clause} is one of the following:
\begin{itemize}
\item \code{if} or \code{num\_threads} : conditional clause
\item \code{default(private | firstprivate | shared | none)} : default data scoping
\item \code{private(\textit{list})}, \code{firstprivate(\textit{list})},
\code{shared(\textit{list})} or \code{copyin(\textit{list})} : data
scoping
\item \code{reduction(\textit{operator}$\,$:$\,$\textit{list})}
\end{itemize}
\end{frame}
\begin{frame}[fragile,exercise]
\frametitle{Hello $\pi$}
\framesubtitle{}
\begin{itemize}
\item In the \texttt{pi.cc} add a function call to get the number of
threads.
\item Compile using the porper options for OpenMP
\item Test that it works by varying the number of threads \code{export
OMP\_NUM\_THREADS}
\item To vary the number of threads in a \texttt{\bf sbatch} job you can set
the number of threads to the number of cpus per task.
\begin{bashcode}
#!/bin/bash
#SBATCH -c <nthreads>
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
<my_openmp_executable>
\end{bashcode} %$
\end{itemize}
\end{frame}
-\subsubsection{worksharing constructs ("subsubsections", "single", "workshare")}
+\subsection{worksharing constructs ("subsubsections", "single", "workshare")}
\begin{frame}[fragile]
\frametitle{Worksharing constructs}
Work-sharing constructs are possible in three ``flavours'' :
\begin{itemize}
\item \code{sections} construct
\item \code{single} construct
\item \code{workshare} construct (only in Fortran)
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Worksharing constructs}
\framesubtitle{The \code{sections} construct}
\begin{cxxcode}{Syntax}
#pragma omp [parallel] sections [clause]
{
#pragma omp section
{
code_block
}
}
\end{cxxcode}
where \textit{clause} is one of the following:
\begin{itemize}
\item \code{private(\textit{list})}, \code{firstprivate(\textit{list})},
\code{lastprivate(\textit{list})}
\item \code{reduction(\textit{operator} : \textit{list})}
\item Each \code{section} within a \code{sections} construct is assigned to
one and only one thread
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{A \texttt{sections} construct}
\framesubtitle{Example}
\centering
\cxxfile[%
title={openmp/sections.cc},
minted options app={
firstline=6,
lastline=14,
}]{examples/openmp/sections.cc}
\pause
\begin{consoleoutput}
$ ../build/openmp/sections
Thread 0 handling section 1
Thread 1 handling section 2
Thread 2 handling section 3
\end{consoleoutput} %$
\end{frame}
\begin{frame}[fragile]
\frametitle{Worksharing constructs}
\framesubtitle{The \code{single} construct}
Only one thread (usualy the first entering thread) executes the
\code{single} region.
\begin{cxxcode}{Syntax}
#pragma omp single [clause[[,] clause] ...]
{
|\emph{structured-block}|
}
\end{cxxcode}
where \textit{clause} is one of the following:
\begin{itemize}
\item \code{private(\textit{list})}, \code{firstprivate(\textit{list})}
\item \code{nowait}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{The \texttt{master} construct}
\framesubtitle{Deprecated}
Only the master thread execute the section. It can be used in any OpenMP construct
\begin{cxxcode}{Syntax}
#pragma omp master
{
|\emph{structured-block}|
}
\end{cxxcode}
\end{frame}
-\subsubsection[Loops]{loops}
+\subsection[Loops]{The Worksharing-loop construct}
+
\begin{frame}[fragile]
- \frametitle{The Worksharing-loop construct }
+ \frametitle{The Worksharing-loop construct}
\framesubtitle{The \code{for} construct}
Parallelization of the following loop
\begin{cxxcode}{Syntax}
#pragma omp for [clause[[,] clause] ... ]
{
|\emph{for-loop}|
}
\end{cxxcode}
where \textit{clause} is one of the following:
\begin{itemize}
\item \code{schedule(\textit{kind[, chunk\_size]})}
\item \code{collapse(\textit{n})}
\item \code{ordered}
\item \code{private(\textit{list})}, \code{firstprivate(\textit{list})},
\code{lastprivate(\textit{list})}
% \item \code{reduction(\textit{operator}\,:\,\textit{list})}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Example of \code{for} construct}
\centering
\cxxfile[title={openmp/for.cc}, minted options app={
firstline=6,
lastline=13,
}]{examples/openmp/for.cc}
\pause
\begin{consoleoutput}
$ ../build/openmp/for
Thread 0 handling i=0
Thread 0 handling i=1
Thread 0 handling i=2
Thread 1 handling i=3
Thread 1 handling i=4
Thread 1 handling i=5
\end{consoleoutput} %$
\end{frame}
\begin{frame}[fragile,exercise]
\frametitle{Compute $\pi$ in parallel}
\framesubtitle{First try at parallel code}
\begin{itemize}
\item Add a \code{parallel for} work sharing construct around the integral
computation
\item Run the code
\item Run the code
\item Run the code
\item What can you observe on the value of $\pi$ ?
\end{itemize}
\end{frame}
+\subsection{The Synchronization constructs}
+
\begin{frame}[fragile]
\frametitle{The Synchronization constructs}
\framesubtitle{The \code{critical} construct}
Restricts execution of the associated structured block to a single thread at a time.
\begin{cxxcode}{Syntax}
#pragma omp critical [(name) [[,] |\textbf{hint}|(hint-expression)]]
{
|\emph{structured-block}|
}
\end{cxxcode}
\begin{itemize}
\item \code{name} optional to identify the construct
\item \code{hint-expression} information on the expected execution
\begin{itemize}
\item \cxxinline{omp_sync_hint_none}
\item \cxxinline{omp_sync_hint_uncontended}
\item \cxxinline{omp_sync_hint_contended}
\item \cxxinline{omp_sync_hint_nonspeculative}
\item \cxxinline{omp_sync_hint_speculative}
\end{itemize}
% \item \code{reduction(\textit{operator}\,:\,\textit{list})}
\end{itemize}
\end{frame}
\begin{frame}[fragile,exercise]
\frametitle{Compute $\pi$ in parallel}
\framesubtitle{Naive reduction}
\begin{itemize}
\item To solve the raise condition from the previous exercise we can protect
the computation of the sum.
\item Add a \code{critical} directive to protect the sum
\item Run the code
\item What can you observe on the execution time while varying the number of
threads
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{The Synchronization constructs}
\framesubtitle{The \code{barrier} construct}
Specifies an explicit barrier.
\begin{cxxcode}{Syntax}
#pragma omp barrier
\end{cxxcode}
\end{frame}
\begin{frame}[fragile]
\frametitle{The Synchronization constructs}
\framesubtitle{The \code{atomic} construct}
Ensures a specific storage location is accessed atomically.
\begin{cxxcode}{Syntax}
#pragma omp atomic [clause[[,] clause] ... ]
|\emph{statement}|
\end{cxxcode}
where \textit{clause} is one of the following:
\begin{itemize}
\item \emph{atomic-clauses} \code{read}, \code{write}, \code{update}
\item \emph{memory-order-clauses} \code{seq\_cst}, \code{acq\_rel},
\code{releases}, \code{acquire}, \code{relaxed}
\item or one of \code{capture}, \code{compare},
\code{hint(hint-expression)}, \code{fail(seq\_cst | acquire |
relaxed)}, or \code{weak}
\end{itemize}
-
\end{frame}
+\subsection{Data sharing clauses}
+
\begin{frame}[fragile]
\frametitle{Data sharing clauses}
\framesubtitle{What are the variables values}
\begin{itemize}
\item most common source of errors
\item determine which variables are \code{private} to a thread, which are
\code{shared} among all the threads
\item in case of a \code{private} variable
\begin{itemize}
\item \code{firstprivate} defines the value when entering the region
\item \code{lastprivate} defines the value when exiting the region (OpenMP
5.1 in C/C++)
\end{itemize}
\item \code{default(none)} means each variables should appear in a shared or
private list
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Data sharing clauses}
\framesubtitle{\code{shared} and \code{private}}
These attributes determines the scope (visibility) of a single or list of variables
\begin{cxxcode}{Syntax}
shared(list1) private(list2)
\end{cxxcode}
\begin{itemize}
\item The \code{private} attribute : the data is private to each thread and
non-initiatilized. Each thread has its own copy. \cxxinline{#pragma
omp parallel private(i)}
\item The \code{shared} attribute : the data is shared among all the
threads. It is accessible (and non-protected) by all the threads
simultaneously. \cxxinline{#pragma omp parallel shared(array)}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Data sharing clauses}
\framesubtitle{\code{firstprivate} and \code{lastprivate}}
These clauses determines the attributes of the variables within a parallel region:
\begin{cxxcode}{Syntax}
firstprivate(list1) lastprivate(list2)
\end{cxxcode}
\begin{itemize}
\item The \code{firstprivate} like \code{private} but initialized to the value before the parallel region
\item The \code{lastprivate} like \code{private} but the value is updated after the parallel region
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Data sharing clauses}
\framesubtitle{Example}
\centering
\cxxfile[%
title={openmp/private.cc},
minted options app={
firstline=5,
lastline=15,
}]{examples/openmp/private.cc}
\pause
\begin{consoleoutput}
$ ../build/openmp/private
Variable a, b, c: 1, 2, 3 (before)
Variable a, b, c: 0, 2, 3 (inside)
Variable a, b, c: 32527, 2, 3 (inside)
Variable a, b, c: 0, 2, 10 (inside)
Variable a, b, c: 1, 2, 10 (after)
\end{consoleoutput} %$
\end{frame}
\begin{frame}[fragile,exercise]
\frametitle{Compute $\pi$ in parallel}
\framesubtitle{Naive reduction improved}
\begin{itemize}
\item Create a local variable per thread
\item Make each thread compute it's own sum
\item After the computation of the integral us a \code{critical} directive
to sum the local sum to a \code{shared} sum
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Loop clauses}
\framesubtitle{\code{reduction} clause}
\begin{cxxcode}{Syntax}
reduction(|\emph{reduction-identifier : list}|)
\end{cxxcode}
\begin{itemize}
\item \emph{reduction-identifier}: one of the operation \textbf{+},
\textbf{--}, \textbf{*}, \textbf{\&}, \textbf{\textbar}, \textbf{\^},
\textbf{\&\&}, \textbf{\textbar \textbar}
\item \emph{list} item on which the reduction applies
\end{itemize}
\end{frame}
\begin{frame}[fragile,exercise]
\frametitle{Compute $\pi$ in parallel}
\framesubtitle{Naive reduction improved}
\begin{itemize}
\item Use the \code{reduction} clause
\item Compare the timings to the previous versions
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Loop clauses}
\framesubtitle{\code{schedule} clause}
\begin{cxxcode}{Syntax}
schedule([modifier [, modifier] : ] kind [, chunk_size])
\end{cxxcode}
\begin{itemize}
\item \emph{kind}
\begin{itemize}
\item \code{static} iterations divided in chunks sized \code{chunk\_size}
assigned to threads in a round-robin fashion
\item \code{dynamic} iterations divided in chunks sized \code{chunk\_size}
assigned to threads when they request them until no chunk remains to
be distributed
\item \code{guided} iterations divided in chunks sized \code{chunk\_size}
assigned to threads when they request them. Size of chunks is
proportional to the remaining unassigned chunks.
\item \code{auto} The decisions is delegated to the compiler and/or the
runtime system
\item \code{runtime} The decisions is delegated to the runtime system
based on ICV
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Loop clauses}
\framesubtitle{\code{collapse} clause}
\begin{cxxcode}{Syntax}
collapse(|\emph{n}|)
\end{cxxcode}
Specifies how many loop are combine into a logical space
\end{frame}
\begin{frame}[fragile]
\frametitle{Example \code{dgemm}}
\framesubtitle{collapse(1)}
\centering
\cxxfile[title={openmp/dgemm.cc}, minted options app={
- firstline=32,lastline=36
+ firstline=34,lastline=38
}]{examples/openmp/dgemm.cc}
\pause
\begin{consoleoutput}
$ OMP_NUM_THREADS=1 ../build/openmp/dgemm
- DGEMM with 1 threads (collapse(1)): 21.1209 GFLOP/s (verif 2)
+ DGEMM with 1 threads, collapse(1): 21.1209 GFLOP/s (verif 2)
$ OMP_NUM_THREADS=2 ../build/openmp/dgemm
- DGEMM with 2 threads (collapse(1)): 40.2308 GFLOP/s (verif 2)
+ DGEMM with 2 threads, collapse(1): 40.2308 GFLOP/s (verif 2)
$ OMP_NUM_THREADS=4 ../build/openmp/dgemm
- DGEMM with 4 threads (collapse(1)): 72.7659 GFLOP/s (verif 2)
+ DGEMM with 4 threads, collapse(1): 72.7659 GFLOP/s (verif 2)
$ OMP_NUM_THREADS=1 ../build/openmp/dgemm
\end{consoleoutput} %$
\end{frame}
\begin{frame}[fragile]
\frametitle{Example \code{dgemm}}
\framesubtitle{collapse(2)}
\centering
- \cxxfile[title={openmp/dgemm.cc}, minted options app={
- firstline=32,lastline=36
- }]{examples/openmp/dgemm.cc}
-
\begin{consoleoutput}
- DGEMM with 1 threads (collapse(2)): 20.358 GFLOP/s (verif 2)
+ DGEMM with 1 threads, collapse(2): 20.358 GFLOP/s (verif 2)
$ OMP_NUM_THREADS=2 ../build/openmp/dgemm
- DGEMM with 2 threads (collapse(2)): 40.0818 GFLOP/s (verif 2)
+ DGEMM with 2 threads, collapse(2): 40.0818 GFLOP/s (verif 2)
$ OMP_NUM_THREADS=4 ../build/openmp/dgemm
- DGEMM with 4 threads (collapse(2)): 72.4462 GFLOP/s (verif 2)
+ DGEMM with 4 threads, collapse(2): 72.4462 GFLOP/s (verif 2)
\end{consoleoutput} %$
\end{frame}
-% \begin{frame}[containsverbatim]
-% \frametitle{The \texttt{reduction(...)} clause (Exercise)}
-% \begin{block}{How to deal with}
-% \begin{verbatim}
-% vec = (int*) malloc (size_vec*sizeof(int));
-% global_sum = 0;
-% for (i=0;i<size_vec;i++){
-% global_sum += vec[i];
-% }
-% \end{verbatim}
-% \end{block}
-
-% \vspace{-.5cm}
-% \begin{block}{A solution with the \texttt{reduction(...)} clause}
-
-% \begin{verbatim}
-% vec = (int*) malloc (size_vec*sizeof(int));
-% global_sum = 0;
-% #pragma omp parallel for reduction(+:global_sum)
-% for (i=0;i<size_vec;i++){
-% global_sum += vec[i];
-% }
-% \end{verbatim}
-% But other solutions exist !
-% \end{block}
-% \end{frame}
-
-
-% \begin{frame}[containsverbatim]
-% \frametitle{The \texttt{schedule} clause}
-
-% \begin{block}{}
-% Load-balancing
-% \end{block}
-
-% \begin{center}
-% \begin{tabular}{|l|l|}
-% \hline
-% \textbf{clause} & \textbf{behavior} \\
-% \hline
-% \hline
-% \textit{schedule(static [, chunk\_size])} &
-% iterations divided in chunks sized \\
-% & \textit{chunk\_size} assigned to threads in \\
-% & a round-robin fashion. \\
-% & If \textit{chunk\_size} not specified \\
-% & system decides. \\
-% \hline
-
-% \textit{schedule(dynamic [, chunk\_size])} &
-% iterations divided in chunks sized \\
-% & \textit{chunk\_size} assigned to threads \\
-% & when they request them until no \\
-% & chunk remains to be distributed. \\
-% & If \textit{chunk\_size} not specified \\
-% & default is 1. \\
-
-% \hline
-% \end{tabular}
-% \end{center}
-
-% \end{frame}
-
-
-% \begin{frame}[containsverbatim]
-% \frametitle{The \texttt{schedule} clause}
-
-% \begin{center}
-% \begin{tabular}{|l|l|}
-% \hline
-% \textbf{clause} & \textbf{behavior} \\
-% \hline
-% \hline
-% \textit{schedule(guided [, chunk\_size])} &
-% iterations divided in chunks sized \\
-% & \textit{chunk\_size} assigned to threads \\
-% & when they request them. Size of \\
-% & chunks is proportional to the \\
-% & remaining unassigned chunks. \\
-% % & If \textit{chunk\_size} not specified \\
-% % & default is 1. \\
-% & By default the chunk size is approx \\
-% & loop$\_$count/number$\_$of$\_$threads. \\
-
-% % By default the chunk size is approximately
-
-
-% \hline
-% \textit{schedule(auto)} &
-% The decisions is delegated to the \\
-% & compiler and/or the runtime system \\
-
-% \hline
-% \textit{schedule(runtime)} &
-% The decisions is delegated to the \\
-% & runtime system \\
-
-
-% \hline
-% \end{tabular}
-% \end{center}
-
-% \end{frame}
-
-
-% \begin{frame}
-% \frametitle{The \texttt{schedule} clause}
-% \begin{center}
-% {\input{day1/images/schedule-decision.tex}}
-% \end{center}
-% \end{frame}
-
-
-% \begin{frame}[containsverbatim]
-% \frametitle{A parallel \texttt{for} example}
-
-
-% \begin{block}{How to...}
-% ... parallelize the dense matrix multiplication $C = A B$ (triple for loop $C_{ij} = C_{ij} + A_{ik} B_{kj}$). What happens using different \texttt{schedule} clauses ?)
-% \end{block}
-
-% \end{frame}
-
-
-% \begin{frame}[containsverbatim]
-% \frametitle{A parallel \texttt{for} example}
-% \begin{lstlisting}[language=C,frame=lines]
-% #pragma omp parallel shared(A,B,C) private(i,j,k,myrank)
-% {
-% myrank=omp_get_thread_num();
-% mysize=omp_get_num_threads();
-% chunk=(N/mysize);
-% #pragma omp for schedule(static, chunk)
-% for (i=0;i<N;i++){
-% for (j=0;j<N;j++){
-% for (k=0;k<N;k++){
-% C[i][j]=C[i][j] + A[i][k]*B[k][j];
-% }
-% }
-% }
-% }
-% \end{lstlisting}
-% % Loop order is important !
-% \end{frame}
-
-% \begin{frame}[containsverbatim]
-% \frametitle{A parallel \texttt{for} example}
-
-% \begin{verbatim}
-% vkeller@mathicsepc13:~$ export OMP_NUM_THREADS=1
-% vkeller@mathicsepc13:~$ ./a.out
-% [DGEMM] Compute time [s] : 0.33388209342956
-% [DGEMM] Performance [GF/s]: 0.59901385529736
-% [DGEMM] Verification : 2000000000.00000
-% vkeller@mathicsepc13:~$ export OMP_NUM_THREADS=2
-% vkeller@mathicsepc13:~$ ./a.out
-% [DGEMM] Compute time [s] : 0.18277192115783
-% [DGEMM] Performance [GF/s]: 1.09425998661625
-% [DGEMM] Verification : 2000000000.00000
-% vkeller@mathicsepc13:~$ export OMP_NUM_THREADS=4
-% vkeller@mathicsepc13:~$ ./a.out
-% [DGEMM] Compute time [s] : 9.17780399322509E-002
-% [DGEMM] Performance [GF/s]: 2.17917053085506
-% [DGEMM] Verification : 2000000000.00000
-% \end{verbatim}
-
-% \end{frame}
-
-
-
-
-% \begin{frame}
-% \frametitle{The \texttt{collapse} clause}
-
-% \begin{block}{Intel view}
-% Use the collapse clause to increase the total number of iterations that will be partitioned across the available number of OMP threads by reducing the granularity of work to be done by each thread.
-
-% You can improve performance by avoiding use of the collapsed-loop indices (if possible) inside the collapse loop-nest (since the compiler has to recreate them from the collapsed loop-indices using divide/mod operations AND the uses are complicated enough that they don't get dead-code-eliminated as part of compiler optimizations)
-% \end{block}
-
-% \end{frame}
-
-% \begin{frame}[containsverbatim]
-% \frametitle{A \texttt{collapse} directive example}
-
-% \begin{lstlisting}[language=C,frame=lines]
-% #pragma omp parallel for collapse(2) shared(A) private(k,l)
-% for (k=0;k<kmax;k++) {
-% for (l=0;l<lmax;l++){
-% do_some_work(&A,k,l,N);
-% }
-% }
-% \end{lstlisting}
-% where \texttt{do\_some\_work(A,k,l,N)} looks like:
-% \begin{lstlisting}[language=C,frame=lines]
-% for(i=0;i<N;i++) {
-% for (j=0;j<N;j++) {
-% A[i][j] = A[i][j]*s+A[i][j]*t
-% }
-% }
-% \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[containsverbatim]
-% \frametitle{A \texttt{collapse} directive example [output]}
-% \begin{block}{}
-% Here we compare the collapsed result with the standard parallel loop (on \texttt{k})
-% \end{block}
-
-% \begin{table}
-% \begin{center}
-% \begin{tabular}{|l|l|l|l|l|l|}
-% \hline
-% \textbf{OMP\_NUM\_THREADS} & \textbf{1} & \textbf{2} & \textbf{4} & \textbf{8} & \textbf{16}\\
-% \hline
-% \hline
-% standard // loop &2.17 &1.69 &1.69 &1.44 &1.22 \\
-% \hline
-% collapsed(2) // loop &2.13 &1.60 &1.02 &0.83 &0.70 \\
-% \hline
-% \end{tabular}
-% \end{center}
-% \caption{\texttt{N=20000}, time is in seconds}
-% \end{table}
-
-% \begin{block}{Remark}
-% It is mandatory that the \textit{\texttt{n-}}collapsed loops are perfectly nested and with a rectangular shape (nothing like \texttt{do i=1,N ... do j=1,f(i)}) and that their upper limits are ``small''.
-% \end{block}
-
-
-
-% \end{frame}
-
-
% \subsubsection{tasking constucts ("task", "taskyield")}
% \begin{frame}[containsverbatim]
% \frametitle{The \texttt{task} directive}
% \begin{center}
% {\input{day1/images/Fork_join.tex}}
% \end{center}
% Source : wikipedia.org
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{The \texttt{task} directive}
% \begin{exampleblock}{What is an OpenMP task ?}
% \begin{itemize}
% \item{Offers a solution to parallelize irregular problems (unbounded loops, recursives, master/slave schemes, etc..)}
% \item{OpenMP tasks are composed of
% \begin{itemize}
% \item{\textbf{code} : what will be executed}
% \item{\textbf{data} : initialized at task creation time }
% \item{\textbf{ICV's} : Internal Control Variables }
% \end{itemize}
% }
% \end{itemize}
% \end{exampleblock}
% \begin{exampleblock}{Synchronization}
% \begin{itemize}
% \item{All tasks created by a thread of a team are garanteed to be completed at
% thread exit (end of block)}
% \item{Within a task group, it is possible to synchronize through \texttt{\#pragma
% omp taskwait}}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{The \texttt{task} directive}
% \begin{exampleblock}{Syntax}
% \begin{lstlisting}[language=C,frame=lines]
% #pragma omp task [clause[[,] clause] ...]
% {
% structured-block
% }
% \end{lstlisting}
% where \textit{clause} is one of the following:
% \begin{itemize}
% \item{\code{if(\textit{scalar-logical-expression})}}
% \item{\code{final(\textit{scalar-logical-expression})}}
% \item{\code{untied}}
% \item{\code{default (private | firstprivate | shared | none)}}
% \item{\code{mergeable}}
% \item{\code{private(\textit{list})}, \code{firstprivate(\textit{list})}, \code{shared(\textit{list})}}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{The \texttt{task} directive}
% \begin{exampleblock}{Execution model}
% \begin{itemize}
% \item{A task \texttt{t} is executed by the thread \texttt{T} of the team that generated it. Immediately or not (depends on the implementation)}
% \item{A thread \texttt{T} can suspend/resume/restart a task \texttt{t}}
% \item{Tasks are \textbf{tied} by default:
% \begin{itemize}
% \item{tied tasks are executed by the same thread}
% \item{tied tasks have scheduling restrictions (deterministic creation, synchronization, destruction)}
% \end{itemize}
% }
% \item{It is possible to untie tasks with the directive \texttt{untied}}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive (stupid) example}
% You probably know this popular example to compute the \texttt{n} first Fibonacci numbers (Fib = [1,1,2,3,5,8,13,21,34,..]):
% \begin{columns}
% % \begin{column}[l]{7cm}
% \begin{column}{7cm}
% \begin{lstlisting}[language=C,frame=lines]
-% int fibonacci(int n){
+% int fibonacci(int n)
% int x,y;
% if (n < 2) {
% return n;
% } else {
% x = fibonacci(n-1);
% y = fibonacci(n-2);
% return (x+y);
% }
% }
% \end{lstlisting}
% \end{column}
% \begin{column}[c]{3cm}
% {\includegraphics[height=4cm]{day1/images/Fibonacci.jpg}}
% \end{column}
% \end{columns}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive (stupid) example (Exercise)}
% \begin{block}{Idea}
% The idea is using the {\tt \#pragma omp tasks} construct by spawning a new task whenever the recursive function is called.
% \begin{verbatim}
% ! start the following call in a task
% x=fibonacci(n-1)
% ! start the following call in a task
% y=fibonacci(n-2)
% ! a synchronization must be done here !
% fibonacci = (x+y)
% \end{verbatim}
% \end{block}
% \begin{alertblock}{Warning: number of tasks and number of physical cores}
% Pay attention to the number of tasks with respect to the number of cores you have on the node (here 48).
% \end{alertblock}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive (stupid) example}
% \begin{lstlisting}[language=C,frame=lines]
% int fibonacci(int n){
% int x,y;
% if (n < 2) {
% return n;
% } else {
% #pragma omp task shared(x)
% x = fibonacci(n-1);
% #pragma omp task shared(y)
% y = fibonacci(n-2);
% #pragma omp taskwait
% return (x+y);
% }
% }
% \end{lstlisting}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive example [output]}
% \begin{verbatim}
% vkeller@mathicsepc13:~$ ./ex12 45
% \end{verbatim}
% \begin{alertblock}{Warning !}
% Waaaaaaaaaaaaaaaaaaaay too long : too many tasks are created.
% \end{alertblock}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive (stupid) example with cutoff}
% \begin{lstlisting}[language=C,frame=lines]
% int fibonacci(int n, int level, int cutoff){
% int x,y;
% if (n < 2) {
% return n;
% } else if (level < cutoff) {
% #pragma omp task shared(x)
% x = fibonacci(n-1, level+1,cutoff);
% #pragma omp task shared(x)
% y = fibonacci(n-2, level+1,cutoff);
% #pragma omp taskwait
% return (x+y);
% } else {
% x = fibonacci(n-1);
% y = fibonacci(n-2);
% return (x+y);
% }
% }
% \end{lstlisting}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{A \texttt{task} directive (stupid) example [output]}
% \begin{table}
% \begin{center}
% \begin{tabular}{|l|l|l|l|l|l|}
% \hline
% \textbf{OMP\_NUM\_THREADS} & \textbf{1} & \textbf{2} & \textbf{4} & \textbf{8} & \textbf{16}\\
% \hline
% \hline
% sequential & 27.4 & 27.4&27.4 &27.4 &27.4 \\
% \hline
% without cutoff & 27.4 & $>>$60 & $>>$60 & $>>$60 & $>>$60 \\
% \hline
% with cutoff (level=10) & 27.4 & 14.5 & 7.4 & 4.1 & 3.9 \\
% \hline
% for loop & 10$^{-5}$ & 10$^{-5}$ & 10$^{-5}$ & 10$^{-5}$ & 10$^{-5}$ \\
% \hline
% \end{tabular}
% \end{center}
% \caption{\texttt{N=45}, time is in seconds}
% \end{table}
% \begin{block}{Remark}
% We get a beautiful speedup by cutting off the tree search. But another simplier algorithm (for loop) performs by 6 orders of magnitude.
% \end{block}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{Tasks remarks}
% \begin{itemize}
% \item{targeted for many-cores co-processors (like Intel Phi)}
% \item{Can be used to solve non symetrical problems and algorithms}
% \item{Avoid them on a multi-core CPU}
% \end{itemize}
% \end{frame}
% \subsubsection[Master and Synchronization constructs]{Master and Synchronization constructs ("master", "critical", "barrier", "taskwait", "atomic", "flush", "ordered")}
% \begin{frame}
% \frametitle{Synchronization}
% \begin{block}{Synchronization constructs}
% Those directives are sometimes mandatory:
% \begin{itemize}
% \item{\texttt{master} : region is executed by the master thread only }
% \item{\texttt{critical} : region is executed by only one thread at a time }
% \item{\texttt{barrier} : all threads must reach this directive to continue}
% \item{\texttt{taskwait} : all tasks and childs must reach this directive to continue}
% \item{\texttt{atomic (read | write | update | capture)} : the associated storage location is accessed by only one thread/task at a time}
% \item{\texttt{flush} : this operation makes the thread's temporary view of memory consistent with the shared memory}
% \item{\texttt{ordered} : a structured block is executed in the order of the loop iterations }
% \end{itemize}
% \end{block}
% \end{frame}
% % \subsubsection{Data environment \texttt{threadprivate}}
% %
% % \begin{frame}[containsverbatim]
% % \frametitle{The \texttt{threadprivate} directive}
% %
% % \begin{exampleblock}{Syntax}
% % The \texttt{threadprivate} directive specifies that variables are replicated, with each thread having its own copy.
% % \begin{lstlisting}[language=C,frame=lines]
% % #pragma omp threadprivate(list)
% % \end{lstlisting}
% % where \textit{list} is a comma-separated list of named variables and named common blocks
% % \end{exampleblock}
% % \end{frame}
% %
% % \begin{frame}[containsverbatim]
% % \frametitle{The \texttt{threadprivate} directive}
% %
% % \begin{exampleblock}{Syntax}
% % \begin{itemize}
% % \item{The directive must appear after the declaration of listed variables/common blocks}
% % \item{The values of data in the threadprivate variables of non-initial threads are guaranteed to persist between two consecutive active \texttt{parallel} regions if:
% % \begin{itemize}
% % \item{No nested \texttt{parallel} regions}
% % \item{Number of threads for both \texttt{parallel} regions is the same}
% % \item{\texttt{dyn-var} ICV is false for both \texttt{parallel} regions}
% % \end{itemize}
% % }
% % \item{A \texttt{threadprivate} variable is affected by a \texttt{copyin} clause if it appears in the list}
% % \item{A \texttt{threadprivate} variable is \textbf{NOT} affected by a \texttt{copyin} clause if it as the \texttt{allocatable} (not initially allocated) or the \texttt{pointer} (no initial association) attributes}
% % \end{itemize}
% % \end{exampleblock}
% %
% % \end{frame}
% % \begin{frame}[containsverbatim]
% % \frametitle{A \texttt{copyin} clause}
% %
% % \begin{exampleblock}{Properties}
% % \begin{itemize}
% % \item{The \texttt{copyin} clause provides a mechanism to copy the value of the master thread's \texttt{threadprivate} variable to the \texttt{threadprivate} variable of each other member of the team executing the \texttt{parallel}region. }
% % \item{If the original list item has the \texttt{POINTER} attribute, each copy receives the same association status of the master thread's copy as if by pointer assignment. }
% % \item{If the original list item does not have the \texttt{POINTER} attribute, each copy becomes defined with the value of the master thread's copy as if by intrinsic assignment, unless it has the allocation status of not currently allocated, in which case each copy will have the same status. }
% % \end{itemize}
% % \end{exampleblock}
% % \end{frame}
% % \begin{frame}[containsverbatim]
% % \frametitle{A \texttt{copyprivate} clause}
% %
% % \begin{exampleblock}{Properties}
% % \begin{itemize}
% % \item{The \texttt{copyprivate} clause provides a mechanism to use a private variable to broadcast a value from the data environment of one implicit task to the data environments of the other implicit tasks belonging to the \texttt{parallel} region.}
% % \item{To avoid race conditions, concurrent reads or updates of the list item must be synchronized with the update of the list item that occurs as a result of the \texttt{copyprivate} clause.}
% % \end{itemize}
% % \end{exampleblock}
% % \end{frame}
% \subsubsection{Nesting}
% \begin{frame}
% \frametitle{Nesting regions}
% \begin{exampleblock}{Nesting}
% It is possible to include parallel regions in a parallel region (i.e. nesting) under restrictions (cf. sec. 2.10, p.111, \textit{OpenMP: Specifications ver. 3.1})
% \end{exampleblock}
% \end{frame}
% \subsection{Runtime Library routines}
% \begin{frame}
% \frametitle{Runtime Library routines}
% \begin{exampleblock}{Usage}
% \begin{itemize}
% \item{The functions/subroutines are defined in the lib \texttt{libomp.so / libgomp.so}. Don't
% forget to include \texttt{\#include <omp.h>}}
% \item{These functions can be called anywhere in your programs}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \subsubsection{General purpose routines - selection}
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{General purpose routines}
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_set\_num\_threads} & sets/gets number of threads to be used \\
% % \texttt{omp\_get\_num\_threads} & for subsequent parallel regions that \\
% % & do not specify a num\_threads clause \\
% % & by setting the value of the first \\
% % & element of the nthreads-var ICV of \\
% % & the current task \\
% % \hline
% % \texttt{omp\_get\_max\_threads} &
% % returns an upper bound on the number of \\
% % & threads that could be used to form a \\
% % & new team if a parallel region without a \\
% % & num\_threads clause were encountered \\
% % & after execution returns from this routine \\
% % \hline
% %
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{General purpose routines}
% %
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_get\_thread\_num} &
% % returns the thread number, within the \\
% % & current team, of the calling thread. \\
% % \hline
% % \texttt{omp\_get\_num\_procs} &
% % returns the number of processors \\
% % & available to the program. \\
% % \hline
% % \texttt{omp\_in\_parallel} &
% % returns true if the call to the routine \\
% % & is enclosed by an active parallel region \\
% % & ; otherwise, it returns false \\
% % \hline
% % \texttt{omp\_set\_dynamic} &
% % gets/sets the dynamic adjustment \\
% % \texttt{omp\_get\_dynamic} &
% % of the number of threads available \\
% % & for the execution of subsequent \\
% % & parallel regions by getting/setting \\
% % & the value of the dyn-var ICV. \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% %
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{General purpose routines}
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_set\_nested} &
% % gets/sets nested parallelism, \\
% % \texttt{omp\_get\_nested} &
% % by getting/setting the nest-var ICV. \\
% % \hline
% % \texttt{omp\_set\_schedule} &
% % gets/sets the schedule that is applied \\
% % \texttt{omp\_get\_schedule} &
% % when runtime is used as schedule kind, \\
% % & by getting/setting the value of \\
% % & the run-sched-var ICV. \\
% % \hline
% % \texttt{omp\_get\_thread\_limit} &
% % returns the maximum number of \\
% % & OpenMP threads available to the \\
% % & program. \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% %
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{General purpose routines}
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_set\_max\_active\_levels} &
% % limits the number of \\
% % \texttt{omp\_get\_max\_active\_levels} &
% % nested active parallel \\
% % & regions, by getting/setting \\
% % & the max-active-levels-var ICV. \\
% % \hline
% % \texttt{omp\_get\_level} &
% % returns the number of nested \\
% % & parallel regions enclosing the \\
% % & task that contains the call. \\
% % \hline
% % \texttt{omp\_get\_ancestor\_thread\_num} &
% % returns, for a given nested \\
% % & level of the current thread,\\
% % & the thread number of the \\
% % & ancestor or the current \\
% % & thread \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% %
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{General purpose routines}
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_get\_team\_size} &
% % returns, for a given nested level \\
% % & of the current thread, the size of \\
% % & the thread team to which the ancestor \\
% % & or the current thread belongs \\
% % \hline
% % \texttt{omp\_get\_active\_level} &
% % returns the number of nested, active \\
% % & parallel regions enclosing the task \\
% % & that contains the call. \\
% % \hline
% % \texttt{omp\_in\_final} &
% % returns true if the routine is executed \\
% % & in a final task region; otherwise, \\
% % & it returns false. \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% % \subsubsection{Lock routines}
% %
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{Lock routines}
% %
% % \begin{block}{Remark on lock routines}
% % The following routines are rarely used. They are mentionned for exhaustivity purposes
% % \end{block}
% %
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_init\_lock} &
% % initializes a simple lock \\
% % \hline
% % \texttt{omp\_destroy\_lock} &
% % uninitializes a simple lock \\
% % \hline
% % \texttt{omp\_set\_lock} &
% % waits until a simple lock is available \\
% % & and then sets it \\
% % \hline
% % \texttt{omp\_unset\_lock} &
% % unsets a simple lock \\
% % \hline
% % \texttt{omp\_test\_lock} &
% % tests a simple lock, and sets it if \\
% % & it is available \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% % \subsubsection{Nestable lock routines}
% %
% % \begin{frame}
% % \frametitle{Runtime Library routines}
% % \framesubtitle{Nestable lock routines}
% %
% % \begin{block}{Remark on lock nestable routines}
% % The following routines are rarely used. They are mentionned for exhaustivity purposes
% % \end{block}
% %
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{routine} & \textbf{behavior} \\
% % \hline
% % \hline
% % \texttt{omp\_init\_nest\_lock} &
% % initializes a nestable lock \\
% % \hline
% % \texttt{omp\_destroy\_nest\_lock} &
% % uninitializes a nestable lock \\
% % \hline
% % \texttt{omp\_set\_nest\_lock} &
% % waits until a nestable lock is available \\
% % & and then sets it \\
% % \hline
% % \texttt{omp\_unset\_nest\_lock} &
% % unsets a nestable lock \\
% % \hline
% % \texttt{omp\_test\_nest\_lock} &
% % tests a nestable lock, and sets it if \\
% % & it is available \\
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% \subsubsection{Timing routines}
% \begin{frame}
% \frametitle{Runtime Library routines}
% \framesubtitle{Timing routines}
% \begin{center}
% \begin{tabular}{|l|l|}
% \hline
% \textbf{routine} & \textbf{behavior} \\
% \hline
% \hline
% \texttt{omp\_get\_wtime} &
% returns elapsed wall clock time in seconds. \\
% \hline
% \texttt{omp\_get\_wtick} &
% returns the precision of the timer used by \\
% & \texttt{omp\_get\_wtime} \\
% \hline
% \end{tabular}
% \end{center}
% \end{frame}
% \subsection{Environment variables}
% \begin{frame}
% \frametitle{Environment variables}
% \begin{exampleblock}{Usage}
% \begin{itemize}
% \item{Environment variables are used to set the ICVs variables}
% \item{under \texttt{csh} : \texttt{setenv OMP\_VARIABLE "its-value"}}
% \item{under \texttt{bash} : \texttt{export OMP\_VARIABLE="its-value"}}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \begin{frame}
% \frametitle{Environment variables}
% \begin{center}
% \begin{tabular}{|l|l|}
% \hline
% \textbf{variable} & \textbf{what for ?} \\
% \hline
% \hline
% \texttt{OMP\_SCHEDULE}
% & sets the run-sched-var ICV that specifies \\
% & the runtime schedule type and chunk size. \\
% & It can be set to any of the valid OpenMP \\
% & schedule types. \\
% \hline
% \texttt{OMP\_NUM\_THREADS}
% & sets the nthreads-var ICV that specifies \\
% & the number of threads to use in parallel \\
% & regions \\
% \hline
% % \texttt{OMP\_DYNAMIC}
% % & sets the dyn-var ICV that specifies the \\
% % & dynamic adjustment of threads to use for \\
% % & parallel regions. \\
% \hline
% \end{tabular}
% \end{center}
% \end{frame}
% % \begin{frame}
% % \frametitle{Environment variables}
% %
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{variable} & \textbf{what for ?} \\
% % \hline
% % \hline
% %
% % \texttt{OMP\_PROC\_BIND}
% % & sets the bind-var ICV that controls whether \\
% % & threads are bound to processors \\
% %
% % \hline
% % \texttt{OMP\_NESTED}
% % & sets the nest-var ICV that enables or disables \\
% % & nested parallelism \\
% %
% % \hline
% % \texttt{OMP\_STACKSIZE}
% % & sets the stacksize-var ICV that specifies \\
% % & the size of the stack for threads created by \\
% % & the OpenMP implementation. \\
% %
% % \hline
% % \texttt{OMP\_WAIT\_POLICY}
% % & sets the wait-policy-var ICV that controls \\
% % & the desired behavior of waiting threads. \\
% %
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% % \begin{frame}
% % \frametitle{Environment variables}
% %
% % \begin{center}
% % \begin{tabular}{|l|l|}
% % \hline
% % \textbf{variable} & \textbf{what for ?} \\
% % \hline
% % \hline
% % \texttt{OMP\_MAX\_ACTIVE\_LEVELS}
% % & sets the max-active-levels-var ICV \\
% % & that controls the maximum number of \\
% % & nested active parallel regions. \\
% %
% % \hline
% % \texttt{OMP\_THREAD\_LIMIT}
% % & sets the thread-limit-var ICV that \\
% % & controls the maximum number of \\
% % & threads participating in the OpenMP \\
% % & program. \\
% %
% % \hline
% % \end{tabular}
% % \end{center}
% %
% % \end{frame}
% \subsubsection{The apparent ``easiness'' of OpenMP}
% \begin{frame}
% \frametitle{The apparent ``easiness'' of OpenMP}
% \begin{block}{}
% \textit{``Compared to MPI, OpenMP is much easier''}
% \end{block}
% \begin{exampleblock}{In the reality}
% \begin{itemize}
% \item{Parallelization of a non-appropriate algorithm}
% \item{Parallelization of an unoptimized code}
% \item{Race conditions in shared memory environment}
% \item{Memory coherence}
% \item{Compiler implementation of the OpenMP API}
% \item{(Much) more threads/tasks than your machine can support}
% \end{itemize}
% \end{exampleblock}
% \end{frame}
% \subsection{About affinity}
% \begin{frame}[fragile]
% \frametitle{OpenMP Thread affinity}
% \textbf{Affinity = on which core does my thread run ?}
% \begin{block}{Show and set affinity with Intel executable}
% By setting the \verb+export KMP_AFFINITY=verbose,SCHEDULING+ you are able to see where the OS pin each thread
% \end{block}
% \begin{block}{Show and set affinity with GNU executable}
% By setting the \verb+export GOMP_CPU_AFFINITY=verbose,SCHEDULING+ you are able to see where the OS pin each thread
% \end{block}
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{OpenMP Thread affinity with compact}
% \begingroup
% \fontsize{6pt}{12pt}\linespread{0.5}\selectfont
% \begin{verbatim}
% vkeller@mathicsepc13:~$ export KMP_AFFINITY=verbose,compact
% vkeller@mathicsepc13:~$ ./ex10
% OMP: Info #204: KMP_AFFINITY: decoding x2APIC ids.
% OMP: Info #202: KMP_AFFINITY: Affinity capable, using global cpuid leaf 11 info
% OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
% OMP: Info #156: KMP_AFFINITY: 16 available OS procs
% OMP: Info #157: KMP_AFFINITY: Uniform topology
% OMP: Info #179: KMP_AFFINITY: 2 packages x 4 cores/pkg x 2 threads/core (8 total cores)
% OMP: Info #206: KMP_AFFINITY: OS proc to physical thread map:
% OMP: Info #171: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 8 maps to package 0 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 9 maps to package 0 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 2 maps to package 0 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 10 maps to package 0 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 3 maps to package 0 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 11 maps to package 0 core 10 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 4 maps to package 1 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 12 maps to package 1 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 5 maps to package 1 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 13 maps to package 1 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 6 maps to package 1 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 14 maps to package 1 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 7 maps to package 1 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 15 maps to package 1 core 10 thread 1
% OMP: Info #144: KMP_AFFINITY: Threads may migrate across 1 innermost levels of machine
% OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,8}
% OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {0,8}
% OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {1,9}
% OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {1,9}
% [DGEMM] Compute time [s] : 0.344645023345947
% [DGEMM] Performance [GF/s]: 0.580307233391397
% [DGEMM] Verification : 2000000000.00000
% \end{verbatim}
% \endgroup
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{OpenMP Thread affinity with scatter}
% \begingroup
% \fontsize{6pt}{12pt}\linespread{0.5}\selectfont
% \begin{verbatim}
% vkeller@mathicsepc13:~$ export KMP_AFFINITY=verbose,scatter
% vkeller@mathicsepc13:~$ ./ex10
% OMP: Info #204: KMP_AFFINITY: decoding x2APIC ids.
% OMP: Info #202: KMP_AFFINITY: Affinity capable, using global cpuid leaf 11 info
% OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
% OMP: Info #156: KMP_AFFINITY: 16 available OS procs
% OMP: Info #157: KMP_AFFINITY: Uniform topology
% OMP: Info #179: KMP_AFFINITY: 2 packages x 4 cores/pkg x 2 threads/core (8 total cores)
% OMP: Info #206: KMP_AFFINITY: OS proc to physical thread map:
% OMP: Info #171: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 8 maps to package 0 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 9 maps to package 0 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 2 maps to package 0 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 10 maps to package 0 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 3 maps to package 0 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 11 maps to package 0 core 10 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 4 maps to package 1 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 12 maps to package 1 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 5 maps to package 1 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 13 maps to package 1 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 6 maps to package 1 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 14 maps to package 1 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 7 maps to package 1 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 15 maps to package 1 core 10 thread 1
% OMP: Info #144: KMP_AFFINITY: Threads may migrate across 1 innermost levels of machine
% OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,8}
% OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {4,12}
% OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {1,9}
% OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {5,13}
% [DGEMM] Compute time [s] : 0.204235076904297
% [DGEMM] Performance [GF/s]: 0.979263714301724
% [DGEMM] Verification : 2000000000.00000
% \end{verbatim}
% \endgroup
% \end{frame}
% \begin{frame}[containsverbatim]
% \frametitle{OpenMP Thread affinity with explicit (a kind of pining)}
% \begingroup
% \fontsize{6pt}{12pt}\linespread{0.5}\selectfont
% \begin{verbatim}
% vkeller@mathicsepc13:~$ export KMP_AFFINITY='proclist=[0,2,4,6],explicit',verbose
% vkeller@mathicsepc13:~$ ./ex10
% OMP: Info #204: KMP_AFFINITY: decoding x2APIC ids.
% OMP: Info #202: KMP_AFFINITY: Affinity capable, using global cpuid leaf 11 info
% OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
% OMP: Info #156: KMP_AFFINITY: 16 available OS procs
% OMP: Info #157: KMP_AFFINITY: Uniform topology
% OMP: Info #179: KMP_AFFINITY: 2 packages x 4 cores/pkg x 2 threads/core (8 total cores)
% OMP: Info #206: KMP_AFFINITY: OS proc to physical thread map:
% OMP: Info #171: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 8 maps to package 0 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 9 maps to package 0 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 2 maps to package 0 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 10 maps to package 0 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 3 maps to package 0 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 11 maps to package 0 core 10 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 4 maps to package 1 core 0 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 12 maps to package 1 core 0 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 5 maps to package 1 core 1 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 13 maps to package 1 core 1 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 6 maps to package 1 core 9 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 14 maps to package 1 core 9 thread 1
% OMP: Info #171: KMP_AFFINITY: OS proc 7 maps to package 1 core 10 thread 0
% OMP: Info #171: KMP_AFFINITY: OS proc 15 maps to package 1 core 10 thread 1
% OMP: Info #144: KMP_AFFINITY: Threads may migrate across 1 innermost levels of machine
% OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,8}
% OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {6,14}
% OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {2,10}
% OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {4,12}
% [DGEMM] Compute time [s] : 0.248908042907715
% [DGEMM] Performance [GF/s]: 0.803509591990774
% [DGEMM] Verification : 2000000000.00000
% \end{verbatim}
% \endgroup
% \end{frame}
% \subsubsection{``OpenMP-ization'' strategy}
% \begin{frame}
% \frametitle{``OpenMP-ization'' strategy}
% \begin{itemize}
% \item {\textbf{STEP 1} : Optimize the sequential version:
% \begin{itemize}
% \item {Choose the best algorithm}
% \item {``Help the (right) compiler''}
% \item {Use the existing optimized scientific libraries}
% \end{itemize}
% }
% \item {\textbf{STEP 2} : Parallelize it:
% \begin{itemize}
% \item {Identify the bottlenecks (heavy loops)}
% \item {``auto-parallelization'' is rarely the best !}
% \end{itemize}
% }
% \end{itemize}
% \begin{alertblock}{Goal}
% Debugging - Profiling - Optimization cycle. Then parallelization !
% \end{alertblock}
% \end{frame}
% \begin{frame}
% \frametitle{Tricks and tips}
% \begin{block}{}
% \begin{itemize}
% \item{\textbf{Algorithm}: choose the ``best'' one}
% % \item{\textbf{Implementation}: choose the best one (remember Fibonacci)}
% \item{\textbf{cc-NUMA}: no (real) support from OpenMP side (but OS). A multi-CPU machine is not a real shared memory architecture}
% \item{\textbf{False-sharing}: multiple threads write in the same cache line}
% \item{\textbf{Avoid barrier}. This is trivial. Bus sometimes you can't}
% \item{\textbf{Small number of tasks}. Try to reduce the number of forked tasks}
% \item{\textbf{Asymetrical problem}. OpenMP is well suited for symetrical problems, even if tasks can help}
% \item{\textbf{Tune the schedule}: types, chunks...}
% \item{\textbf{Performance expectations}: a theoretical analysis using the simple Amdahl's law can help}
% \item{\textbf{Parallelization level}: coarse (SPMD) or fine (loop) grain ?}
% \end{itemize}
% \end{block}
% \end{frame}
% \subsection{Conclusion}
% \begin{frame}
% \frametitle{A simple conclusion ...}
% \begin{center}
% {\includegraphics[height=2.5cm]{day1/images/warning.png}}
% \begin{alertblock}{The message}
% \textbf{FIRST OPTIMIZE ON ONE CORE, THEN PARALLELIZE (the right algorithm)}
% \end{alertblock}
% \url{http://openmp.org/wp/openmp-compilers}
% \end{center}
% \end{frame}
% \subsection{What's new in 4.0 ?}
% \begin{frame}
% \frametitle{What's new with OpenMP 4.0 ?}
% \begin{itemize}
% \item{ Support for new devices (\verb+Intel Phi+, \verb+GPU+,...) with \verb+omp target+. Offloading on those devices. }
% \item{ Hardware agnostic}
% \item{ League of threads with \verb+omp teams+ and distribute a loop over the team with \verb+omp distribute+ }
% \item{ SIMD support for vectorization \verb+omp simd+ }
% \item{ Task management enhancements (cancelation of a task, groups of tasks, task-to-task synchro)}
% \item{ Set thread affinity with a more standard way than \verb+KMP_AFFINITY+ with the concepts of \verb+places+ (a thread, a core, a socket), \verb+policies+ (spread, close, master) and \verb+control settings+ the new clause \verb+proc_bind+}
% \end{itemize}
% \end{frame}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "../../phys_743_parallel_programming"
%%% End:
% LocalWords: OpenMP, Fortran, preprocessor

Event Timeline