diff --git a/00_Bottlenecks.ipynb b/00_Bottlenecks.ipynb index c13468d5d3faacfbb30e2843276296716cf5c788..7e9c5a80e94ee916fbc818371c5f092fa0ece88b 100644 --- a/00_Bottlenecks.ipynb +++ b/00_Bottlenecks.ipynb @@ -11,7 +11,7 @@ "# Bottlenecks\n", "\n", "<div class=\"dateauthor\">\n", - "16 Nov 2020 | Jan H. Meinke\n", + "07 Jun 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -31,7 +31,32 @@ "metadata": { "slideshow": { "slide_type": "fragment" - } + }, + "tags": [] + }, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, + "source": [ + "Our programs may hit one or more of the following limits:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + }, + "tags": [] }, "source": [ "CPU" @@ -41,8 +66,9 @@ "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "fragment" - } + "slide_type": "notes" + }, + "tags": [] }, "source": [ "Memory" @@ -52,8 +78,9 @@ "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "fragment" - } + "slide_type": "notes" + }, + "tags": [] }, "source": [ "I/O" @@ -111,7 +138,7 @@ "source": [ "This is the limit most people think of first, but it's often not the crucial one. Each core on JUWELS can perform ca. 80 GFlop/s if the code is completely *vectorized* and performs a *multiply and an add operation* at *each step*. If your code doesn't fulfill those requirements its peak performance will be less.\n", "\n", - "Actually the peak performance is a often less because the CPU temperature limit typically soon leads to throttling when using all cores. The guaranteed sustained frequency for the JUWELS FMA units is 1.9 GHz." + "Actually the peak performance is often less because the CPU temperature limit typically soon leads to throttling when using all cores. The guaranteed sustained frequency for JUWELS' FMA units is 1.9 GHz." ] }, { @@ -439,7 +466,7 @@ "\n", "A numpy ndarray uses C-order (row-order) for storage. This means that the last index is continuous in memory and a change in any other index results in a jump from one memory location to another. The order of the loops therefore means that for both c and b, we don't get the maximum bandwidth, because we jump around and only use one element of the cache line. \n", "\n", - "A datum is not loaded by itself. Instead everytime, a datum is needed that is not available in cache, a cache line containing the datum is loaded. On JUWELS the cache line is 64 bytes wide. \n", + "A datum is not loaded by itself. Instead everytime, a datum is needed that is not available in cache, a cache line containing the datum is loaded. On JURECA the cache line is 64 bytes wide. \n", "\n", "We can improve the performance by exchanging the loops:" ] @@ -749,7 +776,7 @@ } }, "source": [ - "The scratch file system achieves read/write bandwidths that are very similar to the main memory bandwidth, but not for a single node. Each node is connected to the GPFS file system with $\\mathcal{O}(100)$ GBit/s connection. In other words, we can read/write about 12.5 GB/s. If we had to load the data in the previous calculation from disk, we could only achieve 12.5 GB/s / 24 bytes/op = 520 Mop/s. The main memory bandwidth or the peak performance of the CPU doesn't matter in this case." + "The scratch file system achieves read/write bandwidths that are very similar to the main memory bandwidth, but not for a single node. Each node is connected to the GPFS file system with $\\mathcal{O}(100)$ GBit/s connection. In other words, we can read/write about 12.5 GB/s. If we had to load the data in the previous calculation from disk, we could only achieve 12.5 GB/s / 24 bytes/op = 520 Mop/s. The main memory bandwidth or the peak performance of the CPU don't matter in this case." ] }, { @@ -766,9 +793,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -780,7 +807,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.10.1" } }, "nbformat": 4, diff --git a/01_Introduction to IPython.ipynb b/01_Introduction to IPython.ipynb index a91423bbea775fb4da0fef1432a3ab1a51e26379..2edbe59c6802026fd9c8557db3c7613236a1eea6 100644 --- a/01_Introduction to IPython.ipynb +++ b/01_Introduction to IPython.ipynb @@ -20,7 +20,7 @@ }, "source": [ "<div class=\"dateauthor\">\n", - "2 July 2019 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -289,7 +289,7 @@ }, "outputs": [], "source": [ - "%matplotlib inline\n", + "%matplotlib inline # widget is an interactive alternative to inline\n", "import matplotlib.pyplot as plt\n", "import numpy" ] @@ -937,9 +937,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -951,7 +951,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/02_NumPy_concepts.ipynb b/02_NumPy_concepts.ipynb index 1cc73ae8c614db24b707b49d6f1440435c0b98d5..a2e401d65f30cc5b317059ee5e67c636aea00d30 100644 --- a/02_NumPy_concepts.ipynb +++ b/02_NumPy_concepts.ipynb @@ -11,7 +11,7 @@ "# NumPy - an HPC perspective\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Olav Zimmermann\n", + "07 June 2021 | Olav Zimmermann\n", "</div>" ] }, @@ -50,7 +50,7 @@ } }, "source": [ - "NumPy is a library, written in C, to enable fast numerical computing in Python. Since its inception in 1995, NumPy has become first choice for numeric data processing in python. The main sacrifice to enable its high speed is the restriction to \n", + "NumPy is a library, written in C, to enable fast numerical computing in Python. Since its inception in 1995, NumPy has become the first choice for numeric data processing in python. The main sacrifice to enable its high speed is the restriction to \n", "containers with uniform memory layout, i.e., arrays that contain items of uniform static datatype." ] }, @@ -251,7 +251,7 @@ } }, "source": [ - "However, note that most functionality in NumPy is geared towards arrays of uniform numerical type. The above data type indicates that the entire row is treated as a single (albeit very complicated) type and the data in the table thereby become a one-dimensional array. If you need spreadsheet-like functionality, NumPy's 'structured arrays' or 'record type' arrays that are based on `ndarrays` are not adequate. Luckily `ndarrays` can be extended in functionality and even reimplemented in a compatible way." + "Note that most functionality in NumPy is geared towards arrays of uniform numerical type. The above data type indicates that the entire row is treated as a single (albeit very complicated) type and the data in the table thereby become a one-dimensional array. If you need spreadsheet-like functionality, NumPy's 'structured arrays' or 'record type' arrays that are based on `ndarrays` are not adequate. Luckily `ndarrays` can be extended in functionality and even reimplemented in a compatible way." ] }, { @@ -273,7 +273,7 @@ } }, "source": [ - "Due to its dual interface in Python and C and its often (not always) regular memory layout ndarrays can relatively easy be mapped to data types described in other language contexts. " + "Due to its dual interface in Python and C and its often (not always) regular memory layout `ndarrays` can relatively easily be mapped to data types described in other language contexts. " ] }, { @@ -285,7 +285,7 @@ }, "source": [ "A couple of clever design choices adds to the popularity of ndarrays as a standard API for high performance computing in Python:\n", - "- narrays support both C-style and Fortran-style memory layouts, as well as memory alignment and view interfaces.\n", + "- ndarrays support both C-style and Fortran-style memory layouts, as well as memory alignment and view interfaces.\n", "- A Mixin class `NDArrayOperatorsMixin` provides all the necessary standard python interfaces like `__add__`, `__lt__` etc. making custom array containers more convenient to write.\n", "- `ndarray.__array_ufunc__` and `__array_function__` are interfaces that split the function API from the excution engine. By overriding them, these functions allow to intercept calls to ufuncs and non-ufuncs and to dispatch these calls to alternative implementations. Several important packages already use this approach." ] @@ -345,9 +345,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -359,7 +359,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/03_ThinkVector.ipynb b/03_ThinkVector.ipynb index 9d952ae92cf099e1b559905166aa075be9b7c51b..9140a369124d7b8c1f5bef1682be1eed70731e10 100644 --- a/03_ThinkVector.ipynb +++ b/03_ThinkVector.ipynb @@ -11,7 +11,7 @@ "# Think Vector\n", "\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -823,9 +823,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -837,7 +837,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/04_Particle Dynamics.ipynb b/04_Particle Dynamics.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..f35acdc602a0a00841a738e177dd5483a1dafdae --- /dev/null +++ b/04_Particle Dynamics.ipynb @@ -0,0 +1,349 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5451ef11-f683-4995-bda8-c9d87abaec49", + "metadata": {}, + "source": [ + "# Particle Dynamics with Python\n", + "<div class=\"dateauthor\">\n", + "07 June 2021 | Jan H. Meinke\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5822f3b3-bc03-4e2f-85f1-57cb246e3a05", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "import random\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7d1939b-7d73-4c0c-9d8a-d6ea39d48b49", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, + { + "cell_type": "markdown", + "id": "19819e70-b42c-405a-958f-70c05a972ee6", + "metadata": {}, + "source": [ + "Particle dynamics simulations are common in various scientific fields. They are used to simulate \n", + "the formation of galaxies and the movements of molecules in a cell. Particles can have different\n", + "properties such as mass and charge and interact in different ways.\n", + "\n", + "A classical particle dynamics code solves Newton's equation of motion:\n", + "\n", + "$$\\mathbf F = m \\mathbf a,$$\n", + "\n", + "where $\\mathbf F$ is the force, $m$ the mass, and $\\mathbf a$ the acceleration. $\\mathbf F$ and \n", + "$\\mathbf a$ are vectors.\n", + "\n", + "In general, this problem is only solvable analytically for two particles. If there are more \n", + "particles, we have to look for a numerical solution.\n", + "\n", + "You may remember that you can calculate the velocity $\\mathbf v$ of a particle as\n", + "\n", + "$$\\mathbf v(t + dt) = \\mathbf v(t) + \\mathbf a(t) dt$$\n", + "\n", + "and the position $\\mathbf r$ as\n", + "\n", + "$$\\mathbf r(t + dt) = \\mathbf r(t) + \\mathbf v(t)dt + \\frac 1 2 \\mathbf a(t) dt^2.$$\n", + "\n", + "If we know all the positions, velocities and masses at time $t$ and can calculate the forces, we \n", + "can follow the motion of the particles over time." + ] + }, + { + "cell_type": "markdown", + "id": "50ad1731-c5b0-4922-adc8-14e507a7b6b8", + "metadata": {}, + "source": [ + "## Gravitational force\n", + "Let's assume our particles only interact via gravity. Then the force between two particles is given \n", + "by\n", + "\n", + "$$\\mathbf F_{ij}(t) = G\\frac{m_i m_j}{r_{ij}^2(t)} \\mathbf {\\hat r}_{ij}(t),$$\n", + "\n", + "where $\\mathbf F_{ij}(t)$ is the force on particle $i$ due to particle $j$. $r_{ij}(t)$ is the \n", + "distance between particles $i$ and $j$, and $\\mathbf {\\hat r}_{ij}(t)$ is the unit vector pointing\n", + "from $i$ to $j$.\n", + "\n", + "To get the total force on particle $i$, we need to sum over all $j \\neq i$:\n", + "\n", + "$$\\mathbf F_{i}(t) = \\sum_{j\\neq i} \\mathbf F_{ij}(t).$$" + ] + }, + { + "cell_type": "markdown", + "id": "32f7c975-ed21-4c70-9168-5b7bfa5ca276", + "metadata": {}, + "source": [ + "## The algorithm" + ] + }, + { + "cell_type": "markdown", + "id": "4288de12-8bf3-41b2-96ca-5c3c47fc0d84", + "metadata": {}, + "source": [ + "1. Calculate the force on each particle by summing up all the forces acting on it.\n", + "2. Integrate the equation of motion\n", + "\n", + " a) Calculate the position of each particle after a time step *dt*\n", + " \n", + " b) Calculate the velocity of each particle after a time step *dt*" + ] + }, + { + "cell_type": "markdown", + "id": "539c2d60-df7b-471b-a438-d9b4efb51781", + "metadata": {}, + "source": [ + "## (Parallel) Patterns\n", + "In Think Vector, we got to know some patterns. Let's see how we can apply them here:\n", + "\n", + "(i, j) -> $\\mathbf F_{ij}$:\n", + " This is a map\n", + " \n", + "$\\mathbf F_{ij}$ -> $\\mathbf F_{i}$:\n", + " This is a reduction\n", + " \n", + "Calulate the new velocity:\n", + " This is map\n", + " \n", + "Calculate the new position:\n", + " This is a map, too.\n", + " \n", + "Now, let's try to express this in code.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4525c8a-378a-45b7-b1e2-b67f5f07d397", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize positions and velocities\n", + "N = 50\n", + "L2 = 5 # half the length of the box size\n", + "epsilon = 1e-9 # softening factor\n", + "dt = 0.1 # time step\n", + "G = 1 # For simplicity we set the universal graviational constant to 1\n", + "m = 1 # This corresponds to 150 x 10^9 kg\n", + "x = [random.uniform(-L2, L2) for i in range(N)]\n", + "y = [random.uniform(-L2, L2) for i in range(N)]\n", + "z = [random.uniform(-L2, L2) for i in range(N)]\n", + "vx = [0 for i in range(N)]\n", + "vy = [0 for i in range(N)]\n", + "vz = [0 for i in range(N)]" + ] + }, + { + "cell_type": "markdown", + "id": "8fd053d2-8c88-4666-82ed-0316fe21ac34", + "metadata": {}, + "source": [ + "### Calculating forces" + ] + }, + { + "cell_type": "markdown", + "id": "41861767-e08d-45b8-802a-28b269e3f7ee", + "metadata": {}, + "source": [ + "To calculate the force, we need the distance vector first. These are actually 3 maps (one for each component). The result is a distance matrix. As mentioned before maps are expressed as list generators:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "338142b6-f973-4f7a-b5a4-77e76f3b758f", + "metadata": {}, + "outputs": [], + "source": [ + "Dxx = [(i - j) for j in x for i in x]\n", + "Dyy = [(i - j) for j in y for i in y]\n", + "Dzz = [(i - j) for j in z for i in z]\n", + "D = [math.sqrt(i * i + j * j + k * k) for i, j, k in zip(Dxx, Dyy, Dzz)]" + ] + }, + { + "cell_type": "markdown", + "id": "d0156a2d-13ae-46dd-b3a8-cb7eb1aca0bf", + "metadata": {}, + "source": [ + "Now that we have the vector components and the magnitude of the vector, we can calculate the forces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e841a076-504d-445b-b006-b931e3cb0bc2", + "metadata": {}, + "outputs": [], + "source": [ + "Fxx = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dxx, D)] # epsilon prevents a zero in the dominator.\n", + "Fyy = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dyy, D)]\n", + "Fzz = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dzz, D)]\n", + "Fx = [sum(Fxx[i * N: (i + 1) * N]) for i in range(N)]\n", + "Fy = [sum(Fyy[i * N: (i + 1) * N]) for i in range(N)]\n", + "Fz = [sum(Fzz[i * N: (i + 1) * N]) for i in range(N)]" + ] + }, + { + "cell_type": "markdown", + "id": "3de052ac-7591-4477-8285-cc15c0019a7a", + "metadata": {}, + "source": [ + "Let's visualize the forces on the particles:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1133b4bb-111b-4aca-9326-22a7c29c8522", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plt.figure(figsize=(6, 6)).add_subplot(projection='3d')\n", + "ax.scatter3D(x, y, z)\n", + "ax.quiver(x, y, z, Fx, Fy, Fz)" + ] + }, + { + "cell_type": "markdown", + "id": "ccea23e5-4f4b-4ff6-b379-8d45e3fe15f4", + "metadata": {}, + "source": [ + "### Integrating the equation of motion" + ] + }, + { + "cell_type": "markdown", + "id": "dba27f9b-350e-4e65-9f42-e3615ee30a84", + "metadata": {}, + "source": [ + "We are ready to update the positions and velocities of our particles:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ddc24f9-eaf3-491c-bf81-232efa584c1c", + "metadata": {}, + "outputs": [], + "source": [ + "x = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(x, vx, Fx)]\n", + "y = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(y, vy, Fy)]\n", + "z = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(z, vz, Fz)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2266d4e8-8f67-4979-ae47-abf8508673a4", + "metadata": {}, + "outputs": [], + "source": [ + "vx = [v + f / m * dt for v, f in zip(vx, Fx)]\n", + "vy = [v + f / m * dt for v, f in zip(vy, Fy)]\n", + "vz = [v + f / m * dt for v, f in zip(vz, Fz)]" + ] + }, + { + "cell_type": "markdown", + "id": "e4cff076-759c-477c-9758-41bb730cd606", + "metadata": {}, + "source": [ + "Let's take a look at the particle positions and velocities:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf48e0d0-34f6-47ba-8a30-ba0c1e19489d", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plt.figure(figsize=(6, 6)).add_subplot(projection='3d')\n", + "ax.scatter3D(x, y, z)\n", + "ax.quiver(x, y, z, vx, vy, vz)" + ] + }, + { + "cell_type": "markdown", + "id": "65984f53-4b54-4f6d-aaa1-6de391150539", + "metadata": {}, + "source": [ + "That's it. By going back to the [calculation of the forces](#Calculating-forces), we can follow the motion of the particles over time." + ] + }, + { + "cell_type": "markdown", + "id": "f1f30004-a9c3-4499-84e0-976937b9f8a8", + "metadata": {}, + "source": [ + "## Exercise\n", + "Rewrite the program in a vectorized manner using `ndarray`s." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "039819a6-698f-43a6-a4f0-4f7b8852fbb1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "8cb45f43-29e2-49df-a976-bf7790fe5a44", + "metadata": {}, + "source": [ + "### Solution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f236119-af8c-499d-86cf-1d6b98f9e5fd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "HPC Python 2021", + "language": "python", + "name": "hpcpy21" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/04_Profiling a simple md code.ipynb b/05_Profiling a simple md code.ipynb similarity index 99% rename from 04_Profiling a simple md code.ipynb rename to 05_Profiling a simple md code.ipynb index 070a3a51963ad3e48835c40ef39d1a221793ca08..851adf7b09e9fcc72457ec1ec4424b124f901e87 100644 --- a/04_Profiling a simple md code.ipynb +++ b/05_Profiling a simple md code.ipynb @@ -10,7 +10,7 @@ "source": [ "# Profiling\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -626,9 +626,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -640,7 +640,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/05_Debugging.ipynb b/06_Debugging.ipynb similarity index 98% rename from 05_Debugging.ipynb rename to 06_Debugging.ipynb index 23ef132e8779bd8d3b39b994027f7677378c6cbf..22117b23f48eb2426597982c144d0aadf923c7de 100644 --- a/05_Debugging.ipynb +++ b/06_Debugging.ipynb @@ -6,7 +6,7 @@ "source": [ "# Debugging Python\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -183,7 +183,7 @@ "metadata": {}, "source": [ "```bash\n", - "source hpcpy20\n", + "source hpcpy21\n", "pudb3 buggy.py\n", "```" ] @@ -325,9 +325,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -339,7 +339,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/06_IDEs.ipynb b/07_IDEs.ipynb similarity index 97% rename from solutions/06_IDEs.ipynb rename to 07_IDEs.ipynb index 4ed11a5d16378180315afa4e853b491f3b6e01cf..ba2acfd2506f6c71080e8dec05a8cd0fe28ff46a 100644 --- a/solutions/06_IDEs.ipynb +++ b/07_IDEs.ipynb @@ -11,7 +11,7 @@ "# Integrated Development Environments (IDEs) for Python\n", "\n", "<div class=\"dateauthor\">\n", - "3 July 2019 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -254,9 +254,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -268,7 +268,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/07_LocalParallel.ipynb b/08_LocalParallel.ipynb similarity index 97% rename from solutions/07_LocalParallel.ipynb rename to 08_LocalParallel.ipynb index ff6caa38678c4c53b7c35298e3b4f778c640004f..6bb08b74edee33ce757f9e31dd0f0d8c5017a3ae 100644 --- a/solutions/07_LocalParallel.ipynb +++ b/08_LocalParallel.ipynb @@ -11,7 +11,7 @@ "# Interactive Parallel Computing with IPython Parallel\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -27,7 +27,7 @@ "\n", "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`.\n", + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`.\n", "\n", "In the terminal type ``ipcluster``. You'll see the help message telling you that you need to give it subcommand. Take a look at the message and then enter \n", "\n", @@ -535,7 +535,7 @@ }, "outputs": [], "source": [ - "c = dview.apply(np.dot, a, b) # This uses a and b from the notebook" + "c = dview.apply(lambda a,b: np.dot(a,b), a, b) # This uses a and b from the notebook" ] }, { @@ -1032,7 +1032,7 @@ } }, "source": [ - "Latency (the time until something happens) and bandwith (the amount of data we get through the network) are two important properties of your parallel system that define what is practical and what is not. We will use the ``%timeit`` magic to measure these properties. ``%timit`` and its sibbling ``%%timeit`` measure the run time of a statement (cell in the case of ``%%timeit``) by executing the statement multiple times (by default at least 3 times). For short running routines many loops of 3 executions are performed and the minimum time measured is then displayed. The number of loops and the number of executions can be adjusted. Take a look at the documentation. Give it a try." + "Latency (the time until something happens) and bandwidth (the amount of data we get through the network) are two important properties of your parallel system that define what is practical and what is not. We will use the ``%timeit`` magic to measure these properties. ``%timit`` and its sibbling ``%%timeit`` measure the run time of a statement (cell in the case of ``%%timeit``) by executing the statement multiple times (by default at least 3 times). For short running routines many loops of 3 executions are performed and the minimum time measured is then displayed. The number of loops and the number of executions can be adjusted. Take a look at the documentation. Give it a try." ] }, { @@ -1338,8 +1338,8 @@ }, "outputs": [], "source": [ - "bwmax = len(rc) * 256 * 8 / 12.1e-3\n", - "bwmin = len(rc) * 8 / 9.05e-3\n", + "bwmax = len(rc) * 256 * 8 / 9.8e-3\n", + "bwmin = len(rc) * 8 / 6.1e-3\n", "print(\"The bandwidth is between %.2f kB/s and %.2f kB/s.\" %( bwmin, bwmax))" ] }, @@ -1800,9 +1800,9 @@ "metadata": { "celltoolbar": "Slideshow", "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1814,7 +1814,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/solutions/08_LocalTaskParallel.ipynb b/09_LocalTaskParallel.ipynb similarity index 99% rename from solutions/08_LocalTaskParallel.ipynb rename to 09_LocalTaskParallel.ipynb index c98ba02f64ae9d81a83ee6c2d1d7157810fb2c7b..0d7e42b46e32c60f582c9b801c539125f1ea205d 100644 --- a/solutions/08_LocalTaskParallel.ipynb +++ b/09_LocalTaskParallel.ipynb @@ -336,9 +336,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -350,7 +350,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/09_Numba vectorize.ipynb b/10_Numba vectorize.ipynb similarity index 97% rename from 09_Numba vectorize.ipynb rename to 10_Numba vectorize.ipynb index bd1e1cd0a954a87b740046ec119351d013814914..aa68cb0e50f3d8ef66a305601f887905f80fe2cf 100644 --- a/09_Numba vectorize.ipynb +++ b/10_Numba vectorize.ipynb @@ -11,7 +11,7 @@ "# Numba vectorize\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -514,7 +514,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, "outputs": [], "source": [ "%timeit M = escape_time_vec(P, 50)" @@ -523,16 +528,21 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -544,7 +554,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/10_NumbaIntro.ipynb b/11_NumbaIntro.ipynb similarity index 97% rename from 10_NumbaIntro.ipynb rename to 11_NumbaIntro.ipynb index 616ce583493c8222753ef75d1f8d15664a3f4000..f321ee281f88d8f8c9de39cbedf61b58fa9c0105 100644 --- a/10_NumbaIntro.ipynb +++ b/11_NumbaIntro.ipynb @@ -11,7 +11,7 @@ "# Introduction to Numba's jit compiler\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -101,7 +101,7 @@ } }, "source": [ - "When we call `python_sum`, the interpreter goes through it line by line. For each item it has to interpret `res += x` and execute it, i.e., call apropriate C routines that have been compiled for the processor. The only requirements for `a` in this function ar that it is iterable and its elements support the `+` operator. For the following little benchmark, we'll use an `ndarray` of random numbers." + "When we call `python_sum`, the interpreter goes through it line by line. For each item it has to interpret `res += x` and execute it, i.e., call apropriate C routines that have been compiled for the processor. The only requirements for `a` in this function are that it is iterable and its elements support the `+` operator. For the following little benchmark, we'll use an `ndarray` of random numbers." ] }, { @@ -184,8 +184,8 @@ } }, "source": [ - "In compiled languages such as C, C++, Fortran, and Rust a compiler would translate the code once \n", - "and store the results in machine code for a particular processor, but it doesn't translate it \n", + "In compiled languages such as C, C++, Fortran, and Rust a compiler translates the code once \n", + "and stores the results in machine code for a particular processor. It doesn't have to translate it \n", "literally, but can look for optimization and map the work optimally to the capabilities of the \n", "processor. That's what makes this much faster but also less flexible. In C++ the sum may be written \n", "like this:" @@ -274,7 +274,7 @@ } }, "source": [ - "Compiling a program to machine code involves at least to phases. In the first phase the human readable \n", + "Compiling a program to machine code involves at least two phases. In the first phase the human readable \n", "program is translated into something that is more palable to a computer such as an \n", "[abstract syntax tree][AST] or [AST][]. Many compilers then perform a first analysis and pattern \n", "matching on the [AST][] before machine specific optimization are applied.\n", @@ -614,7 +614,7 @@ }, "outputs": [], "source": [ - "print(\"The version of numpy, we used has been compiled against Intel's math kernel library (MKL) and is therefore about %.0f times faster.\" \n", + "print(\"The version of numpy, we used has been compiled against Intel's math kernel library (MKL) and is therefore about %.0f times faster. \" \n", " \"If we used a version that has not been compiled against a fast BLAS library, it would take about the same time as the numba routine.\" \n", " % (t_numba_mm_1000.best / t_numpy_mm_1000.best))" ] @@ -1184,9 +1184,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1198,7 +1198,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/11_Speeding up your code with Cython.ipynb b/12_Speeding up your code with Cython.ipynb similarity index 99% rename from 11_Speeding up your code with Cython.ipynb rename to 12_Speeding up your code with Cython.ipynb index 43de721f76282290b22eec08eea0493a64c232bf..732e0f6ab345507b0308a40082a8bff2d4e04c47 100644 --- a/11_Speeding up your code with Cython.ipynb +++ b/12_Speeding up your code with Cython.ipynb @@ -20,7 +20,7 @@ }, "source": [ "<div class=\"dateauthor\">\n", - "18 November 2020 | Jan H. Meinke\n", + "09 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -805,7 +805,7 @@ } }, "source": [ - "**Exercise:** Take the Cython code that defines dot using `prange` in [Adding OpenMP](#Adding-OpenMP) and write it to `dot.pyx` using the `%%writefile` magic. Make sure to comment out the `cython magic`. Take the above code for setup.py and copy it into a file called `setup.py`. Change the setup.py code to build a module named dot and use `dot.pyx`. Then build the extension in a terminal window with the command. **Note:** Make sure our environment is loaded `source hpcpy20`.\n", + "**Exercise:** Take the Cython code that defines dot using `prange` in [Adding OpenMP](#Adding-OpenMP) and write it to `dot.pyx` using the `%%writefile` magic. Make sure to comment out the `cython magic`. Take the above code for setup.py and copy it into a file called `setup.py`. Change the setup.py code to build a module named dot and use `dot.pyx`. Then build the extension in a terminal window with the command. **Note:** Make sure our environment is loaded `source hpcpy21`.\n", "\n", "```bash\n", "python setup.py build_ext --inplace\n", @@ -1263,9 +1263,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1277,7 +1277,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/12_Writing your own Python bindings.ipynb b/13_Writing your own Python bindings.ipynb similarity index 97% rename from 12_Writing your own Python bindings.ipynb rename to 13_Writing your own Python bindings.ipynb index 239be1a6a1d3529dad9c3ca762ec1f20f013ec75..e8371ed6cc93bbb2a74979c8e3c39f29a3cb4c01 100644 --- a/12_Writing your own Python bindings.ipynb +++ b/13_Writing your own Python bindings.ipynb @@ -16,7 +16,7 @@ "metadata": {}, "source": [ "<div class=\"dateauthor\">\n", - "18 November 2020 | Jan H. Meinke\n", + "09 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -92,7 +92,7 @@ "\n", "Wait until the build has finished and then continue with this notebook.\n", "\n", - "**Tip:** You can open a terminal from within JupyterLab by going to File->New->Terminal. To get the right environment in a terminal `source hpcpy20` in the tutorial directory." + "**Tip:** You can open a terminal from within JupyterLab by going to File->New->Terminal. To get the right environment in a terminal `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -268,11 +268,11 @@ "source": [ "### Exercise\n", "Use the terminal that you used earlier to run `build.sh` or open a new one. Make sure you are in the \n", - "tutorial directory. Source `hpcpy20` using `source hpcpy20`. Change into code/textstats/ and compile \n", + "tutorial directory. Source `hpcpy21` using `source hpcpy21`. Change into code/textstats/ and compile \n", "the file word_frequency.F90 with the following command:\n", "\n", "```bash\n", - "ifort word_frequency.F90 -shared -O2 -o build/libwf.so -fPIC\n", + "gfortran word_frequency.F90 -shared -O2 -o build/libwf.so -fPIC\n", "```\n", "\n", "```bash\n", @@ -311,7 +311,7 @@ } }, "source": [ - "If you compiled the library with the option `-assume nounderscore`, you could use the original declaration without underscore with libwf.so.\n", + "If you compiled the library with the option `-fno-underscoring`, you could use the original declaration without underscore with libwf.so.\n", "\n", "**Note**: There is no way to *reload* a library using cffi." ] @@ -577,7 +577,7 @@ " ct: int \n", " number of occurences of word in file with filename\n", " \"\"\"\n", - " # We first need to decode the strings\n", + " # We first need to encode the strings\n", " filenameb = filename.encode('UTF-8')\n", " wordb = word.encode('UTF-8')\n", " # Now we can convert them to C strings\n", @@ -1027,7 +1027,7 @@ "This code can be compiled like this:\n", "\n", "```bash\n", - "icpc -O3 -shared -fpic -std=c++14 `python3-config --includes` -I/p/project/training2020/packages/lib/python3.8/site-packages/pybind11/include -I code/text_stats `python3-config --cflags --ldflags` code/text_stats/text_stats_bind.cpp -o text_stats.so -L code/text_stats/build -ltext_stats\n", + "g++ -O3 -shared -fpic -std=c++14 `python3-config --includes` `python -m pybind11 --includes` -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats \n", "```" ] }, @@ -1041,7 +1041,7 @@ }, "outputs": [], "source": [ - "!icpc -O3 -shared -fpic -std=c++14 `python3-config --includes` -I/p/project/training2020/packages/lib/python3.8/site-packages/pybind11/include -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats " + "!g++ -O3 -shared -fpic -std=c++14 `python3-config --includes` `python -m pybind11 --includes` -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats " ] }, { @@ -1481,9 +1481,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1495,7 +1495,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/13_Introduction to Dask.ipynb b/14_Introduction to Dask.ipynb similarity index 99% rename from 13_Introduction to Dask.ipynb rename to 14_Introduction to Dask.ipynb index 35f2975ddb44e16f24caf1e5dfd048341cc03774..62c461d7664e956409580fa8b84c993ac8e4f709 100644 --- a/13_Introduction to Dask.ipynb +++ b/14_Introduction to Dask.ipynb @@ -11,7 +11,7 @@ "# Introduction to Dask\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Olav Zimmermann\n", + "10 June 2021 | Olav Zimmermann\n", "</div>" ] }, @@ -583,9 +583,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -597,7 +597,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/14_Introduction to MPI.ipynb b/15_Introduction to MPI.ipynb similarity index 97% rename from 14_Introduction to MPI.ipynb rename to 15_Introduction to MPI.ipynb index 60062bb5e81396f89fc3a9f6b99f32dbc94b74a9..36abfc6b90343818c9c838cc9e562bb3a3329ff5 100644 --- a/14_Introduction to MPI.ipynb +++ b/15_Introduction to MPI.ipynb @@ -11,7 +11,7 @@ "# Introduction to MPI\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Jan H. Meinke\n", + "10 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -95,7 +95,7 @@ "\n", "For each `Send` there has to be a matching `Recv`. This means that the meta information has to fit (including the tag). There are some wildcards and some additional commands that make this more flexible.\n", "\n", - "Sending and receiving can be blocking or non-blocking. In the latter case, the flow of the program continuous after the call. In the former the program waits until the message has been transmitted. There is a very real danger for deadlocks here!" + "Sending and receiving can be blocking or non-blocking. In the non-blocking case, the flow of the program continuous after the call. In the blocking case the program waits until the message has been transmitted. There is a very real danger for deadlocks here!" ] }, { @@ -233,7 +233,7 @@ "source": [ "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`." + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -1061,7 +1061,7 @@ " above to parallelize the program using MPI over 3 domains using 3 MPI ranks. Construct the grid \n", " in such a way that you can easily divide it into 3 domains. Use [point to point communication](#Point-to-point). The program should run to convergence determined by epsilon just as before.\n", "\n", - " Tip: It may be easier to turn the problem by 90° or use Fortran order for the NumPy arrays.\n", + " Tip: It may be easier to rotate the problem by 90° or use Fortran order for the NumPy arrays.\n", " \n", "2. Extend the program from the first part of the exercise to use more than 3 ranks with 1 domain \n", " per rank.\n", @@ -1219,7 +1219,7 @@ } }, "source": [ - "Elimintating $t_1$, we get" + "Eliminating $t_1$, we get" ] }, { @@ -1267,7 +1267,7 @@ } }, "source": [ - "Let's plot this vs the number of processors." + "Let's plot this vs. the number of processors." ] }, { @@ -1443,7 +1443,7 @@ "source": [ "# This cell is executed within the notebook. The engines don't know anything about it\n", "rng = numpy.random.Generator(numpy.random.MT19937())\n", - "a = np.random.normal(size=100000)" + "a = numpy.random.normal(size=100000)" ] }, { @@ -1508,7 +1508,7 @@ "outputs": [], "source": [ "%%px\n", - "sum_partial = np.sum(a_partial)\n", + "sum_partial = numpy.sum(a_partial)\n", "total = comm.reduce(sum_partial)" ] }, @@ -1563,13 +1563,20 @@ "source": [ "sum(sum_partial)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1581,7 +1588,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/15_Introduction to CuPy.ipynb b/16_Introduction to CuPy.ipynb similarity index 98% rename from 15_Introduction to CuPy.ipynb rename to 16_Introduction to CuPy.ipynb index 38287e1b35e2805ae15de5e85e45beba6fcaab5a..f0f0f668928e2c4a5c9524c49f1dd4693e271a57 100644 --- a/15_Introduction to CuPy.ipynb +++ b/16_Introduction to CuPy.ipynb @@ -10,7 +10,7 @@ "source": [ "# Introduction to CuPy\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Jan H. Meinke\n", + "10 June 2021 | Jan H. Meinke\n", "</div>\n", "<img src=\"images/cupy.png\" style=\"float:right\">" ] @@ -364,9 +364,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -378,7 +378,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/16_CUDA for Python.ipynb b/17_CUDA for Python.ipynb similarity index 99% rename from 16_CUDA for Python.ipynb rename to 17_CUDA for Python.ipynb index e11ca82cd01bf04f21f9d96c7a6cb6d40456a050..54d8689ea235ff26a52671c7652dfc745f3d3ee6 100644 --- a/16_CUDA for Python.ipynb +++ b/17_CUDA for Python.ipynb @@ -11,7 +11,7 @@ "# Numba and GPUs\n", "\n", "<div class=\"dateauthor\">\n", - "20 November 2020 | Jan H. Meinke\n", + "11 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -1162,9 +1162,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1176,7 +1176,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/17_CUDA and MPI.ipynb b/18_CUDA and MPI.ipynb similarity index 96% rename from 17_CUDA and MPI.ipynb rename to 18_CUDA and MPI.ipynb index a67e71fddc716c1009491c85154a1b935905da64..1ea20187f24b6d34e39e17a2605025c2975f83b7 100644 --- a/17_CUDA and MPI.ipynb +++ b/18_CUDA and MPI.ipynb @@ -11,7 +11,7 @@ "# CUDA for Python and MPI4Py\n", "\n", "<div class=\"dateauthor\">\n", - "20 November 2020 | Jan H. Meinke\n", + "11 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -58,7 +58,7 @@ "source": [ "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`." + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -73,7 +73,7 @@ "\n", "```bash\n", "export OMP_NUM_THREADS=10\n", - "srun -n 4 -c 12 ipengine start\n", + "srun -n 4 -c 10 ipengine start\n", "```" ] }, @@ -106,7 +106,7 @@ "source": [ "%%px\n", "# Let's ignore some deprecation warnings\n", - "from numba.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning\n", + "from numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning\n", "import warnings\n", "\n", "warnings.simplefilter('ignore', category=NumbaDeprecationWarning)\n", @@ -497,9 +497,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -511,7 +511,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/README.md b/README.md deleted file mode 100644 index c50d582078b1e203aee668b6f74417e78915b269..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# HPC Python - -Material for High-performance computing with Python. \ No newline at end of file diff --git a/build.sh b/build.sh index 9509e2fd8d6ad601ca5e0c3493d74093b4d206a5..399a64bbf6b0e4fbd0c70a18df6ca3af2c9d0aba 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ pushd code/point rm -rf build mkdir -p build cd build -CC=icc CXX=icpc cmake .. > /dev/null +CC=gcc CXX=gcc cmake .. > /dev/null make popd @@ -14,6 +14,6 @@ pushd code/text_stats rm -rf build mkdir -p build cd build -CC=icc CXX=icpc cmake .. > /dev/null +CC=gcc CXX=g++ cmake .. > /dev/null make popd diff --git a/code/text_stats/.ipynb_checkpoints/text_stats_bind-checkpoint.cpp b/code/text_stats/.ipynb_checkpoints/text_stats_bind-checkpoint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..20f6cd5d8eea5368f82175cfc1d8b0dfaa1ecdc1 --- /dev/null +++ b/code/text_stats/.ipynb_checkpoints/text_stats_bind-checkpoint.cpp @@ -0,0 +1,25 @@ +#include <pybind11/pybind11.h> + +extern "C" { + #include <text_stats.h> +} + +namespace py = pybind11; // This is purely for convenience + +PYBIND11_MODULE(text_stats, m){ + m.doc() = "Some functions that provide statistical information about a text."; + m.def("word_frequency", &word_frequency, R"doc(Counts the occurences of a string in a file. + +Paramters +--------- +filename: string + name of file to open +word: string + string to look for in file + +Returns +------- +ct: int + number of occurences of word in file with filename +)doc"); +} diff --git a/code/text_stats/text_stats_bind.cpp b/code/text_stats/text_stats_bind.cpp index 277ec9eb224b9983b5257fa6fe9995dd3cd42c26..20f6cd5d8eea5368f82175cfc1d8b0dfaa1ecdc1 100644 --- a/code/text_stats/text_stats_bind.cpp +++ b/code/text_stats/text_stats_bind.cpp @@ -6,8 +6,8 @@ extern "C" { namespace py = pybind11; // This is purely for convenience -PYBIND11_PLUGIN(text_stats){ - py::module m("text_stats", "Some functions that provide statistical information about a text."); +PYBIND11_MODULE(text_stats, m){ + m.doc() = "Some functions that provide statistical information about a text."; m.def("word_frequency", &word_frequency, R"doc(Counts the occurences of a string in a file. Paramters @@ -22,6 +22,4 @@ Returns ct: int number of occurences of word in file with filename )doc"); - - return m.ptr(); } diff --git a/hpcpy20 b/hpcpy21 old mode 100644 new mode 100755 similarity index 54% rename from hpcpy20 rename to hpcpy21 index d159b3d60a27bd37d33479d58a9295a77fcf03e2..9047da7ad17d6701a4eb170be7776c52fb6c92a1 --- a/hpcpy20 +++ b/hpcpy21 @@ -1,20 +1,20 @@ #!/bin/bash module purge --force module load Stages/2020 -module load Intel +module load GCC module load ParaStationMPI module load Graphviz module load SciPy-Stack module load numba module load dask module load mpi4py +module load Jupyter module load CUDA -module load CMake #export NUMBAPRO_NVVM=$CUDA_HOME/nvvm/lib64/libnvvm.so #export NUMBAPRO_LIBDEVICE=$CUDA_HOME/nvvm/libdevice -export LD_LIBRARY_PATH=/p/project/training2020/resources/code/text_stats/build:$LD_LIBRARY_PATH -export LD_LIBRARY_PATH=/p/project/training2020/resources/code/point/build:$LD_LIBRARY_PATH -export PYTHONPATH=/p/project/training2020/packages/lib/python3.8/site-packages:$PYTHONPATH -export PATH=$PATH:/p/project/training2020/packages/bin -export PS1='π20[\u@\h \W]\$ ' - +export LD_LIBRARY_PATH=/p/project/training2114/resources/code/text_stats/build:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=/p/project/training2114/resources/code/point/build:$LD_LIBRARY_PATH +export PYTHONPATH=/p/project/training2114/packages/lib/python3.8/site-packages:$PYTHONPATH +export PATH=$PROJECT_training2114/packages/bin:$PATH +export HPCPY2021=1 +export PS1='π21[\u@\h \W]\$ ' diff --git a/images/basic_computer_architecture.svg b/images/basic_computer_architecture.svg new file mode 100644 index 0000000000000000000000000000000000000000..ea79b090a1d967ff5fb3ce706cc8c0cd3f12b8eb --- /dev/null +++ b/images/basic_computer_architecture.svg @@ -0,0 +1,1092 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="297mm" + height="210mm" + viewBox="0 0 297 210" + version="1.1" + id="svg8" + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + sodipodi:docname="basic_computer_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"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="7.4299226 : 99.168451 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="224.97788 : 116.91307 : 1" + inkscape:persp3d-origin="148.5 : 70 : 1" + id="perspective1426" /> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Drop Shadow" + id="filter1404" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-5"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-4" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-7" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-6" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-5" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-6" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-3" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-6" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-75" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-3" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-56" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-2" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.9899495" + inkscape:cx="561.13973" + inkscape:cy="409.61685" + inkscape:document-units="mm" + inkscape:current-layer="layer5" + inkscape:document-rotation="0" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1920" + inkscape:window-height="1114" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> + <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="CPU" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <g + id="g986" + transform="translate(0,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404)" + id="rect833" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909"><tspan + sodipodi:role="line" + id="tspan907" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5"><tspan + sodipodi:role="line" + id="tspan907-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2"><tspan + sodipodi:role="line" + id="tspan907-9" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1"><tspan + sodipodi:role="line" + id="tspan907-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26"><tspan + sodipodi:role="line" + id="tspan907-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8"><tspan + sodipodi:role="line" + id="tspan907-6-7" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9"><tspan + sodipodi:role="line" + id="tspan907-9-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0"><tspan + sodipodi:role="line" + id="tspan907-2-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9"><tspan + sodipodi:role="line" + id="tspan907-7" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3"><tspan + sodipodi:role="line" + id="tspan907-6-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1"><tspan + sodipodi:role="line" + id="tspan907-9-29" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3"><tspan + sodipodi:role="line" + id="tspan907-2-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3"><tspan + sodipodi:role="line" + id="tspan907-61" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0"><tspan + sodipodi:role="line" + id="tspan907-6-63" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2"><tspan + sodipodi:role="line" + id="tspan907-9-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6"><tspan + sodipodi:role="line" + id="tspan907-2-15" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748"><tspan + sodipodi:role="line" + id="tspan1746" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + <g + id="g986-9" + style="display:inline" + transform="translate(67.180138,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404-3)" + id="rect833-1" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987-2" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-70" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-93"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-6" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-2" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-6"><tspan + sodipodi:role="line" + id="tspan907-18" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-7"><tspan + sodipodi:role="line" + id="tspan907-6-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-20"><tspan + sodipodi:role="line" + id="tspan907-9-23" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-7"><tspan + sodipodi:role="line" + id="tspan907-2-5" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7-9" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0-2" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9-2"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6-9" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0-7" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6-3" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26-6"><tspan + sodipodi:role="line" + id="tspan907-1-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8-2"><tspan + sodipodi:role="line" + id="tspan907-6-7-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9-3"><tspan + sodipodi:role="line" + id="tspan907-9-2-1" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0-9"><tspan + sodipodi:role="line" + id="tspan907-2-2-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3-7" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7-8" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9-5" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9-1"><tspan + sodipodi:role="line" + id="tspan907-7-0" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3-6"><tspan + sodipodi:role="line" + id="tspan907-6-6-3" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1-2"><tspan + sodipodi:role="line" + id="tspan907-9-29-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3-6"><tspan + sodipodi:role="line" + id="tspan907-2-1-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9-5" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4-5" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8-7" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3-9"><tspan + sodipodi:role="line" + id="tspan907-61-3" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0-7"><tspan + sodipodi:role="line" + id="tspan907-6-63-4" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2-5"><tspan + sodipodi:role="line" + id="tspan907-9-0-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6-5"><tspan + sodipodi:role="line" + id="tspan907-2-15-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704-7" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-4" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6-4" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5-3" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63-0" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748-7"><tspan + sodipodi:role="line" + id="tspan1746-8" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="Memory"> + <rect + style="opacity:0.8;fill:#0e5412;fill-opacity:0.960784;stroke:#ffffff;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1342" + width="139.26747" + height="45.219032" + x="86.549896" + y="129.39824" + ry="6.5372772" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="131.79796" + y="155.7377" + id="text1346"><tspan + sodipodi:role="line" + id="tspan1344" + x="131.79796" + y="155.7377" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Main Memory</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="Busses"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 121.10397,97.684615 V 129.80068" + id="path1349" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 116.29799,97.797141 V 129.9132" + id="path1349-8" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 126.3751,97.797141 V 129.91321" + id="path1349-84" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 188.2841,97.684621 V 129.80068" + id="path1349-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183.47811,97.797141 V 129.9132" + id="path1349-8-1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 193.55523,97.797141 V 129.91321" + id="path1349-84-4" /> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="Storage"> + <g + id="g1516" + transform="translate(-5.7476651,-13.365254)"> + <rect + style="opacity:0.8;fill:#00009b;fill-opacity:0.960784;stroke:none;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1459" + width="49.227329" + height="99.385406" + x="12.024861" + y="82.039574" + ry="3.6148086" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461" + width="40.926029" + height="36.318001" + x="16.17551" + y="87.392815" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461-9" + width="40.926029" + height="36.318001" + x="16.17551" + y="135.62224" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483" + width="11.712796" + height="3.5944033" + x="30.782127" + y="148.56882" + ry="1.7972016" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483-2" + width="11.712796" + height="3.5944033" + x="30.782127" + y="97.671501" + ry="1.7972016" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;mix-blend-mode:normal;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="21.775951" + y="132.27321" + id="text1507"><tspan + sodipodi:role="line" + id="tspan1505" + x="21.775951" + y="132.27321" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Storage</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.290555,152.86779 H 86.956528" + id="path1520" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.399259,143.18618 H 87.065232" + id="path1520-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="55.976086" + y="150.41685" + id="text1553"><tspan + sodipodi:role="line" + id="tspan1551" + x="55.976086" + y="150.41685" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.06992,153.59077 H 256.7359" + id="path1520-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.17863,143.90916 H 256.8446" + id="path1520-6-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="225.22629" + y="151.13983" + id="text1553-7"><tspan + sodipodi:role="line" + id="tspan1551-5" + x="225.22629" + y="151.13983" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 268.62613,130.35265 h -12.77054 v 38.4272 l 13.15748,0" + id="path274" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.7359,153.59077 h 11.58083" + id="path276" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.8446,143.90916 h 11.35815" + id="path278" /> + </g> +</svg> diff --git a/images/basic_computer_architecture.svg.2021_06_02_09_19_20.0.svg b/images/basic_computer_architecture.svg.2021_06_02_09_19_20.0.svg new file mode 100644 index 0000000000000000000000000000000000000000..d116b166a7b980db8002bafd655a6ebe0f08cff3 --- /dev/null +++ b/images/basic_computer_architecture.svg.2021_06_02_09_19_20.0.svg @@ -0,0 +1,1093 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="297mm" + height="210mm" + viewBox="0 0 297 210" + version="1.1" + id="svg8" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)" + sodipodi:docname="basic_computer_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"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="7.4299226 : 99.168451 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="224.97788 : 116.91307 : 1" + inkscape:persp3d-origin="148.5 : 70 : 1" + id="perspective1426" /> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Drop Shadow" + id="filter1404" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-5"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-4" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-7" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-6" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-5" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-6" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-3" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-6" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-75" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-3" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-56" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-2" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.9899495" + inkscape:cx="561.27243" + inkscape:cy="409.21178" + inkscape:document-units="mm" + inkscape:current-layer="layer5" + inkscape:document-rotation="0" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1920" + inkscape:window-height="1114" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> + <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" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="CPU" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <g + id="g986" + transform="translate(0,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404)" + id="rect833" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909"><tspan + sodipodi:role="line" + id="tspan907" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5"><tspan + sodipodi:role="line" + id="tspan907-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2"><tspan + sodipodi:role="line" + id="tspan907-9" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1"><tspan + sodipodi:role="line" + id="tspan907-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26"><tspan + sodipodi:role="line" + id="tspan907-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8"><tspan + sodipodi:role="line" + id="tspan907-6-7" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9"><tspan + sodipodi:role="line" + id="tspan907-9-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0"><tspan + sodipodi:role="line" + id="tspan907-2-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9"><tspan + sodipodi:role="line" + id="tspan907-7" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3"><tspan + sodipodi:role="line" + id="tspan907-6-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1"><tspan + sodipodi:role="line" + id="tspan907-9-29" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3"><tspan + sodipodi:role="line" + id="tspan907-2-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3"><tspan + sodipodi:role="line" + id="tspan907-61" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0"><tspan + sodipodi:role="line" + id="tspan907-6-63" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2"><tspan + sodipodi:role="line" + id="tspan907-9-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6"><tspan + sodipodi:role="line" + id="tspan907-2-15" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748"><tspan + sodipodi:role="line" + id="tspan1746" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + <g + id="g986-9" + style="display:inline" + transform="translate(67.180138,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404-3)" + id="rect833-1" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987-2" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-70" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-93"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-6" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-2" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-6"><tspan + sodipodi:role="line" + id="tspan907-18" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-7"><tspan + sodipodi:role="line" + id="tspan907-6-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-20"><tspan + sodipodi:role="line" + id="tspan907-9-23" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-7"><tspan + sodipodi:role="line" + id="tspan907-2-5" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7-9" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0-2" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9-2"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6-9" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0-7" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6-3" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26-6"><tspan + sodipodi:role="line" + id="tspan907-1-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8-2"><tspan + sodipodi:role="line" + id="tspan907-6-7-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9-3"><tspan + sodipodi:role="line" + id="tspan907-9-2-1" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0-9"><tspan + sodipodi:role="line" + id="tspan907-2-2-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3-7" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7-8" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9-5" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9-1"><tspan + sodipodi:role="line" + id="tspan907-7-0" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3-6"><tspan + sodipodi:role="line" + id="tspan907-6-6-3" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1-2"><tspan + sodipodi:role="line" + id="tspan907-9-29-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3-6"><tspan + sodipodi:role="line" + id="tspan907-2-1-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9-5" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4-5" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8-7" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3-9"><tspan + sodipodi:role="line" + id="tspan907-61-3" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0-7"><tspan + sodipodi:role="line" + id="tspan907-6-63-4" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2-5"><tspan + sodipodi:role="line" + id="tspan907-9-0-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6-5"><tspan + sodipodi:role="line" + id="tspan907-2-15-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704-7" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-4" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6-4" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5-3" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63-0" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748-7"><tspan + sodipodi:role="line" + id="tspan1746-8" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="Memory"> + <rect + style="opacity:0.8;fill:#0e5412;fill-opacity:0.960784;stroke:#ffffff;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1342" + width="139.26747" + height="45.219032" + x="86.549896" + y="129.39824" + ry="6.5372772" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="131.79796" + y="155.7377" + id="text1346"><tspan + sodipodi:role="line" + id="tspan1344" + x="131.79796" + y="155.7377" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Main Memory</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="Busses"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 121.10397,97.684615 V 129.80068" + id="path1349" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 116.29799,97.797141 V 129.9132" + id="path1349-8" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 126.3751,97.797141 V 129.91321" + id="path1349-84" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 188.2841,97.684621 V 129.80068" + id="path1349-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183.47811,97.797141 V 129.9132" + id="path1349-8-1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 193.55523,97.797141 V 129.91321" + id="path1349-84-4" /> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="Storage"> + <g + id="g1516" + transform="translate(-5.7476651,-13.365254)"> + <rect + style="opacity:0.8;fill:#00009b;fill-opacity:0.960784;stroke:none;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1459" + width="49.227329" + height="99.385406" + x="12.024861" + y="82.039574" + ry="3.6148086" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461" + width="40.926029" + height="36.318001" + x="16.17551" + y="87.392815" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461-9" + width="40.926029" + height="36.318001" + x="16.17551" + y="135.62224" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483" + width="11.712796" + height="3.5944033" + x="30.782127" + y="148.56882" + ry="1.7972016" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483-2" + width="11.712796" + height="3.5944033" + x="30.782127" + y="97.671501" + ry="1.7972016" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;mix-blend-mode:normal;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="21.775951" + y="132.27321" + id="text1507"><tspan + sodipodi:role="line" + id="tspan1505" + x="21.775951" + y="132.27321" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Storage</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.290555,152.86779 H 86.956528" + id="path1520" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.399259,143.18618 H 87.065232" + id="path1520-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="55.976086" + y="150.41685" + id="text1553"><tspan + sodipodi:role="line" + id="tspan1551" + x="55.976086" + y="150.41685" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.06992,153.59077 H 256.7359" + id="path1520-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.17863,143.90916 H 256.8446" + id="path1520-6-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="225.75545" + y="151.13983" + id="text1553-7"><tspan + sodipodi:role="line" + id="tspan1551-5" + x="225.75545" + y="151.13983" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 268.62613,130.35265 h -12.77054 v 38.4272 l 13.15748,0" + id="path274" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.7359,153.59077 h 11.58083" + id="path276" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.8446,143.90916 h 11.35815" + id="path278" /> + </g> +</svg> diff --git a/images/dask_icon_no_pad.png b/images/dask_icon_no_pad.png new file mode 100644 index 0000000000000000000000000000000000000000..b0560be7c2df620b30bec41bc0b2791121b9901c Binary files /dev/null and b/images/dask_icon_no_pad.png differ diff --git a/images/dask_icon_no_pad.svg b/images/dask_icon_no_pad.svg new file mode 100644 index 0000000000000000000000000000000000000000..8999ed4a7207923f0f361b6bf57b4022aafd49e6 --- /dev/null +++ b/images/dask_icon_no_pad.svg @@ -0,0 +1,35 @@ +<svg id="Layer_1" + data-name="Layer 1" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + viewBox="80 55 300 380"> + <defs> + <linearGradient id="linear-gradient" + x1="244.57" y1="186.17" x2="415.51" y2="186.17" + gradientTransform="translate(-18.34 16.11) rotate(7.91)" + gradientUnits="userSpaceOnUse"> + <stop offset="0.01" stop-color="#c7422f"/> + <stop offset="0.37" stop-color="#d46e43"/> + <stop offset="1.00" stop-color="#eeb575"/> + </linearGradient> + <linearGradient id="linear-gradient-2" + x1="297.68" y1="181.79" x2="374.68" y2="181.79" + gradientTransform="translate(-18.34 16.11) rotate(7.91)" + gradientUnits="userSpaceOnUse"> + <stop offset="0.21" stop-color="#cf603b"/> + <stop offset="1" stop-color="#eeb575"/> + </linearGradient> + <linearGradient id="linear-gradient-3" + x1="152.4" y1="190.46" x2="341.55" y2="190.46" + xlink:href="#linear-gradient-2"/> + </defs> + + <title>Dask</title> + + <path d="M373.09,216.74q0.33-3.56.56-7.12A232.73,232.73,0,0,0,349.81,91L336.54,64.38l-6.15,29.14a212.21,212.21,0,0,1-125,151.43l-9.13,3.86,3.46,9.3a210,210,0,0,1,12.29,94,213,213,0,0,1-11.13,50.49l-7,19.87,20-6.58A233,233,0,0,0,373.09,216.74ZM237.35,383.64l-10.66,5.43L229,377.34a234.27,234.27,0,0,0,3.41-23.27,231.39,231.39,0,0,0-8.81-89.33l-1.41-4.69,4.37-2.18A234.07,234.07,0,0,0,336.06,142.69l6.83-15.58,4.12,16.5a209.52,209.52,0,0,1,5.23,71.12A211.17,211.17,0,0,1,237.35,383.64Z" + style="fill:url(#linear-gradient)"/> + <path d="M323.44,228.19c8-17.75,16.39-61.85,15.86-65.14a245.35,245.35,0,0,1-29.41,43.59c-1.65,4.37-3.39,8.7-5.33,13h0A211.92,211.92,0,0,1,243,298.41q1.65,11.94,2.09,24.05A232.43,232.43,0,0,0,323.44,228.19Z" + style="fill:url(#linear-gradient-2)"/> + <path d="M201.14,324.23a212.21,212.21,0,0,1-60.09,17.84l-11.83,1.67,6-10.33A235,235,0,0,0,146,312.5a231.24,231.24,0,0,0,20.68-87.35l0.18-4.89,4.85-.65a234,234,0,0,0,105.16-41.79,200.09,200.09,0,0,0,36.17-65,212.27,212.27,0,0,1-157.36,87.56l-9.89.69L146,211a210.08,210.08,0,0,1-18.92,92.92,213,213,0,0,1-26.92,44.14L87.13,364.6l21.07,0.28a232.13,232.13,0,0,0,92.5-18A202.86,202.86,0,0,0,201.14,324.23Z" + style="fill:url(#linear-gradient-3)"/> +</svg> diff --git a/images/gflops-dp.png b/images/gflops-dp.png new file mode 100644 index 0000000000000000000000000000000000000000..62c75e13c367310ea1cc5f0905aebbb9808d17c5 Binary files /dev/null and b/images/gflops-dp.png differ diff --git a/images/kdevelop_big.png b/images/kdevelop_big.png new file mode 100644 index 0000000000000000000000000000000000000000..e41b49a67881af63ec0c9fd5558c2072ad19995f Binary files /dev/null and b/images/kdevelop_big.png differ diff --git a/images/mem-bw.png b/images/mem-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9275ea1e37306b066438e31aade1621e48cefb Binary files /dev/null and b/images/mem-bw.png differ diff --git a/images/simplified_computer_architecture.svg b/images/simplified_computer_architecture.svg new file mode 100644 index 0000000000000000000000000000000000000000..82d991fb329cc857a593cc6fc3156eaa59874b17 --- /dev/null +++ b/images/simplified_computer_architecture.svg @@ -0,0 +1,1100 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="266.73587mm" + height="115.60289mm" + viewBox="0 0 266.73587 115.60289" + version="1.1" + id="svg8" + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + sodipodi:docname="simplifed_computer_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"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="7.4299225 : 4.7713432 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="224.97788 : 22.515962 : 1" + inkscape:persp3d-origin="148.5 : -24.397108 : 1" + id="perspective1426" /> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-5"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-4" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-7" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-6" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-5" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-6" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-3" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-6" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-75" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-3" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-56" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-2" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.9899495" + inkscape:cx="428.30468" + inkscape:cy="178.29192" + inkscape:document-units="mm" + inkscape:current-layer="layer5" + inkscape:document-rotation="0" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1920" + inkscape:window-height="1114" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" + fit-margin-left="2" + fit-margin-right="2" + fit-margin-top="2" + fit-margin-bottom="2" /> + <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="CPU" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(-4.2771962,-61.14688)"> + <g + id="g986" + transform="translate(0,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404)" + id="rect833" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909"><tspan + sodipodi:role="line" + id="tspan907" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5"><tspan + sodipodi:role="line" + id="tspan907-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2"><tspan + sodipodi:role="line" + id="tspan907-9" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1"><tspan + sodipodi:role="line" + id="tspan907-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26"><tspan + sodipodi:role="line" + id="tspan907-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8"><tspan + sodipodi:role="line" + id="tspan907-6-7" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9"><tspan + sodipodi:role="line" + id="tspan907-9-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0"><tspan + sodipodi:role="line" + id="tspan907-2-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9"><tspan + sodipodi:role="line" + id="tspan907-7" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3"><tspan + sodipodi:role="line" + id="tspan907-6-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1"><tspan + sodipodi:role="line" + id="tspan907-9-29" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3"><tspan + sodipodi:role="line" + id="tspan907-2-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3"><tspan + sodipodi:role="line" + id="tspan907-61" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0"><tspan + sodipodi:role="line" + id="tspan907-6-63" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2"><tspan + sodipodi:role="line" + id="tspan907-9-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6"><tspan + sodipodi:role="line" + id="tspan907-2-15" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748"><tspan + sodipodi:role="line" + id="tspan1746" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + <g + id="g986-9" + style="display:inline" + transform="translate(67.180138,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404-3)" + id="rect833-1" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987-2" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-70" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-93"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-6" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-2" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-6"><tspan + sodipodi:role="line" + id="tspan907-18" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-7"><tspan + sodipodi:role="line" + id="tspan907-6-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-20"><tspan + sodipodi:role="line" + id="tspan907-9-23" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-7"><tspan + sodipodi:role="line" + id="tspan907-2-5" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7-9" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0-2" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9-2"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6-9" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0-7" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6-3" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26-6"><tspan + sodipodi:role="line" + id="tspan907-1-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8-2"><tspan + sodipodi:role="line" + id="tspan907-6-7-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9-3"><tspan + sodipodi:role="line" + id="tspan907-9-2-1" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0-9"><tspan + sodipodi:role="line" + id="tspan907-2-2-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3-7" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7-8" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9-5" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9-1"><tspan + sodipodi:role="line" + id="tspan907-7-0" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3-6"><tspan + sodipodi:role="line" + id="tspan907-6-6-3" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1-2"><tspan + sodipodi:role="line" + id="tspan907-9-29-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3-6"><tspan + sodipodi:role="line" + id="tspan907-2-1-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9-5" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4-5" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8-7" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3-9"><tspan + sodipodi:role="line" + id="tspan907-61-3" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0-7"><tspan + sodipodi:role="line" + id="tspan907-6-63-4" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2-5"><tspan + sodipodi:role="line" + id="tspan907-9-0-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6-5"><tspan + sodipodi:role="line" + id="tspan907-2-15-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704-7" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-4" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6-4" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5-3" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63-0" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748-7"><tspan + sodipodi:role="line" + id="tspan1746-8" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="Memory" + transform="translate(-4.2771962,-61.14688)"> + <rect + style="opacity:0.8;fill:#0e5412;fill-opacity:0.960784;stroke:#ffffff;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1342" + width="139.26747" + height="45.219032" + x="86.549896" + y="129.39824" + ry="6.5372772" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="131.79796" + y="155.7377" + id="text1346"><tspan + sodipodi:role="line" + id="tspan1344" + x="131.79796" + y="155.7377" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Main Memory</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="Busses" + transform="translate(-4.2771962,-61.14688)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 121.10397,97.684615 V 129.80068" + id="path1349" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 116.29799,97.797141 V 129.9132" + id="path1349-8" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 126.3751,97.797141 V 129.91321" + id="path1349-84" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 188.2841,97.684621 V 129.80068" + id="path1349-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183.47811,97.797141 V 129.9132" + id="path1349-8-1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 193.55523,97.797141 V 129.91321" + id="path1349-84-4" /> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="Storage" + transform="translate(-4.2771962,-61.14688)"> + <g + id="g1516" + transform="translate(-5.7476651,-13.365254)"> + <rect + style="opacity:0.8;fill:#00009b;fill-opacity:0.960784;stroke:none;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1459" + width="49.227329" + height="99.385406" + x="12.024861" + y="82.039574" + ry="3.6148086" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461" + width="40.926029" + height="36.318001" + x="16.17551" + y="87.392815" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461-9" + width="40.926029" + height="36.318001" + x="16.17551" + y="135.62224" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483" + width="11.712796" + height="3.5944033" + x="30.782127" + y="148.56882" + ry="1.7972016" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483-2" + width="11.712796" + height="3.5944033" + x="30.782127" + y="97.671501" + ry="1.7972016" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;mix-blend-mode:normal;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="21.775951" + y="132.27321" + id="text1507"><tspan + sodipodi:role="line" + id="tspan1505" + x="21.775951" + y="132.27321" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Storage</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.290555,152.86779 H 86.956528" + id="path1520" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.399259,143.18618 H 87.065232" + id="path1520-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="55.976086" + y="150.41685" + id="text1553"><tspan + sodipodi:role="line" + id="tspan1551" + x="55.976086" + y="150.41685" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.06992,153.59077 H 256.7359" + id="path1520-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.17863,143.90916 H 256.8446" + id="path1520-6-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="225.22629" + y="151.13983" + id="text1553-7"><tspan + sodipodi:role="line" + id="tspan1551-5" + x="225.22629" + y="151.13983" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 268.62613,130.35265 h -12.77054 v 38.4272 h 13.15748" + id="path274" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.7359,153.59077 h 11.58083" + id="path276" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.8446,143.90916 h 11.35815" + id="path278" /> + </g> +</svg> diff --git a/images/simplified_computer_architecture.svged_computer_architecture.svg b/images/simplified_computer_architecture.svged_computer_architecture.svg new file mode 100644 index 0000000000000000000000000000000000000000..4a74ce70cf2fb63acd4b88f74e9bf8240ba498bd --- /dev/null +++ b/images/simplified_computer_architecture.svged_computer_architecture.svg @@ -0,0 +1,1100 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="266.73587mm" + height="115.60289mm" + viewBox="0 0 266.73587 115.60289" + version="1.1" + id="svg8" + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + sodipodi:docname="simplified_computer_architecture.svged_computer_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"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="7.4299225 : 4.7713432 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="224.97788 : 22.515962 : 1" + inkscape:persp3d-origin="148.5 : -24.397108 : 1" + id="perspective1426" /> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-5"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-4" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-7" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-6" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-5" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-6" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter1404-3" + x="-0.1488662" + y="-0.1488662" + width="1.2977324" + height="1.2977324"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood1394-6" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite1396-75" /> + <feGaussianBlur + in="composite1" + stdDeviation="3" + result="blur" + id="feGaussianBlur1398-3" /> + <feOffset + dx="2.77556e-17" + dy="0" + result="offset" + id="feOffset1400-56" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite1402-2" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.9899495" + inkscape:cx="428.30468" + inkscape:cy="178.29192" + inkscape:document-units="mm" + inkscape:current-layer="layer5" + inkscape:document-rotation="0" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1920" + inkscape:window-height="1114" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" + fit-margin-left="2" + fit-margin-right="2" + fit-margin-top="2" + fit-margin-bottom="2" /> + <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="CPU" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(-4.2771962,-61.14688)"> + <g + id="g986" + transform="translate(0,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404)" + id="rect833" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909"><tspan + sodipodi:role="line" + id="tspan907" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5"><tspan + sodipodi:role="line" + id="tspan907-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2"><tspan + sodipodi:role="line" + id="tspan907-9" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1"><tspan + sodipodi:role="line" + id="tspan907-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26"><tspan + sodipodi:role="line" + id="tspan907-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8"><tspan + sodipodi:role="line" + id="tspan907-6-7" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9"><tspan + sodipodi:role="line" + id="tspan907-9-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0"><tspan + sodipodi:role="line" + id="tspan907-2-2" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9"><tspan + sodipodi:role="line" + id="tspan907-7" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3"><tspan + sodipodi:role="line" + id="tspan907-6-6" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1"><tspan + sodipodi:role="line" + id="tspan907-9-29" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3"><tspan + sodipodi:role="line" + id="tspan907-2-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3"><tspan + sodipodi:role="line" + id="tspan907-61" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0"><tspan + sodipodi:role="line" + id="tspan907-6-63" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2"><tspan + sodipodi:role="line" + id="tspan907-9-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6"><tspan + sodipodi:role="line" + id="tspan907-2-15" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748"><tspan + sodipodi:role="line" + id="tspan1746" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + <g + id="g986-9" + style="display:inline" + transform="translate(67.180138,1.0321292)"> + <rect + style="opacity:0.8;fill:#adbde3;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;filter:url(#filter1404-3)" + id="rect833-1" + width="48.365578" + height="48.365578" + x="97.34536" + y="69.314751" + ry="10.248185" /> + <g + id="g987-2" + transform="translate(24.321049,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-70" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-93"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-6" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-2" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-6"><tspan + sodipodi:role="line" + id="tspan907-18" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-7"><tspan + sodipodi:role="line" + id="tspan907-6-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-20"><tspan + sodipodi:role="line" + id="tspan907-9-23" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-7"><tspan + sodipodi:role="line" + id="tspan907-2-5" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-7-9" + transform="translate(-2.160581,-2.1122139)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-0-2" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-9-2"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-3-8" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-6-9" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-0-7" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-6-3" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-26-6"><tspan + sodipodi:role="line" + id="tspan907-1-1" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-8-2"><tspan + sodipodi:role="line" + id="tspan907-6-7-9" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-9-3"><tspan + sodipodi:role="line" + id="tspan907-9-2-1" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-0-9"><tspan + sodipodi:role="line" + id="tspan907-2-2-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-3-7" + transform="translate(-2.160581,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-7-8" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-5-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-9-5" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-2-0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-2-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-8-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-9-1"><tspan + sodipodi:role="line" + id="tspan907-7-0" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-3-6"><tspan + sodipodi:role="line" + id="tspan907-6-6-3" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-1-2"><tspan + sodipodi:role="line" + id="tspan907-9-29-0" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-3-6"><tspan + sodipodi:role="line" + id="tspan907-2-1-1" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <g + id="g987-9-5" + transform="translate(24.321049,19.492909)"> + <rect + style="opacity:0.8;fill:#ffdd55;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect835-4-5" + width="16.404524" + height="16.404524" + x="102.05405" + y="77.272102" + ry="8.2022619" /> + <g + id="g971-7-4"> + <rect + style="opacity:0.8;fill:#ff9955;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect899-8-7" + width="12.444831" + height="4.0968328" + x="104.11361" + y="83.687065" + ry="2.0484164" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 110.28499,83.622599 v 4.151444" + id="path901-4-6" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 107.38427,83.711586 v 4.102558" + id="path903-5-5" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.16195,83.677026 v 4.147836" + id="path905-0-6" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="105.08108" + y="87.033073" + id="text909-3-9"><tspan + sodipodi:role="line" + id="tspan907-61-3" + x="105.08108" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">0</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="107.97417" + y="87.033073" + id="text909-5-0-7"><tspan + sodipodi:role="line" + id="tspan907-6-63-4" + x="107.97417" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">1</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.95724" + y="87.054237" + id="text909-2-2-5"><tspan + sodipodi:role="line" + id="tspan907-9-0-2" + x="110.95724" + y="87.054237" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">2</tspan></text> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="113.91561" + y="87.033073" + id="text909-1-6-5"><tspan + sodipodi:role="line" + id="tspan907-2-15-4" + x="113.91561" + y="87.033073" + style="font-size:3.52778px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">3</tspan></text> + </g> + </g> + <rect + style="opacity:0.8;fill:#00a500;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1704-7" + width="42.886154" + height="5.2005968" + x="99.893463" + y="91.564415" + ry="2.6002984" /> + <rect + style="opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-4" + width="12.499666" + height="2.6740842" + x="101.95303" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-6-4" + width="12.499666" + height="2.6740842" + x="128.37982" + y="85.671684" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-5-3" + width="12.499666" + height="2.6740842" + x="101.95303" + y="107.27681" + ry="1.3370421" /> + <rect + style="display:inline;opacity:0.8;fill:#00ff00;fill-opacity:1;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke" + id="rect1706-63-0" + width="12.499666" + height="2.6740842" + x="128.37982" + y="107.27681" + ry="1.3370421" /> + <text + xml:space="preserve" + style="font-size:3.52778px;line-height:2.75608px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="110.99763" + y="95.245903" + id="text1748-7"><tspan + sodipodi:role="line" + id="tspan1746-8" + x="110.99763" + y="95.245903" + style="font-size:3.52778px;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.264583px;stroke-opacity:1">Shared Cache</tspan></text> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="Memory" + transform="translate(-4.2771962,-61.14688)"> + <rect + style="opacity:0.8;fill:#0e5412;fill-opacity:0.960784;stroke:#ffffff;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1342" + width="139.26747" + height="45.219032" + x="86.549896" + y="129.39824" + ry="6.5372772" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="131.79796" + y="155.7377" + id="text1346"><tspan + sodipodi:role="line" + id="tspan1344" + x="131.79796" + y="155.7377" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Main Memory</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="Busses" + transform="translate(-4.2771962,-61.14688)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 121.10397,97.684615 V 129.80068" + id="path1349" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 116.29799,97.797141 V 129.9132" + id="path1349-8" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 126.3751,97.797141 V 129.91321" + id="path1349-84" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 188.2841,97.684621 V 129.80068" + id="path1349-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183.47811,97.797141 V 129.9132" + id="path1349-8-1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 193.55523,97.797141 V 129.91321" + id="path1349-84-4" /> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="Storage" + transform="translate(-4.2771962,-61.14688)"> + <g + id="g1516" + transform="translate(-5.7476651,-13.365254)"> + <rect + style="opacity:0.8;fill:#00009b;fill-opacity:0.960784;stroke:none;stroke-width:0.264999;paint-order:markers fill stroke" + id="rect1459" + width="49.227329" + height="99.385406" + x="12.024861" + y="82.039574" + ry="3.6148086" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461" + width="40.926029" + height="36.318001" + x="16.17551" + y="87.392815" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1461-9" + width="40.926029" + height="36.318001" + x="16.17551" + y="135.62224" + ry="3.6148169" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483" + width="11.712796" + height="3.5944033" + x="30.782127" + y="148.56882" + ry="1.7972016" /> + <rect + style="opacity:0.8;fill:none;fill-opacity:0.960784;stroke:#c2c2ff;stroke-width:0.264999;stroke-opacity:0.945098;paint-order:markers fill stroke" + id="rect1483-2" + width="11.712796" + height="3.5944033" + x="30.782127" + y="97.671501" + ry="1.7972016" /> + <text + xml:space="preserve" + style="font-size:8.46667px;line-height:6.61458px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;mix-blend-mode:normal;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="21.775951" + y="132.27321" + id="text1507"><tspan + sodipodi:role="line" + id="tspan1505" + x="21.775951" + y="132.27321" + style="fill:#ffffff;fill-opacity:0.960784;stroke:none;stroke-width:0.264583px">Storage</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.290555,152.86779 H 86.956528" + id="path1520" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 55.399259,143.18618 H 87.065232" + id="path1520-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="55.976086" + y="150.41685" + id="text1553"><tspan + sodipodi:role="line" + id="tspan1551" + x="55.976086" + y="150.41685" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.06992,153.59077 H 256.7359" + id="path1520-3" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 225.17863,143.90916 H 256.8446" + id="path1520-6-6" /> + <text + xml:space="preserve" + style="font-size:7.05556px;line-height:5.51216px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="225.22629" + y="151.13983" + id="text1553-7"><tspan + sodipodi:role="line" + id="tspan1551-5" + x="225.22629" + y="151.13983" + style="font-size:7.05556px;fill:#000000;fill-opacity:1;stroke-width:0.264583px">Infiniband</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 268.62613,130.35265 h -12.77054 v 38.4272 h 13.15748" + id="path274" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.7359,153.59077 h 11.58083" + id="path276" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.8446,143.90916 h 11.35815" + id="path278" /> + </g> +</svg> diff --git a/solutions/00_Bottlenecks.ipynb b/solutions/00_Bottlenecks.ipynb index c13468d5d3faacfbb30e2843276296716cf5c788..7e9c5a80e94ee916fbc818371c5f092fa0ece88b 100644 --- a/solutions/00_Bottlenecks.ipynb +++ b/solutions/00_Bottlenecks.ipynb @@ -11,7 +11,7 @@ "# Bottlenecks\n", "\n", "<div class=\"dateauthor\">\n", - "16 Nov 2020 | Jan H. Meinke\n", + "07 Jun 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -31,7 +31,32 @@ "metadata": { "slideshow": { "slide_type": "fragment" - } + }, + "tags": [] + }, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, + "source": [ + "Our programs may hit one or more of the following limits:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + }, + "tags": [] }, "source": [ "CPU" @@ -41,8 +66,9 @@ "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "fragment" - } + "slide_type": "notes" + }, + "tags": [] }, "source": [ "Memory" @@ -52,8 +78,9 @@ "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "fragment" - } + "slide_type": "notes" + }, + "tags": [] }, "source": [ "I/O" @@ -111,7 +138,7 @@ "source": [ "This is the limit most people think of first, but it's often not the crucial one. Each core on JUWELS can perform ca. 80 GFlop/s if the code is completely *vectorized* and performs a *multiply and an add operation* at *each step*. If your code doesn't fulfill those requirements its peak performance will be less.\n", "\n", - "Actually the peak performance is a often less because the CPU temperature limit typically soon leads to throttling when using all cores. The guaranteed sustained frequency for the JUWELS FMA units is 1.9 GHz." + "Actually the peak performance is often less because the CPU temperature limit typically soon leads to throttling when using all cores. The guaranteed sustained frequency for JUWELS' FMA units is 1.9 GHz." ] }, { @@ -439,7 +466,7 @@ "\n", "A numpy ndarray uses C-order (row-order) for storage. This means that the last index is continuous in memory and a change in any other index results in a jump from one memory location to another. The order of the loops therefore means that for both c and b, we don't get the maximum bandwidth, because we jump around and only use one element of the cache line. \n", "\n", - "A datum is not loaded by itself. Instead everytime, a datum is needed that is not available in cache, a cache line containing the datum is loaded. On JUWELS the cache line is 64 bytes wide. \n", + "A datum is not loaded by itself. Instead everytime, a datum is needed that is not available in cache, a cache line containing the datum is loaded. On JURECA the cache line is 64 bytes wide. \n", "\n", "We can improve the performance by exchanging the loops:" ] @@ -749,7 +776,7 @@ } }, "source": [ - "The scratch file system achieves read/write bandwidths that are very similar to the main memory bandwidth, but not for a single node. Each node is connected to the GPFS file system with $\\mathcal{O}(100)$ GBit/s connection. In other words, we can read/write about 12.5 GB/s. If we had to load the data in the previous calculation from disk, we could only achieve 12.5 GB/s / 24 bytes/op = 520 Mop/s. The main memory bandwidth or the peak performance of the CPU doesn't matter in this case." + "The scratch file system achieves read/write bandwidths that are very similar to the main memory bandwidth, but not for a single node. Each node is connected to the GPFS file system with $\\mathcal{O}(100)$ GBit/s connection. In other words, we can read/write about 12.5 GB/s. If we had to load the data in the previous calculation from disk, we could only achieve 12.5 GB/s / 24 bytes/op = 520 Mop/s. The main memory bandwidth or the peak performance of the CPU don't matter in this case." ] }, { @@ -766,9 +793,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -780,7 +807,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.10.1" } }, "nbformat": 4, diff --git a/solutions/01_Introduction to IPython.ipynb b/solutions/01_Introduction to IPython.ipynb index a91423bbea775fb4da0fef1432a3ab1a51e26379..2edbe59c6802026fd9c8557db3c7613236a1eea6 100644 --- a/solutions/01_Introduction to IPython.ipynb +++ b/solutions/01_Introduction to IPython.ipynb @@ -20,7 +20,7 @@ }, "source": [ "<div class=\"dateauthor\">\n", - "2 July 2019 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -289,7 +289,7 @@ }, "outputs": [], "source": [ - "%matplotlib inline\n", + "%matplotlib inline # widget is an interactive alternative to inline\n", "import matplotlib.pyplot as plt\n", "import numpy" ] @@ -937,9 +937,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -951,7 +951,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/02_NumPy_concepts.ipynb b/solutions/02_NumPy_concepts.ipynb index 1cc73ae8c614db24b707b49d6f1440435c0b98d5..a2e401d65f30cc5b317059ee5e67c636aea00d30 100644 --- a/solutions/02_NumPy_concepts.ipynb +++ b/solutions/02_NumPy_concepts.ipynb @@ -11,7 +11,7 @@ "# NumPy - an HPC perspective\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Olav Zimmermann\n", + "07 June 2021 | Olav Zimmermann\n", "</div>" ] }, @@ -50,7 +50,7 @@ } }, "source": [ - "NumPy is a library, written in C, to enable fast numerical computing in Python. Since its inception in 1995, NumPy has become first choice for numeric data processing in python. The main sacrifice to enable its high speed is the restriction to \n", + "NumPy is a library, written in C, to enable fast numerical computing in Python. Since its inception in 1995, NumPy has become the first choice for numeric data processing in python. The main sacrifice to enable its high speed is the restriction to \n", "containers with uniform memory layout, i.e., arrays that contain items of uniform static datatype." ] }, @@ -251,7 +251,7 @@ } }, "source": [ - "However, note that most functionality in NumPy is geared towards arrays of uniform numerical type. The above data type indicates that the entire row is treated as a single (albeit very complicated) type and the data in the table thereby become a one-dimensional array. If you need spreadsheet-like functionality, NumPy's 'structured arrays' or 'record type' arrays that are based on `ndarrays` are not adequate. Luckily `ndarrays` can be extended in functionality and even reimplemented in a compatible way." + "Note that most functionality in NumPy is geared towards arrays of uniform numerical type. The above data type indicates that the entire row is treated as a single (albeit very complicated) type and the data in the table thereby become a one-dimensional array. If you need spreadsheet-like functionality, NumPy's 'structured arrays' or 'record type' arrays that are based on `ndarrays` are not adequate. Luckily `ndarrays` can be extended in functionality and even reimplemented in a compatible way." ] }, { @@ -273,7 +273,7 @@ } }, "source": [ - "Due to its dual interface in Python and C and its often (not always) regular memory layout ndarrays can relatively easy be mapped to data types described in other language contexts. " + "Due to its dual interface in Python and C and its often (not always) regular memory layout `ndarrays` can relatively easily be mapped to data types described in other language contexts. " ] }, { @@ -285,7 +285,7 @@ }, "source": [ "A couple of clever design choices adds to the popularity of ndarrays as a standard API for high performance computing in Python:\n", - "- narrays support both C-style and Fortran-style memory layouts, as well as memory alignment and view interfaces.\n", + "- ndarrays support both C-style and Fortran-style memory layouts, as well as memory alignment and view interfaces.\n", "- A Mixin class `NDArrayOperatorsMixin` provides all the necessary standard python interfaces like `__add__`, `__lt__` etc. making custom array containers more convenient to write.\n", "- `ndarray.__array_ufunc__` and `__array_function__` are interfaces that split the function API from the excution engine. By overriding them, these functions allow to intercept calls to ufuncs and non-ufuncs and to dispatch these calls to alternative implementations. Several important packages already use this approach." ] @@ -345,9 +345,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -359,7 +359,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/03_ThinkVector.ipynb b/solutions/03_ThinkVector.ipynb index f557f7fb103c8138b888619a9188ce726c5943fb..d512407b4d832c4ae9d07038bb1b30db5759c647 100644 --- a/solutions/03_ThinkVector.ipynb +++ b/solutions/03_ThinkVector.ipynb @@ -11,7 +11,7 @@ "# Think Vector\n", "\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -354,6 +354,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -362,13 +365,16 @@ "source": [ "# Solution\n", "# As an example, we'll do the last timing operation\n", - "# Note, since this is a one-liner, we could have used %timeit instead." + "# Note, since this is a one-liner, we could have used %timeit instead. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -687,6 +693,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -714,6 +723,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -1107,9 +1119,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1121,7 +1133,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/04_Particle Dynamics.ipynb b/solutions/04_Particle Dynamics.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1a934f0e6fb5199b48d09956287c579ec6c412f8 --- /dev/null +++ b/solutions/04_Particle Dynamics.ipynb @@ -0,0 +1,496 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5451ef11-f683-4995-bda8-c9d87abaec49", + "metadata": {}, + "source": [ + "# Particle Dynamics with Python\n", + "<div class=\"dateauthor\">\n", + "07 June 2021 | Jan H. Meinke\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5822f3b3-bc03-4e2f-85f1-57cb246e3a05", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "import random\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7d1939b-7d73-4c0c-9d8a-d6ea39d48b49", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, + { + "cell_type": "markdown", + "id": "19819e70-b42c-405a-958f-70c05a972ee6", + "metadata": {}, + "source": [ + "Particle dynamics simulations are common in various scientific fields. They are used to simulate \n", + "the formation of galaxies and the movements of molecules in a cell. Particles can have different\n", + "properties such as mass and charge and interact in different ways.\n", + "\n", + "A classical particle dynamics code solves Newton's equation of motion:\n", + "\n", + "$$\\mathbf F = m \\mathbf a,$$\n", + "\n", + "where $\\mathbf F$ is the force, $m$ the mass, and $\\mathbf a$ the acceleration. $\\mathbf F$ and \n", + "$\\mathbf a$ are vectors.\n", + "\n", + "In general, this problem is only solvable analytically for two particles. If there are more \n", + "particles, we have to look for a numerical solution.\n", + "\n", + "You may remember that you can calculate the velocity $\\mathbf v$ of a particle as\n", + "\n", + "$$\\mathbf v(t + dt) = \\mathbf v(t) + \\mathbf a(t) dt$$\n", + "\n", + "and the position $\\mathbf r$ as\n", + "\n", + "$$\\mathbf r(t + dt) = \\mathbf r(t) + \\mathbf v(t)dt + \\frac 1 2 \\mathbf a(t) dt^2.$$\n", + "\n", + "If we know all the positions, velocities and masses at time $t$ and can calculate the forces, we \n", + "can follow the motion of the particles over time." + ] + }, + { + "cell_type": "markdown", + "id": "50ad1731-c5b0-4922-adc8-14e507a7b6b8", + "metadata": {}, + "source": [ + "## Gravitational force\n", + "Let's assume our particles only interact via gravity. Then the force between two particles is given \n", + "by\n", + "\n", + "$$\\mathbf F_{ij}(t) = G\\frac{m_i m_j}{r_{ij}^2(t)} \\mathbf {\\hat r}_{ij}(t),$$\n", + "\n", + "where $\\mathbf F_{ij}(t)$ is the force on particle $i$ due to particle $j$. $r_{ij}(t)$ is the \n", + "distance between particles $i$ and $j$, and $\\mathbf {\\hat r}_{ij}(t)$ is the unit vector pointing\n", + "from $i$ to $j$.\n", + "\n", + "To get the total force on particle $i$, we need to sum over all $j \\neq i$:\n", + "\n", + "$$\\mathbf F_{i}(t) = \\sum_{j\\neq i} \\mathbf F_{ij}(t).$$" + ] + }, + { + "cell_type": "markdown", + "id": "32f7c975-ed21-4c70-9168-5b7bfa5ca276", + "metadata": {}, + "source": [ + "## The algorithm" + ] + }, + { + "cell_type": "markdown", + "id": "4288de12-8bf3-41b2-96ca-5c3c47fc0d84", + "metadata": {}, + "source": [ + "1. Calculate the force on each particle by summing up all the forces acting on it.\n", + "2. Integrate the equation of motion\n", + "\n", + " a) Calculate the position of each particle after a time step *dt*\n", + " \n", + " b) Calculate the velocity of each particle after a time step *dt*" + ] + }, + { + "cell_type": "markdown", + "id": "539c2d60-df7b-471b-a438-d9b4efb51781", + "metadata": {}, + "source": [ + "## (Parallel) Patterns\n", + "In Think Vector, we got to know some patterns. Let's see how we can apply them here:\n", + "\n", + "(i, j) -> $\\mathbf F_{ij}$:\n", + " This is a map\n", + " \n", + "$\\mathbf F_{ij}$ -> $\\mathbf F_{i}$:\n", + " This is a reduction\n", + " \n", + "Calulate the new velocity:\n", + " This is map\n", + " \n", + "Calculate the new position:\n", + " This is a map, too.\n", + " \n", + "Now, let's try to express this in code.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4525c8a-378a-45b7-b1e2-b67f5f07d397", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize positions and velocities\n", + "N = 50\n", + "L2 = 5 # half the length of the box size\n", + "epsilon = 1e-9 # softening factor\n", + "dt = 0.1 # time step\n", + "G = 1 # For simplicity we set the universal graviational constant to 1\n", + "m = 1 # This corresponds to 150 x 10^9 kg\n", + "x = [random.uniform(-L2, L2) for i in range(N)]\n", + "y = [random.uniform(-L2, L2) for i in range(N)]\n", + "z = [random.uniform(-L2, L2) for i in range(N)]\n", + "vx = [0 for i in range(N)]\n", + "vy = [0 for i in range(N)]\n", + "vz = [0 for i in range(N)]" + ] + }, + { + "cell_type": "markdown", + "id": "8fd053d2-8c88-4666-82ed-0316fe21ac34", + "metadata": {}, + "source": [ + "### Calculating forces" + ] + }, + { + "cell_type": "markdown", + "id": "41861767-e08d-45b8-802a-28b269e3f7ee", + "metadata": {}, + "source": [ + "To calculate the force, we need the distance vector first. These are actually 3 maps (one for each component). The result is a distance matrix. As mentioned before maps are expressed as list generators:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "338142b6-f973-4f7a-b5a4-77e76f3b758f", + "metadata": {}, + "outputs": [], + "source": [ + "Dxx = [(i - j) for j in x for i in x]\n", + "Dyy = [(i - j) for j in y for i in y]\n", + "Dzz = [(i - j) for j in z for i in z]\n", + "D = [math.sqrt(i * i + j * j + k * k) for i, j, k in zip(Dxx, Dyy, Dzz)]" + ] + }, + { + "cell_type": "markdown", + "id": "d0156a2d-13ae-46dd-b3a8-cb7eb1aca0bf", + "metadata": {}, + "source": [ + "Now that we have the vector components and the magnitude of the vector, we can calculate the forces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e841a076-504d-445b-b006-b931e3cb0bc2", + "metadata": {}, + "outputs": [], + "source": [ + "Fxx = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dxx, D)] # epsilon prevents a zero in the dominator.\n", + "Fyy = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dyy, D)]\n", + "Fzz = [G * m * m * i / (d * d * d + epsilon) for i, d in zip(Dzz, D)]\n", + "Fx = [sum(Fxx[i * N: (i + 1) * N]) for i in range(N)]\n", + "Fy = [sum(Fyy[i * N: (i + 1) * N]) for i in range(N)]\n", + "Fz = [sum(Fzz[i * N: (i + 1) * N]) for i in range(N)]" + ] + }, + { + "cell_type": "markdown", + "id": "3de052ac-7591-4477-8285-cc15c0019a7a", + "metadata": {}, + "source": [ + "Let's visualize the forces on the particles:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1133b4bb-111b-4aca-9326-22a7c29c8522", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plt.figure(figsize=(6, 6)).add_subplot(projection='3d')\n", + "ax.scatter3D(x, y, z)\n", + "ax.quiver(x, y, z, Fx, Fy, Fz)" + ] + }, + { + "cell_type": "markdown", + "id": "ccea23e5-4f4b-4ff6-b379-8d45e3fe15f4", + "metadata": {}, + "source": [ + "### Integrating the equation of motion" + ] + }, + { + "cell_type": "markdown", + "id": "dba27f9b-350e-4e65-9f42-e3615ee30a84", + "metadata": {}, + "source": [ + "We are ready to update the positions and velocities of our particles:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ddc24f9-eaf3-491c-bf81-232efa584c1c", + "metadata": {}, + "outputs": [], + "source": [ + "x = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(x, vx, Fx)]\n", + "y = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(y, vy, Fy)]\n", + "z = [i + v * dt + 0.5 * f / m * dt * dt for i, v, f in zip(z, vz, Fz)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2266d4e8-8f67-4979-ae47-abf8508673a4", + "metadata": {}, + "outputs": [], + "source": [ + "vx = [v + f / m * dt for v, f in zip(vx, Fx)]\n", + "vy = [v + f / m * dt for v, f in zip(vy, Fy)]\n", + "vz = [v + f / m * dt for v, f in zip(vz, Fz)]" + ] + }, + { + "cell_type": "markdown", + "id": "e4cff076-759c-477c-9758-41bb730cd606", + "metadata": {}, + "source": [ + "Let's take a look at the particle positions and velocities:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf48e0d0-34f6-47ba-8a30-ba0c1e19489d", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plt.figure(figsize=(6, 6)).add_subplot(projection='3d')\n", + "ax.scatter3D(x, y, z)\n", + "ax.quiver(x, y, z, vx, vy, vz)" + ] + }, + { + "cell_type": "markdown", + "id": "65984f53-4b54-4f6d-aaa1-6de391150539", + "metadata": {}, + "source": [ + "That's it. By going back to the [calculation of the forces](#Calculating-forces), we can follow the motion of the particles over time." + ] + }, + { + "cell_type": "markdown", + "id": "f1f30004-a9c3-4499-84e0-976937b9f8a8", + "metadata": {}, + "source": [ + "## Exercise\n", + "Rewrite the program in a vectorized manner using `ndarray`s." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "039819a6-698f-43a6-a4f0-4f7b8852fbb1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "8cb45f43-29e2-49df-a976-bf7790fe5a44", + "metadata": {}, + "source": [ + "### Solution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ccfc4eca-c09e-448f-93db-2122be7b484c", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "import numpy\n", + "rng = numpy.random.Generator(numpy.random.MT19937())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "405b8627-e887-4ec8-85cf-c391877c0b19", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "x = rng.uniform(-L2, L2, size=N)\n", + "y = rng.uniform(-L2, L2, size=N)\n", + "z = rng.uniform(-L2, L2, size=N)\n", + "vx = numpy.zeros_like(x);\n", + "vy = numpy.zeros_like(x);\n", + "vz = numpy.zeros_like(x);" + ] + }, + { + "cell_type": "markdown", + "id": "0e3c0e11-dc33-46e0-a6da-05cb42ecfd9a", + "metadata": { + "tags": [ + "Solution" + ] + }, + "source": [ + "To get all the distances, we use a broadcasting trick. `x` is a 1-d vector of length N, but we can add an empty\n", + "second dimension using `numpy.newaxis`. Now the shape of `x` becomes (N, 1). If we put `numpy.newaxis` as first\n", + "dimension the shape of `x` becomes (1, N). Now, if we perform an operation that combines those two, the values\n", + "will be broadcast (duplicated) across the \"missing\" dimension and we generate a matrix of all pairs. Something\n", + "similar happens when we use `numpy.meshgrid`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d8cad39-dd89-4379-b549-64a67465db3f", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "Dxx = x[:, numpy.newaxis] - x[numpy.newaxis, :]\n", + "Dyy = y[:, numpy.newaxis] - y[numpy.newaxis, :]\n", + "Dzz = z[:, numpy.newaxis] - z[numpy.newaxis, :]\n", + "D = numpy.sqrt(Dxx * Dxx + Dyy * Dyy + Dzz * Dzz)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba5403cc-d3d0-46d8-a1bb-01f5056d0963", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "Fxx = G * m * m * Dxx / (D * D * D + epsilon)\n", + "Fyy = G * m * m * Dyy / (D * D * D + epsilon)\n", + "Fzz = G * m * m * Dzz / (D * D * D + epsilon)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "500347dc-2dfd-4481-a81b-4276cbc00863", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "Fx = Fxx.sum(axis=0)\n", + "Fy = Fyy.sum(axis=0)\n", + "Fz = Fzz.sum(axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0745105-fa07-4054-8ddc-274de4a510f8", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "x += vx * dt + 0.5 * Fx / m * dt * dt\n", + "y += vy * dt + 0.5 * Fy / m * dt * dt\n", + "z += vz * dt + 0.5 * Fz / m * dt * dt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "699fb1a4-349b-46ad-acfc-177465aade2a", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "vx += Fx / m * dt\n", + "vy += Fy / m * dt\n", + "vz += Fz / m * dt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fe70091-fffd-4613-a798-1f9c54bfbfa4", + "metadata": { + "tags": [ + "Solution" + ] + }, + "outputs": [], + "source": [ + "ax = plt.figure(figsize=(6, 6)).add_subplot(projection='3d')\n", + "ax.scatter3D(x, y, z)\n", + "ax.quiver(x, y, z, vx, vy, vz)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f236119-af8c-499d-86cf-1d6b98f9e5fd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "HPC Python 2021", + "language": "python", + "name": "hpcpy21" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/solutions/04_Profiling a simple md code.ipynb b/solutions/05_Profiling a simple md code.ipynb similarity index 99% rename from solutions/04_Profiling a simple md code.ipynb rename to solutions/05_Profiling a simple md code.ipynb index 06ba32f607c41ce408ae83273b4d58c21f60169c..a367d6458c4875571806e98acee5fb5aa2b9faa5 100644 --- a/solutions/04_Profiling a simple md code.ipynb +++ b/solutions/05_Profiling a simple md code.ipynb @@ -10,7 +10,7 @@ "source": [ "# Profiling\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -643,9 +643,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -657,7 +657,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/05_Debugging.ipynb b/solutions/06_Debugging.ipynb similarity index 98% rename from solutions/05_Debugging.ipynb rename to solutions/06_Debugging.ipynb index 23ef132e8779bd8d3b39b994027f7677378c6cbf..22117b23f48eb2426597982c144d0aadf923c7de 100644 --- a/solutions/05_Debugging.ipynb +++ b/solutions/06_Debugging.ipynb @@ -6,7 +6,7 @@ "source": [ "# Debugging Python\n", "<div class=\"dateauthor\">\n", - "16 November 2020 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -183,7 +183,7 @@ "metadata": {}, "source": [ "```bash\n", - "source hpcpy20\n", + "source hpcpy21\n", "pudb3 buggy.py\n", "```" ] @@ -325,9 +325,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -339,7 +339,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/06_IDEs.ipynb b/solutions/07_IDEs.ipynb similarity index 97% rename from 06_IDEs.ipynb rename to solutions/07_IDEs.ipynb index 4ed11a5d16378180315afa4e853b491f3b6e01cf..ba2acfd2506f6c71080e8dec05a8cd0fe28ff46a 100644 --- a/06_IDEs.ipynb +++ b/solutions/07_IDEs.ipynb @@ -11,7 +11,7 @@ "# Integrated Development Environments (IDEs) for Python\n", "\n", "<div class=\"dateauthor\">\n", - "3 July 2019 | Jan H. Meinke\n", + "07 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -254,9 +254,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2019a", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy19a" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -268,7 +268,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/07_LocalParallel.ipynb b/solutions/08_LocalParallel.ipynb similarity index 97% rename from 07_LocalParallel.ipynb rename to solutions/08_LocalParallel.ipynb index ff6caa38678c4c53b7c35298e3b4f778c640004f..6bb08b74edee33ce757f9e31dd0f0d8c5017a3ae 100644 --- a/07_LocalParallel.ipynb +++ b/solutions/08_LocalParallel.ipynb @@ -11,7 +11,7 @@ "# Interactive Parallel Computing with IPython Parallel\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -27,7 +27,7 @@ "\n", "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`.\n", + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`.\n", "\n", "In the terminal type ``ipcluster``. You'll see the help message telling you that you need to give it subcommand. Take a look at the message and then enter \n", "\n", @@ -535,7 +535,7 @@ }, "outputs": [], "source": [ - "c = dview.apply(np.dot, a, b) # This uses a and b from the notebook" + "c = dview.apply(lambda a,b: np.dot(a,b), a, b) # This uses a and b from the notebook" ] }, { @@ -1032,7 +1032,7 @@ } }, "source": [ - "Latency (the time until something happens) and bandwith (the amount of data we get through the network) are two important properties of your parallel system that define what is practical and what is not. We will use the ``%timeit`` magic to measure these properties. ``%timit`` and its sibbling ``%%timeit`` measure the run time of a statement (cell in the case of ``%%timeit``) by executing the statement multiple times (by default at least 3 times). For short running routines many loops of 3 executions are performed and the minimum time measured is then displayed. The number of loops and the number of executions can be adjusted. Take a look at the documentation. Give it a try." + "Latency (the time until something happens) and bandwidth (the amount of data we get through the network) are two important properties of your parallel system that define what is practical and what is not. We will use the ``%timeit`` magic to measure these properties. ``%timit`` and its sibbling ``%%timeit`` measure the run time of a statement (cell in the case of ``%%timeit``) by executing the statement multiple times (by default at least 3 times). For short running routines many loops of 3 executions are performed and the minimum time measured is then displayed. The number of loops and the number of executions can be adjusted. Take a look at the documentation. Give it a try." ] }, { @@ -1338,8 +1338,8 @@ }, "outputs": [], "source": [ - "bwmax = len(rc) * 256 * 8 / 12.1e-3\n", - "bwmin = len(rc) * 8 / 9.05e-3\n", + "bwmax = len(rc) * 256 * 8 / 9.8e-3\n", + "bwmin = len(rc) * 8 / 6.1e-3\n", "print(\"The bandwidth is between %.2f kB/s and %.2f kB/s.\" %( bwmin, bwmax))" ] }, @@ -1800,9 +1800,9 @@ "metadata": { "celltoolbar": "Slideshow", "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1814,7 +1814,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/08_LocalTaskParallel.ipynb b/solutions/09_LocalTaskParallel.ipynb similarity index 99% rename from 08_LocalTaskParallel.ipynb rename to solutions/09_LocalTaskParallel.ipynb index c98ba02f64ae9d81a83ee6c2d1d7157810fb2c7b..0d7e42b46e32c60f582c9b801c539125f1ea205d 100644 --- a/08_LocalTaskParallel.ipynb +++ b/solutions/09_LocalTaskParallel.ipynb @@ -336,9 +336,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -350,7 +350,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/09_Numba vectorize.ipynb b/solutions/10_Numba vectorize.ipynb similarity index 96% rename from solutions/09_Numba vectorize.ipynb rename to solutions/10_Numba vectorize.ipynb index 131ce5f794d7012be96a6e069306c8a8dce981a3..6194a384489d9de729db06a85d7f526eee7211da 100644 --- a/solutions/09_Numba vectorize.ipynb +++ b/solutions/10_Numba vectorize.ipynb @@ -11,7 +11,7 @@ "# Numba vectorize\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -538,6 +538,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -553,6 +556,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -565,7 +571,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, "outputs": [], "source": [ "%timeit M = escape_time_vec(P, 50)" @@ -574,16 +585,21 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -595,7 +611,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/10_NumbaIntro.ipynb b/solutions/11_NumbaIntro.ipynb similarity index 98% rename from solutions/10_NumbaIntro.ipynb rename to solutions/11_NumbaIntro.ipynb index e35b79997327567f2d6b74dfa48de2bc41460032..2819978597e579a7c1d58807ff34180e52106ddd 100644 --- a/solutions/10_NumbaIntro.ipynb +++ b/solutions/11_NumbaIntro.ipynb @@ -11,7 +11,7 @@ "# Introduction to Numba's jit compiler\n", "\n", "<div class=\"dateauthor\">\n", - "17 November 2020 | Jan H. Meinke\n", + "08 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -101,7 +101,7 @@ } }, "source": [ - "When we call `python_sum`, the interpreter goes through it line by line. For each item it has to interpret `res += x` and execute it, i.e., call apropriate C routines that have been compiled for the processor. The only requirements for `a` in this function ar that it is iterable and its elements support the `+` operator. For the following little benchmark, we'll use an `ndarray` of random numbers." + "When we call `python_sum`, the interpreter goes through it line by line. For each item it has to interpret `res += x` and execute it, i.e., call apropriate C routines that have been compiled for the processor. The only requirements for `a` in this function are that it is iterable and its elements support the `+` operator. For the following little benchmark, we'll use an `ndarray` of random numbers." ] }, { @@ -201,8 +201,8 @@ } }, "source": [ - "In compiled languages such as C, C++, Fortran, and Rust a compiler would translate the code once \n", - "and store the results in machine code for a particular processor, but it doesn't translate it \n", + "In compiled languages such as C, C++, Fortran, and Rust a compiler translates the code once \n", + "and stores the results in machine code for a particular processor. It doesn't have to translate it \n", "literally, but can look for optimization and map the work optimally to the capabilities of the \n", "processor. That's what makes this much faster but also less flexible. In C++ the sum may be written \n", "like this:" @@ -291,7 +291,7 @@ } }, "source": [ - "Compiling a program to machine code involves at least to phases. In the first phase the human readable \n", + "Compiling a program to machine code involves at least two phases. In the first phase the human readable \n", "program is translated into something that is more palable to a computer such as an \n", "[abstract syntax tree][AST] or [AST][]. Many compilers then perform a first analysis and pattern \n", "matching on the [AST][] before machine specific optimization are applied.\n", @@ -648,7 +648,7 @@ }, "outputs": [], "source": [ - "print(\"The version of numpy, we used has been compiled against Intel's math kernel library (MKL) and is therefore about %.0f times faster.\" \n", + "print(\"The version of numpy, we used has been compiled against Intel's math kernel library (MKL) and is therefore about %.0f times faster. \" \n", " \"If we used a version that has not been compiled against a fast BLAS library, it would take about the same time as the numba routine.\" \n", " % (t_numba_mm_1000.best / t_numpy_mm_1000.best))" ] @@ -1458,9 +1458,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1472,7 +1472,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/11_Speeding up your code with Cython.ipynb b/solutions/12_Speeding up your code with Cython.ipynb similarity index 99% rename from solutions/11_Speeding up your code with Cython.ipynb rename to solutions/12_Speeding up your code with Cython.ipynb index b951d905ae6002eb8b0891bbaadb52f5bb8386b8..f4a96bb36cf9b73595b7489d38caffbd051269f1 100644 --- a/solutions/11_Speeding up your code with Cython.ipynb +++ b/solutions/12_Speeding up your code with Cython.ipynb @@ -20,7 +20,7 @@ }, "source": [ "<div class=\"dateauthor\">\n", - "18 November 2020 | Jan H. Meinke\n", + "09 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -875,7 +875,7 @@ } }, "source": [ - "**Exercise:** Take the Cython code that defines dot using `prange` in [Adding OpenMP](#Adding-OpenMP) and write it to `dot.pyx` using the `%%writefile` magic. Make sure to comment out the `cython magic`. Take the above code for setup.py and copy it into a file called `setup.py`. Change the setup.py code to build a module named dot and use `dot.pyx`. Then build the extension in a terminal window with the command. **Note:** Make sure our environment is loaded `source hpcpy20`.\n", + "**Exercise:** Take the Cython code that defines dot using `prange` in [Adding OpenMP](#Adding-OpenMP) and write it to `dot.pyx` using the `%%writefile` magic. Make sure to comment out the `cython magic`. Take the above code for setup.py and copy it into a file called `setup.py`. Change the setup.py code to build a module named dot and use `dot.pyx`. Then build the extension in a terminal window with the command. **Note:** Make sure our environment is loaded `source hpcpy21`.\n", "\n", "```bash\n", "python setup.py build_ext --inplace\n", @@ -1351,9 +1351,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1365,7 +1365,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/12_Writing your own Python bindings.ipynb b/solutions/13_Writing your own Python bindings.ipynb similarity index 97% rename from solutions/12_Writing your own Python bindings.ipynb rename to solutions/13_Writing your own Python bindings.ipynb index 7c5116924bdaf08824b2d80efc56bced6a0790d3..98170e068bfb47dfe5d450eaf132c994f5adb3cb 100644 --- a/solutions/12_Writing your own Python bindings.ipynb +++ b/solutions/13_Writing your own Python bindings.ipynb @@ -16,7 +16,7 @@ "metadata": {}, "source": [ "<div class=\"dateauthor\">\n", - "18 November 2020 | Jan H. Meinke\n", + "09 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -92,7 +92,7 @@ "\n", "Wait until the build has finished and then continue with this notebook.\n", "\n", - "**Tip:** You can open a terminal from within JupyterLab by going to File->New->Terminal. To get the right environment in a terminal `source hpcpy20` in the tutorial directory." + "**Tip:** You can open a terminal from within JupyterLab by going to File->New->Terminal. To get the right environment in a terminal `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -268,11 +268,11 @@ "source": [ "### Exercise\n", "Use the terminal that you used earlier to run `build.sh` or open a new one. Make sure you are in the \n", - "tutorial directory. Source `hpcpy20` using `source hpcpy20`. Change into code/textstats/ and compile \n", + "tutorial directory. Source `hpcpy21` using `source hpcpy21`. Change into code/textstats/ and compile \n", "the file word_frequency.F90 with the following command:\n", "\n", "```bash\n", - "ifort word_frequency.F90 -shared -O2 -o build/libwf.so -fPIC\n", + "gfortran word_frequency.F90 -shared -O2 -o build/libwf.so -fPIC\n", "```\n", "\n", "```bash\n", @@ -334,7 +334,7 @@ } }, "source": [ - "If you compiled the library with the option `-assume nounderscore`, you could use the original declaration without underscore with libwf.so.\n", + "If you compiled the library with the option `-fno-underscoring`, you could use the original declaration without underscore with libwf.so.\n", "\n", "**Note**: There is no way to *reload* a library using cffi." ] @@ -623,7 +623,7 @@ " ct: int \n", " number of occurences of word in file with filename\n", " \"\"\"\n", - " # We first need to decode the strings\n", + " # We first need to encode the strings\n", " filenameb = filename.encode('UTF-8')\n", " wordb = word.encode('UTF-8')\n", " # Now we can convert them to C strings\n", @@ -1073,7 +1073,7 @@ "This code can be compiled like this:\n", "\n", "```bash\n", - "icpc -O3 -shared -fpic -std=c++14 `python3-config --includes` -I/p/project/training2020/packages/lib/python3.8/site-packages/pybind11/include -I code/text_stats `python3-config --cflags --ldflags` code/text_stats/text_stats_bind.cpp -o text_stats.so -L code/text_stats/build -ltext_stats\n", + "g++ -O3 -shared -fpic -std=c++14 `python3-config --includes` `python -m pybind11 --includes` -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats \n", "```" ] }, @@ -1087,7 +1087,7 @@ }, "outputs": [], "source": [ - "!icpc -O3 -shared -fpic -std=c++14 `python3-config --includes` -I/p/project/training2020/packages/lib/python3.8/site-packages/pybind11/include -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats " + "!g++ -O3 -shared -fpic -std=c++14 `python3-config --includes` `python -m pybind11 --includes` -I code/text_stats code/text_stats/text_stats_bind.cpp -o text_stats.so `python3-config --cflags --ldflags` -L code/text_stats/build -ltext_stats " ] }, { @@ -1527,9 +1527,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1541,7 +1541,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/13_Introduction to Dask.ipynb b/solutions/14_Introduction to Dask.ipynb similarity index 99% rename from solutions/13_Introduction to Dask.ipynb rename to solutions/14_Introduction to Dask.ipynb index 4a2f3f92ac63d599ad295ac2f6d9df29bb98bf78..2aedd855d9692c467d2ece96eead2af9728c17c6 100644 --- a/solutions/13_Introduction to Dask.ipynb +++ b/solutions/14_Introduction to Dask.ipynb @@ -11,7 +11,7 @@ "# Introduction to Dask\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Olav Zimmermann\n", + "10 June 2021 | Olav Zimmermann\n", "</div>" ] }, @@ -775,9 +775,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "HPC Python 2021", "language": "python", - "name": "python3" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -789,7 +789,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/14_Introduction to MPI.ipynb b/solutions/15_Introduction to MPI.ipynb similarity index 98% rename from solutions/14_Introduction to MPI.ipynb rename to solutions/15_Introduction to MPI.ipynb index 8f41493c331ff548d5f48ac920d64d0a8bd5e227..46b75a9924362a630302138a415b429ee6b1fa17 100644 --- a/solutions/14_Introduction to MPI.ipynb +++ b/solutions/15_Introduction to MPI.ipynb @@ -11,7 +11,7 @@ "# Introduction to MPI\n", "\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Jan H. Meinke\n", + "10 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -95,7 +95,7 @@ "\n", "For each `Send` there has to be a matching `Recv`. This means that the meta information has to fit (including the tag). There are some wildcards and some additional commands that make this more flexible.\n", "\n", - "Sending and receiving can be blocking or non-blocking. In the latter case, the flow of the program continuous after the call. In the former the program waits until the message has been transmitted. There is a very real danger for deadlocks here!" + "Sending and receiving can be blocking or non-blocking. In the non-blocking case, the flow of the program continuous after the call. In the blocking case the program waits until the message has been transmitted. There is a very real danger for deadlocks here!" ] }, { @@ -233,7 +233,7 @@ "source": [ "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`." + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -1151,7 +1151,7 @@ " above to parallelize the program using MPI over 3 domains using 3 MPI ranks. Construct the grid \n", " in such a way that you can easily divide it into 3 domains. Use [point to point communication](#Point-to-point). The program should run to convergence determined by epsilon just as before.\n", "\n", - " Tip: It may be easier to turn the problem by 90° or use Fortran order for the NumPy arrays.\n", + " Tip: It may be easier to rotate the problem by 90° or use Fortran order for the NumPy arrays.\n", " \n", "2. Extend the program from the first part of the exercise to use more than 3 ranks with 1 domain \n", " per rank.\n", @@ -1417,7 +1417,7 @@ } }, "source": [ - "Elimintating $t_1$, we get" + "Eliminating $t_1$, we get" ] }, { @@ -1465,7 +1465,7 @@ } }, "source": [ - "Let's plot this vs the number of processors." + "Let's plot this vs. the number of processors." ] }, { @@ -1641,7 +1641,7 @@ "source": [ "# This cell is executed within the notebook. The engines don't know anything about it\n", "rng = numpy.random.Generator(numpy.random.MT19937())\n", - "a = np.random.normal(size=100000)" + "a = numpy.random.normal(size=100000)" ] }, { @@ -1706,7 +1706,7 @@ "outputs": [], "source": [ "%%px\n", - "sum_partial = np.sum(a_partial)\n", + "sum_partial = numpy.sum(a_partial)\n", "total = comm.reduce(sum_partial)" ] }, @@ -1761,13 +1761,20 @@ "source": [ "sum(sum_partial)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1779,7 +1786,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/solutions/15_Introduction to CuPy.ipynb b/solutions/16_Introduction to CuPy.ipynb similarity index 98% rename from solutions/15_Introduction to CuPy.ipynb rename to solutions/16_Introduction to CuPy.ipynb index 1481e6878196a0bcd15ae488cae236aa67738c0a..aa9e26e98d3061d4b3dcf7090dbd2e11ff97b356 100644 --- a/solutions/15_Introduction to CuPy.ipynb +++ b/solutions/16_Introduction to CuPy.ipynb @@ -10,7 +10,7 @@ "source": [ "# Introduction to CuPy\n", "<div class=\"dateauthor\">\n", - "19 Nov 2020 | Jan H. Meinke\n", + "10 June 2021 | Jan H. Meinke\n", "</div>\n", "<img src=\"images/cupy.png\" style=\"float:right\">" ] @@ -440,9 +440,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -454,7 +454,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/solutions/16_CUDA for Python.ipynb b/solutions/17_CUDA for Python.ipynb similarity index 99% rename from solutions/16_CUDA for Python.ipynb rename to solutions/17_CUDA for Python.ipynb index fd1566a95657587e25f54f67afde3c75b5b8239e..9b6f436d1fb28f6a720df47d3619b9392d078383 100644 --- a/solutions/16_CUDA for Python.ipynb +++ b/solutions/17_CUDA for Python.ipynb @@ -11,7 +11,7 @@ "# Numba and GPUs\n", "\n", "<div class=\"dateauthor\">\n", - "20 November 2020 | Jan H. Meinke\n", + "11 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -1460,9 +1460,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -1474,7 +1474,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/solutions/17_CUDA and MPI.ipynb b/solutions/18_CUDA and MPI.ipynb similarity index 92% rename from solutions/17_CUDA and MPI.ipynb rename to solutions/18_CUDA and MPI.ipynb index f3fefe7bf2aa277269c2562aafae232837663625..1fcb061e0fe8c3de17e85754b6efba0d836ffb0c 100644 --- a/solutions/17_CUDA and MPI.ipynb +++ b/solutions/18_CUDA and MPI.ipynb @@ -11,7 +11,7 @@ "# CUDA for Python and MPI4Py\n", "\n", "<div class=\"dateauthor\">\n", - "20 November 2020 | Jan H. Meinke\n", + "11 June 2021 | Jan H. Meinke\n", "</div>" ] }, @@ -58,7 +58,7 @@ "source": [ "Click on the ``+``-sign at the top of the Files tab on the left to start a new launcher. In the launcher click on Terminal. A terminal will open as a new tab. Grab the tab and pull it to the right to have the terminal next to your notebook.\n", "\n", - "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source hpcpy20`." + "**Note**: The terminal does not have the same modules loaded as the notebook. To fix that type `source $PROJECT_training2114/hpcpy21`." ] }, { @@ -73,7 +73,7 @@ "\n", "```bash\n", "export OMP_NUM_THREADS=10\n", - "srun -n 4 -c 12 ipengine start\n", + "srun -n 4 -c 10 ipengine start\n", "```" ] }, @@ -106,7 +106,7 @@ "source": [ "%%px\n", "# Let's ignore some deprecation warnings\n", - "from numba.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning\n", + "from numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning\n", "import warnings\n", "\n", "warnings.simplefilter('ignore', category=NumbaDeprecationWarning)\n", @@ -458,6 +458,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -523,6 +526,9 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] @@ -624,19 +630,26 @@ "cell_type": "code", "execution_count": null, "metadata": { + "slideshow": { + "slide_type": "skip" + }, "tags": [ "Solution" ] }, "outputs": [], "source": [ - "%%writefile multi_gpu_mandelbrot.py\n", "# Solution for calculating the Mandelbrot set on 4 GPUs/node\n", "import numpy\n", "import mpi4py.MPI as MPI\n", + "import matplotlib\n", + "import time\n", + "\n", + "matplotlib.use(\"agg\")\n", "import matplotlib.pyplot as plt\n", "from numba import vectorize, cuda\n", "\n", + "\n", "@vectorize(\"int64(complex128, int64)\", target=\"cuda\") # Replace cuda with cpu to test w/o GPU\n", "def escape_time(p, maxtime):\n", " \"\"\"Perform the Mandelbrot iteration until it's clear that p diverges\n", @@ -655,16 +668,22 @@ " comm = MPI.COMM_WORLD\n", " my_rank = comm.Get_rank()\n", " number_of_ranks = comm.Get_size()\n", - " number_of_gpus_per_node = 4\n", + " number_of_gpus_per_node = len(cuda.gpus)\n", " \n", - " # If you want to see if GPU selection makes a difference choose a grid size of 4800 by 6400 and\n", - " # measure the time with and without the next line commented out.\n", + " # On our systems, each rank gets its own GPU per default. You can override\n", + " # the selection by setting CUDA_VISIBLE_DEVICES=0,1,2,3 just before calling srun.\n", + " # Compare for example:\n", + " #\n", + " # 1. srun python multi_gpu_mandelbrot.py\n", + " # 2. CUDA_VISIBLE_DEVICES=0 srun python multi_gpu_mandelbrot.py\n", + " # 3. CUDA_VISIBLE_DEVICES=0,1,3,4 srun python multi_gpu_mandelbrot.py\n", " cuda.select_device(my_rank % number_of_gpus_per_node)\n", " \n", - " maxtime = 50\n", + " maxtime = 200\n", + " t0 = time.time()\n", " if my_rank == 0:\n", " limits = (-2.2 - 1.2j, 1 + 1.2j) # lower left, upper right corner of the complex plane\n", - " gridsize = (480, 640) # number of rows, number of columns\n", + " gridsize = (4800, 6400) # number of rows, number of columns\n", " else:\n", " limits = None\n", " gridsize = None\n", @@ -692,15 +711,16 @@ " M = None # Don't need to allocate space on the other nodes for M\n", " \n", " comm.Gather(my_M, M)\n", - " \n", + " t1 = time.time()\n", " if my_rank == 0: # Only rank 0 has the data and should plot the image\n", " plt.imshow(M)\n", - " plt.savefig(f\"mandelbrot_{number_of_ranks}_{number_of_gpus_per_node}.png\")\n", - " \n", + " plt.savefig(f\"mandelbrot_{number_of_ranks}_{number_of_gpus_per_node}.png\", dpi=600)\n", + " print(f\"Calculation for a {global_gridsize} Mandelbrot set with up to {maxtime} iterations\",\n", + " f\"took {t1 - t0:.3f} s\")\n", + "\n", + "\n", "if __name__ == \"__main__\":\n", - " main()\n", - " \n", - " \n" + " main()" ] }, { @@ -713,9 +733,9 @@ ], "metadata": { "kernelspec": { - "display_name": "HPC Python 2020", + "display_name": "HPC Python 2021", "language": "python", - "name": "hpcpy20" + "name": "hpcpy21" }, "language_info": { "codemirror_mode": { @@ -727,7 +747,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/solutions/build.sh b/solutions/build.sh index 9509e2fd8d6ad601ca5e0c3493d74093b4d206a5..399a64bbf6b0e4fbd0c70a18df6ca3af2c9d0aba 100755 --- a/solutions/build.sh +++ b/solutions/build.sh @@ -5,7 +5,7 @@ pushd code/point rm -rf build mkdir -p build cd build -CC=icc CXX=icpc cmake .. > /dev/null +CC=gcc CXX=gcc cmake .. > /dev/null make popd @@ -14,6 +14,6 @@ pushd code/text_stats rm -rf build mkdir -p build cd build -CC=icc CXX=icpc cmake .. > /dev/null +CC=gcc CXX=g++ cmake .. > /dev/null make popd diff --git a/solutions/code b/solutions/code index c787d1ee6a68815e557245d52ad924db7e184eae..2edff2610e81084123a9969fc73223981f6d87b8 120000 --- a/solutions/code +++ b/solutions/code @@ -1 +1 @@ -../code/ \ No newline at end of file +../code \ No newline at end of file diff --git a/solutions/data b/solutions/data index eed2d0bc7940e7ec030de8b8307e476dd01c56ae..4909e06efb479a01e44e67265074c726796f4959 120000 --- a/solutions/data +++ b/solutions/data @@ -1 +1 @@ -../data/ \ No newline at end of file +../data \ No newline at end of file diff --git a/solutions/hpcpy20 b/solutions/hpcpy21 old mode 100644 new mode 100755 similarity index 54% rename from solutions/hpcpy20 rename to solutions/hpcpy21 index d159b3d60a27bd37d33479d58a9295a77fcf03e2..9047da7ad17d6701a4eb170be7776c52fb6c92a1 --- a/solutions/hpcpy20 +++ b/solutions/hpcpy21 @@ -1,20 +1,20 @@ #!/bin/bash module purge --force module load Stages/2020 -module load Intel +module load GCC module load ParaStationMPI module load Graphviz module load SciPy-Stack module load numba module load dask module load mpi4py +module load Jupyter module load CUDA -module load CMake #export NUMBAPRO_NVVM=$CUDA_HOME/nvvm/lib64/libnvvm.so #export NUMBAPRO_LIBDEVICE=$CUDA_HOME/nvvm/libdevice -export LD_LIBRARY_PATH=/p/project/training2020/resources/code/text_stats/build:$LD_LIBRARY_PATH -export LD_LIBRARY_PATH=/p/project/training2020/resources/code/point/build:$LD_LIBRARY_PATH -export PYTHONPATH=/p/project/training2020/packages/lib/python3.8/site-packages:$PYTHONPATH -export PATH=$PATH:/p/project/training2020/packages/bin -export PS1='π20[\u@\h \W]\$ ' - +export LD_LIBRARY_PATH=/p/project/training2114/resources/code/text_stats/build:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=/p/project/training2114/resources/code/point/build:$LD_LIBRARY_PATH +export PYTHONPATH=/p/project/training2114/packages/lib/python3.8/site-packages:$PYTHONPATH +export PATH=$PROJECT_training2114/packages/bin:$PATH +export HPCPY2021=1 +export PS1='π21[\u@\h \W]\$ ' diff --git a/solutions/test.dat b/solutions/test.dat new file mode 100644 index 0000000000000000000000000000000000000000..51dc318c44bbb2408408c96adde3a3db47c171a2 --- /dev/null +++ b/solutions/test.dat @@ -0,0 +1,5 @@ +//// This and the next line are headers +Name income rev_q1 rev_q2 rev_q3 rev_q4 +larry, 200, 0, 1.5, 2.8, 0.2 +bill, 1000, 12.5, 15, 18, 33.4 +steve, 5600, 128, 40, 0, 0 \ No newline at end of file diff --git a/test.dat b/test.dat new file mode 100644 index 0000000000000000000000000000000000000000..51dc318c44bbb2408408c96adde3a3db47c171a2 --- /dev/null +++ b/test.dat @@ -0,0 +1,5 @@ +//// This and the next line are headers +Name income rev_q1 rev_q2 rev_q3 rev_q4 +larry, 200, 0, 1.5, 2.8, 0.2 +bill, 1000, 12.5, 15, 18, 33.4 +steve, 5600, 128, 40, 0, 0 \ No newline at end of file