Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/google/ruy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Jacob <benoitjacob@google.com>2021-01-15 07:07:26 +0300
committerCopybara-Service <copybara-worker@google.com>2021-01-15 07:07:53 +0300
commitd7fb861d488d15885dcfa4851ba6f821ce34902a (patch)
tree491c93d163604688981da0bfd9a153c6bd9ce2d9
parent2cbb179f2d1c861cdcf215e897234b2d47b09abf (diff)
Add a trimmed dependency graph and its generator, for doc purposes.
PiperOrigin-RevId: 351929118
-rw-r--r--README.md4
-rwxr-xr-xdoc/depgraph.sh152
-rw-r--r--doc/depgraph.svg418
3 files changed, 572 insertions, 2 deletions
diff --git a/README.md b/README.md
index f341563..f03a7fe 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,6 @@ small binary size.
## Documentation
-Some documentation will eventually be available in the doc/ directory, see
-[doc/README.md](doc/README.md).
+Some documentation will eventually be available in the g3doc/ directory, see
+[g3doc/README.md](g3doc/README.md).
diff --git a/doc/depgraph.sh b/doc/depgraph.sh
new file mode 100755
index 0000000..3dca335
--- /dev/null
+++ b/doc/depgraph.sh
@@ -0,0 +1,152 @@
+#!/bin/bash
+
+# Generates a graphviz dependency graph for :ruy, with details trimmed.
+# Suggested rendering: pipe to `neato` (part of graphviz standard distribution)
+# doc/depgraph.sh | dot -Tsvg > depgraph.svg
+
+drop=(
+ ':platform'
+ ':check_macros'
+ ':asm_helpers'
+ ':size_util'
+ ':system_aligned_alloc'
+ ':side_pair'
+ ':opt_set'
+ ':blocking_counter'
+ ':wait'
+ ':time'
+ ':path'
+ ':performance_advisory'
+ ':tune'
+ ':matrix'
+ ':mat'
+ ':mul_params'
+ ':context_get_ctx'
+ ':have_built_path_for'
+ ':pack_common'
+ ':kernel_common'
+ 'profiler:instrumentation'
+ '\bclog\b'
+ '\bcpuinfo_impl\b'
+ ':apply_multiplier'
+ '\blabel='
+)
+
+graph="$(bazel query 'kind("cc_library", deps(//ruy))' --output graph --noimplicit_deps 2>/dev/null)"
+
+graph="$(echo "${graph}" | sed 's|//ruy/\?||g')"
+
+for t in "${drop[@]}"; do
+ graph="$(echo "${graph}" | grep -v "${t}")"
+done
+
+graph="$(echo "${graph}" | sed 's|//:cpuinfo_with_unstripped_include_path||g')"
+graph="$(echo "${graph}" | sed 's|//third_party/cpuinfo:[a-z0-9_]*|@cpuinfo|g')"
+
+frontend=(
+ ':ruy'
+ ':context'
+ ':frontend'
+ ':prepare_packed_matrices'
+ ':create_trmul_params'
+ ':validate'
+)
+
+middleend=(
+ ':ctx'
+ ':trmul_params'
+ ':trmul'
+ ':block_map'
+ ':cpuinfo'
+ ':cpu_cache_params'
+ ':allocator'
+ ':thread_pool'
+ ':prepacked_cache'
+)
+
+backend=(
+ ':kernel.*'
+ ':pack.*'
+)
+
+frontend_lines=()
+middleend_lines=()
+backend_lines=()
+misc_lines=()
+arrow_lines=()
+
+while IFS= read -r line; do
+ if [[ "${line}" =~ '->' ]]; then
+ arrow_lines+=("${line}")
+ else
+ handled=false
+ if [ $handled = false ]; then
+ for f in "${frontend[@]}"; do
+ if [[ "${line}" =~ ${f} ]]; then
+ frontend_lines+=("${line}")
+ handled=true
+ break
+ fi
+ done
+ fi
+ if [ $handled = false ]; then
+ for f in "${middleend[@]}"; do
+ if [[ "${line}" =~ ${f} ]]; then
+ middleend_lines+=("${line}")
+ handled=true
+ break
+ fi
+ done
+ fi
+ if [ $handled = false ]; then
+ for f in "${backend[@]}"; do
+ if [[ "${line}" =~ ${f} ]]; then
+ backend_lines+=("${line}")
+ handled=true
+ break
+ fi
+ done
+ fi
+ if [ $handled = false ]; then
+ if [[ "${line}" =~ ^[[:space:]]+\" ]]; then
+ misc_lines+=("${line}")
+ fi
+ fi
+ fi
+done <<< "${graph}"
+
+echo "digraph ruy {"
+echo " splines = true"
+echo " node [shape=box]"
+for f in "${frontend_lines[@]}"; do
+ echo " $f [style=filled, color=lightblue];"
+done
+for m in "${middleend_lines[@]}"; do
+ echo " $m [style=filled, color=lightgreen];"
+done
+for b in "${backend_lines[@]}"; do
+ echo " $b [style=filled, color=indianred1];"
+done
+for m in "${misc_lines[@]}"; do
+ echo "$m"
+done
+for a in "${arrow_lines[@]}"; do
+ echo "$a"
+done
+echo " \":create_trmul_params\" -> \":trmul\" [style=invis]"
+echo " subgraph cluster_legend_margin {"
+echo " style=invis"
+echo " margin=80"
+echo " subgraph cluster_legend {"
+echo " style=\"\""
+echo " label=\"Legend\""
+echo " fontsize=20"
+echo " margin=20"
+echo " labelloc=t"
+echo " frontend [label=\"Front-end\", style=filled, color=lightblue]"
+echo " middleend [label=\"Middle-end\", style=filled, color=lightgreen]"
+echo " backend [label=\"Back-end\", style=filled, color=indianred1]"
+echo " frontend -> middleend -> backend [style=invis]"
+echo " }"
+echo " }"
+echo "}"
diff --git a/doc/depgraph.svg b/doc/depgraph.svg
new file mode 100644
index 0000000..df78ed4
--- /dev/null
+++ b/doc/depgraph.svg
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: ruy Pages: 1 -->
+<svg width="1572pt" height="703pt"
+ viewBox="0.00 0.00 1572.12 703.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 699)">
+<title>ruy</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-699 1568.12,-699 1568.12,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_legend_margin</title>
+</g>
+<g id="clust2" class="cluster">
+<title>cluster_legend</title>
+<polygon fill="none" stroke="black" points="1356.12,-357 1356.12,-607 1476.12,-607 1476.12,-357 1356.12,-357"/>
+<text text-anchor="middle" x="1416.12" y="-587" font-family="Times,serif" font-size="20.00">Legend</text>
+</g>
+<!-- :ruy -->
+<g id="node1" class="node">
+<title>:ruy</title>
+<polygon fill="lightblue" stroke="lightblue" points="205.12,-557 151.12,-557 151.12,-521 205.12,-521 205.12,-557"/>
+<text text-anchor="middle" x="178.12" y="-535.3" font-family="Times,serif" font-size="14.00">:ruy</text>
+</g>
+<!-- :frontend -->
+<g id="node2" class="node">
+<title>:frontend</title>
+<polygon fill="lightblue" stroke="lightblue" points="361.12,-485 295.12,-485 295.12,-449 361.12,-449 361.12,-485"/>
+<text text-anchor="middle" x="328.12" y="-463.3" font-family="Times,serif" font-size="14.00">:frontend</text>
+</g>
+<!-- :ruy&#45;&gt;:frontend -->
+<g id="edge2" class="edge">
+<title>:ruy&#45;&gt;:frontend</title>
+<path fill="none" stroke="black" d="M205.29,-525.32C227.69,-514.87 259.88,-499.85 285.68,-487.81"/>
+<polygon fill="black" stroke="black" points="287.29,-490.92 294.87,-483.52 284.33,-484.58 287.29,-490.92"/>
+</g>
+<!-- :context -->
+<g id="node6" class="node">
+<title>:context</title>
+<polygon fill="lightblue" stroke="lightblue" points="67.12,-269 7.12,-269 7.12,-233 67.12,-233 67.12,-269"/>
+<text text-anchor="middle" x="37.12" y="-247.3" font-family="Times,serif" font-size="14.00">:context</text>
+</g>
+<!-- :ruy&#45;&gt;:context -->
+<g id="edge1" class="edge">
+<title>:ruy&#45;&gt;:context</title>
+<path fill="none" stroke="black" d="M161.22,-520.9C139.62,-498.14 102.48,-455.76 81.12,-413 59.13,-368.98 46.95,-312.53 41.25,-279.5"/>
+<polygon fill="black" stroke="black" points="44.64,-278.54 39.56,-269.24 37.73,-279.68 44.64,-278.54"/>
+</g>
+<!-- :validate -->
+<g id="node3" class="node">
+<title>:validate</title>
+<polygon fill="lightblue" stroke="lightblue" points="1195.62,-413 1132.62,-413 1132.62,-377 1195.62,-377 1195.62,-413"/>
+<text text-anchor="middle" x="1164.12" y="-391.3" font-family="Times,serif" font-size="14.00">:validate</text>
+</g>
+<!-- :frontend&#45;&gt;:validate -->
+<g id="edge9" class="edge">
+<title>:frontend&#45;&gt;:validate</title>
+<path fill="none" stroke="black" d="M361.38,-465.04C492.01,-461.06 970.08,-444.63 1118.12,-413 1119.61,-412.68 1121.1,-412.33 1122.61,-411.94"/>
+<polygon fill="black" stroke="black" points="1123.95,-415.2 1132.55,-409.01 1121.97,-408.48 1123.95,-415.2"/>
+</g>
+<!-- :prepare_packed_matrices -->
+<g id="node4" class="node">
+<title>:prepare_packed_matrices</title>
+<polygon fill="lightblue" stroke="lightblue" points="281.62,-269 122.62,-269 122.62,-233 281.62,-233 281.62,-269"/>
+<text text-anchor="middle" x="202.12" y="-247.3" font-family="Times,serif" font-size="14.00">:prepare_packed_matrices</text>
+</g>
+<!-- :frontend&#45;&gt;:prepare_packed_matrices -->
+<g id="edge6" class="edge">
+<title>:frontend&#45;&gt;:prepare_packed_matrices</title>
+<path fill="none" stroke="black" d="M317.28,-448.9C310.77,-438.56 302.37,-425.08 295.12,-413 266.71,-365.64 234.73,-309.66 216.65,-277.75"/>
+<polygon fill="black" stroke="black" points="219.68,-276.01 211.71,-269.03 213.59,-279.46 219.68,-276.01"/>
+</g>
+<!-- :create_trmul_params -->
+<g id="node5" class="node">
+<title>:create_trmul_params</title>
+<polygon fill="lightblue" stroke="lightblue" points="511.12,-413 375.12,-413 375.12,-377 511.12,-377 511.12,-413"/>
+<text text-anchor="middle" x="443.12" y="-391.3" font-family="Times,serif" font-size="14.00">:create_trmul_params</text>
+</g>
+<!-- :frontend&#45;&gt;:create_trmul_params -->
+<g id="edge4" class="edge">
+<title>:frontend&#45;&gt;:create_trmul_params</title>
+<path fill="none" stroke="black" d="M356.25,-448.88C371.29,-439.72 389.99,-428.34 406.18,-418.48"/>
+<polygon fill="black" stroke="black" points="408.16,-421.38 414.88,-413.19 404.52,-415.4 408.16,-421.38"/>
+</g>
+<!-- :trmul -->
+<g id="node7" class="node">
+<title>:trmul</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="467.12,-269 413.12,-269 413.12,-233 467.12,-233 467.12,-269"/>
+<text text-anchor="middle" x="440.12" y="-247.3" font-family="Times,serif" font-size="14.00">:trmul</text>
+</g>
+<!-- :frontend&#45;&gt;:trmul -->
+<g id="edge7" class="edge">
+<title>:frontend&#45;&gt;:trmul</title>
+<path fill="none" stroke="black" d="M326.35,-448.95C323.55,-412.6 322.34,-326.75 366.12,-277 375.47,-266.37 389.5,-260.26 402.84,-256.74"/>
+<polygon fill="black" stroke="black" points="403.81,-260.11 412.82,-254.52 402.3,-253.27 403.81,-260.11"/>
+</g>
+<!-- :trmul_params -->
+<g id="node8" class="node">
+<title>:trmul_params</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="331.62,-188.5 234.62,-188.5 234.62,-152.5 331.62,-152.5 331.62,-188.5"/>
+<text text-anchor="middle" x="283.12" y="-166.8" font-family="Times,serif" font-size="14.00">:trmul_params</text>
+</g>
+<!-- :frontend&#45;&gt;:trmul_params -->
+<g id="edge8" class="edge">
+<title>:frontend&#45;&gt;:trmul_params</title>
+<path fill="none" stroke="black" d="M325.51,-448.89C318.02,-399.89 296.45,-258.7 287.3,-198.84"/>
+<polygon fill="black" stroke="black" points="290.71,-198.01 285.74,-188.65 283.79,-199.07 290.71,-198.01"/>
+</g>
+<!-- :ctx -->
+<g id="node9" class="node">
+<title>:ctx</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="178.12,-188.5 124.12,-188.5 124.12,-152.5 178.12,-152.5 178.12,-188.5"/>
+<text text-anchor="middle" x="151.12" y="-166.8" font-family="Times,serif" font-size="14.00">:ctx</text>
+</g>
+<!-- :frontend&#45;&gt;:ctx -->
+<g id="edge5" class="edge">
+<title>:frontend&#45;&gt;:ctx</title>
+<path fill="none" stroke="black" d="M295.08,-455.85C270.82,-447.23 238.05,-433.04 214.12,-413 154.19,-362.81 136.66,-343.55 113.12,-269 108.31,-253.74 108.75,-248.39 113.12,-233 116.77,-220.17 123.93,-207.4 131.07,-196.84"/>
+<polygon fill="black" stroke="black" points="134.02,-198.72 136.98,-188.55 128.32,-194.66 134.02,-198.72"/>
+</g>
+<!-- :allocator -->
+<g id="node14" class="node">
+<title>:allocator</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="446.12,-108 378.12,-108 378.12,-72 446.12,-72 446.12,-108"/>
+<text text-anchor="middle" x="412.12" y="-86.3" font-family="Times,serif" font-size="14.00">:allocator</text>
+</g>
+<!-- :frontend&#45;&gt;:allocator -->
+<g id="edge3" class="edge">
+<title>:frontend&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M361.32,-459.89C496.93,-434.14 1005.36,-329.67 1084.12,-197 1096.15,-176.74 1100.11,-161.3 1084.12,-144 1041.6,-97.99 600.01,-91.87 456.74,-91.1"/>
+<polygon fill="black" stroke="black" points="456.57,-87.6 446.55,-91.05 456.53,-94.6 456.57,-87.6"/>
+</g>
+<!-- :prepare_packed_matrices&#45;&gt;:trmul_params -->
+<g id="edge13" class="edge">
+<title>:prepare_packed_matrices&#45;&gt;:trmul_params</title>
+<path fill="none" stroke="black" d="M219.7,-232.97C230.95,-222.06 245.72,-207.75 258.18,-195.68"/>
+<polygon fill="black" stroke="black" points="260.84,-197.97 265.58,-188.5 255.96,-192.95 260.84,-197.97"/>
+</g>
+<!-- :prepare_packed_matrices&#45;&gt;:ctx -->
+<g id="edge11" class="edge">
+<title>:prepare_packed_matrices&#45;&gt;:ctx</title>
+<path fill="none" stroke="black" d="M191.06,-232.97C184.24,-222.47 175.37,-208.82 167.72,-197.05"/>
+<polygon fill="black" stroke="black" points="170.55,-194.98 162.17,-188.5 164.68,-198.79 170.55,-194.98"/>
+</g>
+<!-- :prepare_packed_matrices&#45;&gt;:allocator -->
+<g id="edge10" class="edge">
+<title>:prepare_packed_matrices&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M200.71,-232.78C199.81,-209.44 201.93,-167.93 225.12,-144 268.88,-98.85 302.98,-125.39 368.16,-107.88"/>
+<polygon fill="black" stroke="black" points="369.41,-111.15 378,-104.96 367.42,-104.44 369.41,-111.15"/>
+</g>
+<!-- :prepacked_cache -->
+<g id="node15" class="node">
+<title>:prepacked_cache</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="121.62,-108 8.62,-108 8.62,-72 121.62,-72 121.62,-108"/>
+<text text-anchor="middle" x="65.12" y="-86.3" font-family="Times,serif" font-size="14.00">:prepacked_cache</text>
+</g>
+<!-- :prepare_packed_matrices&#45;&gt;:prepacked_cache -->
+<g id="edge12" class="edge">
+<title>:prepare_packed_matrices&#45;&gt;:prepacked_cache</title>
+<path fill="none" stroke="black" d="M163.52,-232.78C147,-223.93 128.48,-211.86 115.12,-197 94.48,-174.04 80.74,-141.05 72.97,-117.99"/>
+<polygon fill="black" stroke="black" points="76.21,-116.62 69.82,-108.17 69.54,-118.76 76.21,-116.62"/>
+</g>
+<!-- :create_trmul_params&#45;&gt;:trmul -->
+<!-- :create_trmul_params&#45;&gt;:trmul_params -->
+<g id="edge18" class="edge">
+<title>:create_trmul_params&#45;&gt;:trmul_params</title>
+<path fill="none" stroke="black" d="M437.12,-376.6C425.78,-345.44 398.93,-279.08 361.12,-233 349.14,-218.4 333.14,-205.04 318.75,-194.53"/>
+<polygon fill="black" stroke="black" points="320.68,-191.61 310.5,-188.68 316.63,-197.32 320.68,-191.61"/>
+</g>
+<!-- :create_trmul_params&#45;&gt;:ctx -->
+<g id="edge15" class="edge">
+<title>:create_trmul_params&#45;&gt;:ctx</title>
+<path fill="none" stroke="black" d="M430.56,-376.84C406.45,-344.88 350.65,-275.64 290.12,-233 258.47,-210.71 217.45,-193.77 188.19,-183.37"/>
+<polygon fill="black" stroke="black" points="188.96,-179.93 178.37,-179.96 186.67,-186.54 188.96,-179.93"/>
+</g>
+<!-- :create_trmul_params&#45;&gt;:allocator -->
+<g id="edge14" class="edge">
+<title>:create_trmul_params&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M467.54,-376.85C523.87,-335.21 653.56,-226.13 592.12,-144 575.85,-122.25 504.4,-106.35 456.56,-97.9"/>
+<polygon fill="black" stroke="black" points="456.89,-94.41 446.44,-96.16 455.7,-101.31 456.89,-94.41"/>
+</g>
+<!-- :kernel -->
+<g id="node16" class="node">
+<title>:kernel</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="943.12,-269 889.12,-269 889.12,-233 943.12,-233 943.12,-269"/>
+<text text-anchor="middle" x="916.12" y="-247.3" font-family="Times,serif" font-size="14.00">:kernel</text>
+</g>
+<!-- :create_trmul_params&#45;&gt;:kernel -->
+<g id="edge16" class="edge">
+<title>:create_trmul_params&#45;&gt;:kernel</title>
+<path fill="none" stroke="black" d="M500.18,-376.87C598.54,-347.34 797.35,-287.66 879.42,-263.02"/>
+<polygon fill="black" stroke="black" points="880.49,-266.35 889.06,-260.12 878.47,-259.65 880.49,-266.35"/>
+</g>
+<!-- :pack -->
+<g id="node19" class="node">
+<title>:pack</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="704.12,-269 650.12,-269 650.12,-233 704.12,-233 704.12,-269"/>
+<text text-anchor="middle" x="677.12" y="-247.3" font-family="Times,serif" font-size="14.00">:pack</text>
+</g>
+<!-- :create_trmul_params&#45;&gt;:pack -->
+<g id="edge17" class="edge">
+<title>:create_trmul_params&#45;&gt;:pack</title>
+<path fill="none" stroke="black" d="M471.35,-376.87C513.94,-351.02 594.62,-302.06 641.3,-273.74"/>
+<polygon fill="black" stroke="black" points="643.15,-276.71 649.88,-268.53 639.52,-270.73 643.15,-276.71"/>
+</g>
+<!-- :context&#45;&gt;:ctx -->
+<g id="edge20" class="edge">
+<title>:context&#45;&gt;:ctx</title>
+<path fill="none" stroke="black" d="M61.86,-232.97C78.29,-221.65 100.06,-206.66 117.98,-194.32"/>
+<polygon fill="black" stroke="black" points="120.18,-197.05 126.43,-188.5 116.21,-191.29 120.18,-197.05"/>
+</g>
+<!-- :thread_pool -->
+<g id="node10" class="node">
+<title>:thread_pool</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="224.62,-108 139.62,-108 139.62,-72 224.62,-72 224.62,-108"/>
+<text text-anchor="middle" x="182.12" y="-86.3" font-family="Times,serif" font-size="14.00">:thread_pool</text>
+</g>
+<!-- :context&#45;&gt;:thread_pool -->
+<g id="edge22" class="edge">
+<title>:context&#45;&gt;:thread_pool</title>
+<path fill="none" stroke="black" d="M33.03,-232.68C28.74,-209.98 24.98,-169.98 44.12,-144 46.92,-140.2 92.03,-123.28 129.92,-109.57"/>
+<polygon fill="black" stroke="black" points="131.15,-112.84 139.37,-106.16 128.78,-106.26 131.15,-112.84"/>
+</g>
+<!-- :context&#45;&gt;:allocator -->
+<g id="edge19" class="edge">
+<title>:context&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M44.52,-232.69C55.87,-208.44 80.01,-164.98 115.12,-144 210.23,-87.17 256.26,-134.33 368.14,-107.8"/>
+<polygon fill="black" stroke="black" points="369.26,-111.13 378.1,-105.29 367.55,-104.34 369.26,-111.13"/>
+</g>
+<!-- :context&#45;&gt;:prepacked_cache -->
+<g id="edge21" class="edge">
+<title>:context&#45;&gt;:prepacked_cache</title>
+<path fill="none" stroke="black" d="M23.98,-232.91C17.2,-223.01 9.64,-209.96 6.12,-197 -0.04,-174.26 -3.47,-165.51 6.12,-144 11.2,-132.6 20.08,-122.63 29.43,-114.51"/>
+<polygon fill="black" stroke="black" points="31.75,-117.14 37.32,-108.13 27.35,-111.69 31.75,-117.14"/>
+</g>
+<!-- :trmul&#45;&gt;:trmul_params -->
+<g id="edge33" class="edge">
+<title>:trmul&#45;&gt;:trmul_params</title>
+<path fill="none" stroke="black" d="M412.78,-236.33C388.94,-224.41 353.95,-206.92 326.33,-193.1"/>
+<polygon fill="black" stroke="black" points="327.78,-189.92 317.27,-188.58 324.65,-196.18 327.78,-189.92"/>
+</g>
+<!-- :trmul&#45;&gt;:ctx -->
+<g id="edge31" class="edge">
+<title>:trmul&#45;&gt;:ctx</title>
+<path fill="none" stroke="black" d="M413.1,-244.16C372.15,-235.13 292.05,-216.74 225.12,-197 212.9,-193.4 199.71,-189.01 187.89,-184.9"/>
+<polygon fill="black" stroke="black" points="188.94,-181.56 178.34,-181.54 186.61,-188.16 188.94,-181.56"/>
+</g>
+<!-- :trmul&#45;&gt;:thread_pool -->
+<g id="edge32" class="edge">
+<title>:trmul&#45;&gt;:thread_pool</title>
+<path fill="none" stroke="black" d="M414.98,-232.83C401.92,-223.2 386.21,-210.44 374.12,-197 355.41,-176.19 362.2,-161.2 340.12,-144 309.51,-120.15 267.61,-106.74 234.64,-99.38"/>
+<polygon fill="black" stroke="black" points="235.23,-95.93 224.72,-97.29 233.79,-102.78 235.23,-95.93"/>
+</g>
+<!-- :cpuinfo -->
+<g id="node11" class="node">
+<title>:cpuinfo</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="360.12,-108 298.12,-108 298.12,-72 360.12,-72 360.12,-108"/>
+<text text-anchor="middle" x="329.12" y="-86.3" font-family="Times,serif" font-size="14.00">:cpuinfo</text>
+</g>
+<!-- :trmul&#45;&gt;:cpuinfo -->
+<g id="edge30" class="edge">
+<title>:trmul&#45;&gt;:cpuinfo</title>
+<path fill="none" stroke="black" d="M430.57,-232.98C418.34,-211.62 396.1,-174.12 374.12,-144 367.15,-134.44 358.92,-124.44 351.42,-115.73"/>
+<polygon fill="black" stroke="black" points="354.01,-113.37 344.79,-108.14 348.73,-117.97 354.01,-113.37"/>
+</g>
+<!-- :block_map -->
+<g id="node12" class="node">
+<title>:block_map</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="583.62,-188.5 502.62,-188.5 502.62,-152.5 583.62,-152.5 583.62,-188.5"/>
+<text text-anchor="middle" x="543.12" y="-166.8" font-family="Times,serif" font-size="14.00">:block_map</text>
+</g>
+<!-- :trmul&#45;&gt;:block_map -->
+<g id="edge28" class="edge">
+<title>:trmul&#45;&gt;:block_map</title>
+<path fill="none" stroke="black" d="M462.47,-232.97C477.18,-221.75 496.63,-206.93 512.74,-194.66"/>
+<polygon fill="black" stroke="black" points="514.98,-197.35 520.82,-188.5 510.74,-191.78 514.98,-197.35"/>
+</g>
+<!-- :cpu_cache_params -->
+<g id="node13" class="node">
+<title>:cpu_cache_params</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="536.12,-36 412.12,-36 412.12,0 536.12,0 536.12,-36"/>
+<text text-anchor="middle" x="474.12" y="-14.3" font-family="Times,serif" font-size="14.00">:cpu_cache_params</text>
+</g>
+<!-- :trmul&#45;&gt;:cpu_cache_params -->
+<g id="edge29" class="edge">
+<title>:trmul&#45;&gt;:cpu_cache_params</title>
+<path fill="none" stroke="black" d="M442.68,-232.64C448.55,-192.74 463.04,-94.27 470.11,-46.24"/>
+<polygon fill="black" stroke="black" points="473.59,-46.65 471.58,-36.25 466.66,-45.63 473.59,-46.65"/>
+</g>
+<!-- :trmul&#45;&gt;:allocator -->
+<g id="edge27" class="edge">
+<title>:trmul&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M437.13,-232.98C432.29,-205.51 422.72,-151.16 416.92,-118.25"/>
+<polygon fill="black" stroke="black" points="420.36,-117.62 415.18,-108.38 413.47,-118.83 420.36,-117.62"/>
+</g>
+<!-- :ctx&#45;&gt;:thread_pool -->
+<g id="edge37" class="edge">
+<title>:ctx&#45;&gt;:thread_pool</title>
+<path fill="none" stroke="black" d="M157.85,-152.47C161.87,-142.28 167.07,-129.12 171.62,-117.6"/>
+<polygon fill="black" stroke="black" points="174.99,-118.59 175.41,-108 168.48,-116.02 174.99,-118.59"/>
+</g>
+<!-- :ctx&#45;&gt;:cpuinfo -->
+<g id="edge35" class="edge">
+<title>:ctx&#45;&gt;:cpuinfo</title>
+<path fill="none" stroke="black" d="M177.17,-152.29C182.05,-149.36 187.17,-146.47 192.12,-144 223.42,-128.38 260.51,-114.29 288.2,-104.57"/>
+<polygon fill="black" stroke="black" points="289.64,-107.77 297.94,-101.19 287.35,-101.16 289.64,-107.77"/>
+</g>
+<!-- :ctx&#45;&gt;:allocator -->
+<g id="edge34" class="edge">
+<title>:ctx&#45;&gt;:allocator</title>
+<path fill="none" stroke="black" d="M175.53,-152.37C180.82,-149.22 186.51,-146.23 192.12,-144 263.8,-115.49 290.1,-129.63 368.25,-107.93"/>
+<polygon fill="black" stroke="black" points="369.41,-111.24 378.05,-105.1 367.47,-104.51 369.41,-111.24"/>
+</g>
+<!-- :ctx&#45;&gt;:prepacked_cache -->
+<g id="edge36" class="edge">
+<title>:ctx&#45;&gt;:prepacked_cache</title>
+<path fill="none" stroke="black" d="M132.46,-152.47C120.4,-141.46 104.54,-126.98 91.23,-114.83"/>
+<polygon fill="black" stroke="black" points="93.49,-112.16 83.75,-108 88.77,-117.33 93.49,-112.16"/>
+</g>
+<!-- :cpuinfo&#45;&gt;:cpu_cache_params -->
+<g id="edge38" class="edge">
+<title>:cpuinfo&#45;&gt;:cpu_cache_params</title>
+<path fill="none" stroke="black" d="M360.23,-73.98C380.49,-64.2 407.23,-51.29 429.71,-40.44"/>
+<polygon fill="black" stroke="black" points="431.25,-43.58 438.73,-36.08 428.21,-37.28 431.25,-43.58"/>
+</g>
+<!-- @cpuinfo -->
+<g id="node22" class="node">
+<title>@cpuinfo</title>
+<polygon fill="none" stroke="black" points="364.62,-36 293.62,-36 293.62,0 364.62,0 364.62,-36"/>
+<text text-anchor="middle" x="329.12" y="-14.3" font-family="Times,serif" font-size="14.00">@cpuinfo</text>
+</g>
+<!-- :cpuinfo&#45;&gt;@cpuinfo -->
+<g id="edge39" class="edge">
+<title>:cpuinfo&#45;&gt;@cpuinfo</title>
+<path fill="none" stroke="black" d="M329.12,-71.7C329.12,-63.98 329.12,-54.71 329.12,-46.11"/>
+<polygon fill="black" stroke="black" points="332.62,-46.1 329.12,-36.1 325.62,-46.1 332.62,-46.1"/>
+</g>
+<!-- :block_map&#45;&gt;:cpu_cache_params -->
+<g id="edge40" class="edge">
+<title>:block_map&#45;&gt;:cpu_cache_params</title>
+<path fill="none" stroke="black" d="M535.21,-152.24C523.2,-126.04 500.28,-76.06 486.19,-45.31"/>
+<polygon fill="black" stroke="black" points="489.29,-43.69 481.95,-36.06 482.93,-46.61 489.29,-43.69"/>
+</g>
+<!-- :kernel_avx512\n:kernel_avx\n:kernel_avx2_fma -->
+<g id="node17" class="node">
+<title>:kernel_avx512\n:kernel_avx\n:kernel_avx2_fma</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="974.12,-197 858.12,-197 858.12,-144 974.12,-144 974.12,-197"/>
+<text text-anchor="middle" x="916.12" y="-181.8" font-family="Times,serif" font-size="14.00">:kernel_avx512</text>
+<text text-anchor="middle" x="916.12" y="-166.8" font-family="Times,serif" font-size="14.00">:kernel_avx</text>
+<text text-anchor="middle" x="916.12" y="-151.8" font-family="Times,serif" font-size="14.00">:kernel_avx2_fma</text>
+</g>
+<!-- :kernel&#45;&gt;:kernel_avx512\n:kernel_avx\n:kernel_avx2_fma -->
+<g id="edge24" class="edge">
+<title>:kernel&#45;&gt;:kernel_avx512\n:kernel_avx\n:kernel_avx2_fma</title>
+<path fill="none" stroke="black" d="M916.12,-232.97C916.12,-225.45 916.12,-216.31 916.12,-207.4"/>
+<polygon fill="black" stroke="black" points="919.62,-207.16 916.12,-197.16 912.62,-207.16 919.62,-207.16"/>
+</g>
+<!-- :kernel_arm -->
+<g id="node18" class="node">
+<title>:kernel_arm</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="1075.62,-188.5 992.62,-188.5 992.62,-152.5 1075.62,-152.5 1075.62,-188.5"/>
+<text text-anchor="middle" x="1034.12" y="-166.8" font-family="Times,serif" font-size="14.00">:kernel_arm</text>
+</g>
+<!-- :kernel&#45;&gt;:kernel_arm -->
+<g id="edge23" class="edge">
+<title>:kernel&#45;&gt;:kernel_arm</title>
+<path fill="none" stroke="black" d="M941.73,-232.97C958.81,-221.6 981.47,-206.53 1000.07,-194.15"/>
+<polygon fill="black" stroke="black" points="1002.18,-196.95 1008.57,-188.5 998.3,-191.12 1002.18,-196.95"/>
+</g>
+<!-- :pack_avx2_fma\n:pack_avx\n:pack_avx512 -->
+<g id="node20" class="node">
+<title>:pack_avx2_fma\n:pack_avx\n:pack_avx512</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="839.62,-197 732.62,-197 732.62,-144 839.62,-144 839.62,-197"/>
+<text text-anchor="middle" x="786.12" y="-181.8" font-family="Times,serif" font-size="14.00">:pack_avx2_fma</text>
+<text text-anchor="middle" x="786.12" y="-166.8" font-family="Times,serif" font-size="14.00">:pack_avx</text>
+<text text-anchor="middle" x="786.12" y="-151.8" font-family="Times,serif" font-size="14.00">:pack_avx512</text>
+</g>
+<!-- :pack&#45;&gt;:pack_avx2_fma\n:pack_avx\n:pack_avx512 -->
+<g id="edge26" class="edge">
+<title>:pack&#45;&gt;:pack_avx2_fma\n:pack_avx\n:pack_avx512</title>
+<path fill="none" stroke="black" d="M700.77,-232.97C712.92,-224.22 728.11,-213.28 742.29,-203.07"/>
+<polygon fill="black" stroke="black" points="744.43,-205.84 750.5,-197.16 740.34,-200.16 744.43,-205.84"/>
+</g>
+<!-- :pack_arm -->
+<g id="node21" class="node">
+<title>:pack_arm</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="714.12,-188.5 640.12,-188.5 640.12,-152.5 714.12,-152.5 714.12,-188.5"/>
+<text text-anchor="middle" x="677.12" y="-166.8" font-family="Times,serif" font-size="14.00">:pack_arm</text>
+</g>
+<!-- :pack&#45;&gt;:pack_arm -->
+<g id="edge25" class="edge">
+<title>:pack&#45;&gt;:pack_arm</title>
+<path fill="none" stroke="black" d="M677.12,-232.97C677.12,-222.99 677.12,-210.15 677.12,-198.8"/>
+<polygon fill="black" stroke="black" points="680.62,-198.5 677.12,-188.5 673.62,-198.5 680.62,-198.5"/>
+</g>
+<!-- frontend -->
+<g id="node23" class="node">
+<title>frontend</title>
+<polygon fill="lightblue" stroke="lightblue" points="1451.12,-557 1381.12,-557 1381.12,-521 1451.12,-521 1451.12,-557"/>
+<text text-anchor="middle" x="1416.12" y="-535.3" font-family="Times,serif" font-size="14.00">Front&#45;end</text>
+</g>
+<!-- middleend -->
+<g id="node24" class="node">
+<title>middleend</title>
+<polygon fill="lightgreen" stroke="lightgreen" points="1456.12,-485 1376.12,-485 1376.12,-449 1456.12,-449 1456.12,-485"/>
+<text text-anchor="middle" x="1416.12" y="-463.3" font-family="Times,serif" font-size="14.00">Middle&#45;end</text>
+</g>
+<!-- frontend&#45;&gt;middleend -->
+<!-- backend -->
+<g id="node25" class="node">
+<title>backend</title>
+<polygon fill="#ff6a6a" stroke="#ff6a6a" points="1450.12,-413 1382.12,-413 1382.12,-377 1450.12,-377 1450.12,-413"/>
+<text text-anchor="middle" x="1416.12" y="-391.3" font-family="Times,serif" font-size="14.00">Back&#45;end</text>
+</g>
+<!-- middleend&#45;&gt;backend -->
+</g>
+</svg>