diff --git a/course/Day-3/presentation.cfg b/course/Day-3/presentation.cfg new file mode 100644 index 0000000000000000000000000000000000000000..a66a68fc944d590ff8063905eaf5849bf2be50f2 --- /dev/null +++ b/course/Day-3/presentation.cfg @@ -0,0 +1,19 @@ +[darkslide] +; the old [landslide] is still supported +theme = ../ptb_theme +#source = ./ +source = 1-table-of-contents.md +# 0-introduction.md +# 1-table-of-contents.md +# 2-day-1.md +# 3-day-2.md + 4-day-3.md + 1-table-of-contents.md + 5-thanks.md +destination = presentation.html +#css = my_first_stylesheet.css +# my_other_stylesheet.css +#js = jquery.js +# my_fancy_javascript.js +relative = True +linenos = inline \ No newline at end of file diff --git a/course/Day-3/presentation.html b/course/Day-3/presentation.html new file mode 100644 index 0000000000000000000000000000000000000000..b7ca6312eb655293488cc6a493e0c18093a4c760 --- /dev/null +++ b/course/Day-3/presentation.html @@ -0,0 +1,2070 @@ +<!DOCTYPE html> +<!-- + Copyright 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Original slides: Marcin Wichary (mwichary@google.com) + Modifications: Ernest Delgado (ernestd@google.com) + Alex Russell (slightlyoff@chromium.org) + + landslide modifications: Adam Zapletal (adamzap@gmail.com) + Nicolas Perriault (nperriault@gmail.com) +--> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="X-UA-Compatible" content="chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> + <title>Table of Contents</title> + <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> + <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> + + + <link rel="stylesheet" href="..\ptb_theme\css\base.css"> + + + + <link rel="stylesheet" href="..\ptb_theme\css\print.css"> + + + + <link rel="stylesheet" href="..\ptb_theme\css\screen.css"> + + + + <link rel="stylesheet" href="..\ptb_theme\css\theme.css"> + + + + <link rel="stylesheet" href="..\venv\lib\site-packages\darkslide\mods\wide16x9\css\mod.css"> + + + + + <script type="text/javascript" src="..\ptb_theme\js\slides.js"></script> + + +</head> +<body> + <div id="blank"></div> + <div class="presentation"> + <div id="current_presenter_notes"> + <div id="presenter_note"></div> + </div> + <div class="slides"> + + <!-- slide source: 1-table-of-contents.md --> + <div class="slide-wrapper"> + <div class="slide slide-1"> + <div class="inner"> + + <header><h1>Table of Contents</h1></header> + + + <section><ul> +<li> +<p>Day 1: Adaptability & Extendibility</p> +<pre><code>* Modularity in python +* DRY +* SOLID +* Design Patterns +</code></pre> +</li> +<li> +<p>Day 2: Testing, Documentation & Readability</p> +<pre><code>* Packaging +* Unit Tests +* Doctest +* Sphinx +* GitLab Integration +</code></pre> +</li> +<li> +<p>Day 3: Performance & Scalability </p> +<pre><code>* Introduction +* Profiling & Benchmarking +* Data, Do's and Dont's +* Ahmdal's law +* Parallelisation with `joblib` and `mpi4py` +</code></pre> +</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="1-table-of-contents.md">1-table-of-contents.md</a> + </aside> + + <aside class="page_number"> + 1/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-2"> + <div class="inner"> + + <header><h1>Performance & Scalability</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/achter.jpg" /></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 2/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-3"> + <div class="inner"> + + <header><h1>Single Core Performance History</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/singlecore_performance.png" /></p> +<ul> +<li>Saturation around 2003, rise of Multi-Core</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 3/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-4"> + <div class="inner"> + + <header><h1>The Parallelism Multi-Verse</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/multi-verse.png" /></p> +<h3>And New: Multi-Socket with Multi-GPU</h3></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 4/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-5"> + <div class="inner"> + + <header><h1>Optimization - Recommendations</h1></header> + + + <section><blockquote> +<p>Make it work, Make it right, Make it fast</p> +<p>-- <cite> attributed to Kent Beck </cite></p> +</blockquote> +<ul> +<li>Follow above rule!</li> +<li>Profiling and Benchmarking is a must</li> +<li>Have a "Known Good" (easy to understand!)</li> +<li>Concentrate on most heavy parts first</li> +<li>No premature optimizations!</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 5/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-6"> + <div class="inner"> + + <header><h1>Where is your time spent?</h1></header> + + + <section><p><strong>Some facts</strong>:</p> +<ul> +<li>Most time usually: <strong>Loops</strong></li> +<li> +<p>Throughput hierarchy:</p> +<p>|<strong>CPU arithmetic</strong> O(1 TB/sec)| >> |<strong>Memory</strong> O(100 GB/sec)| >> |<strong>Disk</strong> O(1 GB/sec)|</p> +</li> +<li> +<p>Instruction hierarchy:</p> +<p>|<strong>Spec. Functions</strong> O(100 cycles)| >> |<strong>Div</strong> O(10 cycles)| >> |<strong>Mult/Add</strong> O(1 cycle)|</p> +</li> +<li> +<p>Profile your App</p> +</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 6/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-7"> + <div class="inner"> + + <header><h1>Benchmarking & Profiling</h1></header> + + + <section><p>Benchmarking:</p> +<ul> +<li>Measure time spent between start and end of timer</li> +<li>Choose right problem size (too low → timer resolution, too high → takes too long)</li> +<li>Do not benchmark preparation work (unless it belongs to the algorithm you measure)</li> +<li>Repeat! (e.g. 3x and take the median as the result)</li> +</ul> +<p>Profiling:</p> +<ul> +<li>gives time spent in each method</li> +<li>overview of where to improve</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 7/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-8"> + <div class="inner"> + + <header><h1>Python <code>cProfile</code></h1></header> + + + <section><ul> +<li> +<p>Invocation from python interpreter:</p> +<div class="highlight"><pre><span></span><span class="lineno">1 </span><span class="kn">import</span> <span class="nn">cProfile</span> +<span class="lineno">2 </span><span class="kn">import</span> <span class="nn">re</span> +<span class="lineno">3 </span><span class="n">cProfile</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">'re.compile("foo|bar")'</span><span class="p">)</span> +</pre></div> + +</li> +<li> +<p>Invocation using module: <code>python -m cProfile -o profile.out main.py</code></p> +</li> +<li>Use <code>snakeviz</code> for visualisation in browser</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 8/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-9"> + <div class="inner"> + + <header><h1>Python <code>cProfile</code></h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/snakeviz.png" /> </p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 9/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-10"> + <div class="inner"> + + <header><h1>Python <code>line_profiler</code></h1></header> + + + <section><ul> +<li>Shows time spent in lines of python code</li> +<li><code>pip install line_profiler</code></li> +<li>Profiles methods having <code>@profile</code> decorator</li> +<li>Invocation: <code>kernprof.exe -l -v main.py</code></li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 10/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-11"> + <div class="inner"> + + <header><h1>Python <code>line_profiler</code></h1></header> + + + <section><pre><code>$ kernprof.exe -l -v main.py +... +Total time: 227.482 s +... +Line # Hits Time Per Hit % Time Line Contents +============================================================== + 17 @profile + 18 def filter(self, bmp_out: Addressable2D, bmp_in: Addressable2D): + ... + 25 1 0.7 0.7 0.0 sigma_squared = self._sigma * self._sigma + 26 + 27 796 543.2 0.7 0.0 for i_y in range(height): + 28 1021575 684277.0 0.7 0.3 for i_x in range(self._corr_len, width - self._corr_len): + 29 1020780 2123034.5 2.1 0.9 new_value = [0 for _ in range(3)] + 30 4083120 2850632.3 0.7 1.3 for rgb in range(3): + 31 3062340 1884852.2 0.6 0.8 val = 0.0 + 32 3062340 1880511.4 0.6 0.8 weight_sum = 0 + 33 3062340 1841103.6 0.6 0.8 counter = 0 + ... + 38 3062340 3327261.1 1.1 1.5 new_value[rgb] = round(val / weight_sum) + 39 1020780 3129795.2 3.1 1.4 bmp_out.set_at(i_x, i_y, new_value) +</code></pre></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 11/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-12"> + <div class="inner"> + + <header><h1>Hands On : Preparation</h1></header> + + + <section><ul> +<li>We study a new type of filter "Gaussian Smoothing" <strong>only in x-direction</strong></li> +<li>Again we do not bother about the boundary points within (L) distance to the picture edges</li> +</ul> +<p> + Replace color value \(c\) at \(x\) with a weighted sum over its neighborhood up to a certain correlation length \(L\) + \[c^\prime_{x} = \frac{1}{N}{\sum_{y; |x-y| \le L} c_{y} \exp{\left (-\frac{(x - y)^2}{2 \sigma^2} \right)}}\] +</p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 12/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-13"> + <div class="inner"> + + <header><h1>Hands On</h1></header> + + + <section><h2>Exercise Day-3/exercise-1/exercise-1.md</h2> +<p>Please pull from the course materials repository:</p> +<p>https://itgit.bs.ptb.de/burger03/python-course-material</p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 13/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-14"> + <div class="inner"> + + <header><h1>Memory hierarchy & SIMD</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/memory_and_simd.png" /></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 14/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-15"> + <div class="inner"> + + <header><h1>Data Structures</h1></header> + + + <section><ul> +<li>Adapt to your problem</li> +<li>Use data structures of <strong>compiled libraries</strong> (SIMD Vectorization!)</li> +<li><code>numpy.ndarray</code>, <code>pandas.DataFrame</code>, <code>torch.tensor</code>, etc.</li> +<li>Choose proper datastructure for algorithm (array, linked list, hash map ...)</li> +<li>Know asymptotics of insertion, lookup, deletion, appending etc. </li> +<li>Number representations (<code>np.int32</code> ↔ <code>np.uint8</code>; <code>np.float32</code> ↔ <code>np.float64</code>)</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 15/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-16"> + <div class="inner"> + + <header><h1>Do's & Dont's</h1></header> + + + <section><p><strong>Do's:</strong></p> +<ul> +<li>external compiled libraries</li> +<li>use python as "glue"</li> +</ul> +<p><strong>Dont's:</strong></p> +<ul> +<li>(innermost) Python loops</li> +<li><code>if</code> in loops</li> +<li>(nested) lists as data structure</li> +<li>append to lists</li> +<li>trivial repetition of computation in loops</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 16/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-17"> + <div class="inner"> + + <header><h1>Numpy Introduction I</h1></header> + + + <section><p>Check out the <a href="https://numpy.org/doc/stable/user/quickstart.html">numpy quickstart</a></p> +<ul> +<li><code>C</code>-library of n-dimensional arrays</li> +<li>arrays of same datatype aligned in memory</li> +<li>element-wise operations</li> +<li>minimal data copies ↔ works with views of same data</li> +<li>fast vectorized reduction operations (<code>np.sum</code>, <code>np.mean</code>)</li> +<li>math operations: <code>np.exp</code>, <code>np.sin</code></li> +<li>zero-copy array slicing</li> +</ul> +<p><a href="https://shihchinw.github.io/2019/03/performance-tips-of-numpy-ndarray.html">Some performance tips</a></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 17/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-18"> + <div class="inner"> + + <header><h1>Numpy Introduction II</h1></header> + + + <section><div class="highlight"><pre><span></span><span class="lineno"> 1 </span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span> +<span class="lineno"> 2 </span><span class="o">>>></span> <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> +<span class="lineno"> 3 </span><span class="o">>>></span> <span class="n">a</span> +<span class="lineno"> 4 </span><span class="n">array</span><span class="p">([[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">],</span> +<span class="lineno"> 5 </span> <span class="p">[</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">],</span> +<span class="lineno"> 6 </span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">]])</span> +<span class="lineno"> 7 </span><span class="o">>>></span> <span class="n">a</span><span class="o">.</span><span class="n">shape</span> +<span class="lineno"> 8 </span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> +<span class="lineno"> 9 </span><span class="o">>>></span> <span class="n">a</span><span class="o">.</span><span class="n">ndim</span> +<span class="lineno">10 </span><span class="mi">2</span> +<span class="lineno">11 </span><span class="o">>>></span> <span class="n">a</span><span class="o">.</span><span class="n">dtype</span><span class="o">.</span><span class="n">name</span> +<span class="lineno">12 </span><span class="s1">'int64'</span> +</pre></div> +</section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 18/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-19"> + <div class="inner"> + + <header><h1>Numpy Introduction III</h1></header> + + + <section><div class="highlight"><pre><span></span><span class="lineno"> 1 </span><span class="o">>>></span> <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="o">**</span><span class="mi">3</span> +<span class="lineno"> 2 </span><span class="o">>>></span> <span class="n">a</span> +<span class="lineno"> 3 </span><span class="n">array</span><span class="p">([</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">343</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="mi">729</span><span class="p">])</span> +<span class="lineno"> 4 </span><span class="o">>>></span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> +<span class="lineno"> 5 </span><span class="mi">8</span> +<span class="lineno"> 6 </span><span class="o">>>></span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">5</span><span class="p">]</span> +<span class="lineno"> 7 </span><span class="n">array</span><span class="p">([</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">64</span><span class="p">])</span> +<span class="lineno"> 8 </span><span class="c1"># equivalent to a[0:6:2] = 1000;</span> +<span class="lineno"> 9 </span><span class="c1"># from start to position 6, exclusive, set every 2nd element to 1000</span> +<span class="lineno">10 </span><span class="o">>>></span> <span class="n">a</span><span class="p">[:</span><span class="mi">6</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="lineno">11 </span><span class="o">>>></span> <span class="n">a</span> +<span class="lineno">12 </span><span class="n">array</span><span class="p">([</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">343</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="mi">729</span><span class="p">])</span> +<span class="lineno">13 </span><span class="o">>>></span> <span class="n">a</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># reversed a</span> +<span class="lineno">14 </span><span class="n">array</span><span class="p">([</span> <span class="mi">729</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="mi">343</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1000</span><span class="p">])</span> +</pre></div> +</section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 19/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-20"> + <div class="inner"> + + <header><h1>Hands On</h1></header> + + + <section><h2>Exercise Day-3/exercise-2/exercise-2.md</h2> +<p>Please pull from the course materials repository:</p> +<p>https://itgit.bs.ptb.de/burger03/python-course-material</p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 20/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-21"> + <div class="inner"> + + <header><h1>Discussion of Exercise 2</h1></header> + + + <section><ul> +<li>we have seen 360x speedup !!</li> +<li>any ideas why?</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 21/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-22"> + <div class="inner"> + + <header><h1>Parallelisation</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/blue_gene_p.jpg" /></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 22/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-23"> + <div class="inner"> + + <header><h1>Parallelisation</h1></header> + + + <section><ul> +<li>64-Core CPUs are now common</li> +<li>Thus: parallelisation is a matter of waiting <strong>1 day or 2 monthes</strong></li> +<li>Independent sets of data? → Consider <strong>trivial parallelisation</strong></li> +<li>Independent sets of data combined with a simple algorithm? → Consider <code>joblib</code></li> +<li>Single complex algorithm? → Consider MPI (or GPGPU)</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 23/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-24"> + <div class="inner"> + + <header><h1>Ahmdal's Law</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/ahmdal-slide.png" /></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 24/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-25"> + <div class="inner"> + + <header><h1>Python GIL</h1></header> + + + <section><ul> +<li>"Global Interpreter Lock"</li> +<li>Only one thread a time can interpret python a given time</li> +<li>Used for <strong>thread-safeness</strong> and <strong>efficiency of single-thread</strong> programs</li> +<li>Performance limitations for multi-threading in CPU bound scenarios</li> +<li>GIL often released in extension code (e.g. in <code>numpy</code>)</li> +<li>Way round: additional <strong>processes</strong> with separate memory space </li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 25/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-26"> + <div class="inner"> + + <header><h1>Using <code>joblib</code></h1></header> + + + <section><ul> +<li>Easy to use for simple parallel execution</li> +<li>Several parallel backends can be used ("loky", "multiprocessing", ...)</li> +<li>Parallelism <strong>within single node only</strong></li> +<li>Based on serialization (<code>pickle</code>, significant overhead!)</li> +<li>Use for parallelization over data on an "outer level"</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 26/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-27"> + <div class="inner"> + + <header><h1>Using <code>joblib</code></h1></header> + + + <section><h2>simple list comprehension:</h2> +<div class="highlight"><pre><span></span><span class="lineno">1 </span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span> +<span class="lineno">2 </span><span class="o">>>></span> <span class="p">[</span><span class="n">sqrt</span><span class="p">(</span><span class="n">i</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span> +<span class="lineno">3 </span><span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">,</span> <span class="mf">4.0</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">,</span> <span class="mf">6.0</span><span class="p">,</span> <span class="mf">7.0</span><span class="p">,</span> <span class="mf">8.0</span><span class="p">,</span> <span class="mf">9.0</span><span class="p">]</span> +</pre></div> + +<h2>... with <code>joblib</code> becomes:</h2> +<div class="highlight"><pre><span></span><span class="lineno">1 </span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span> +<span class="lineno">2 </span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">joblib</span> <span class="kn">import</span> <span class="n">Parallel</span><span class="p">,</span> <span class="n">delayed</span> +<span class="lineno">3 </span><span class="o">>>></span> <span class="n">Parallel</span><span class="p">(</span><span class="n">n_jobs</span><span class="o">=</span><span class="mi">2</span><span class="p">)(</span><span class="n">delayed</span><span class="p">(</span><span class="n">sqrt</span><span class="p">)(</span><span class="n">i</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> +<span class="lineno">4 </span><span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">,</span> <span class="mf">4.0</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">,</span> <span class="mf">6.0</span><span class="p">,</span> <span class="mf">7.0</span><span class="p">,</span> <span class="mf">8.0</span><span class="p">,</span> <span class="mf">9.0</span><span class="p">]</span> +</pre></div> +</section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 27/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-28"> + <div class="inner"> + + <header><h1>Hands On</h1></header> + + + <section><h2>Exercise Day-3/exercise-2/exercise-3.md</h2> +<p>Please pull from the course materials repository:</p> +<p>https://itgit.bs.ptb.de/burger03/python-course-material</p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 28/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-29"> + <div class="inner"> + + <header><h1>Message Passing Interface (MPI)</h1></header> + + + <section><ul> +<li><strong>The standard</strong> for parallel computing</li> +<li>Communication <strong>messages</strong> between processes</li> +<li>Intra-Node <strong>and</strong> Inter-Node over Networks</li> +<li>Several implementations: OpenMPI, Intel MPI, MPICH, etc.</li> +<li>Hardware-aware communication channels: shared mem, RDMA, Infiniband</li> +<li>Backend library, bindings available for most languages</li> +<li>Integrates with resource managers of job queuing (torque, slurm etc.)</li> +<li>If you do not have a server with MPI: Join the <a href="https://intranet.ptb.de/index.php?id=linux-rechencluster">Q.45 HPC-Cluster</a> ;)</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 29/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-30"> + <div class="inner"> + + <header><h1>MPI Communication</h1></header> + + + <section><ul> +<li>Point-to-Point (process A ↔ process B)</li> +<li>Can be blocking (easier, when sufficient) or non-blocking (overlapping communication and computation)</li> +<li>Collective (broadcast, scatter, gather, allToall (gather+scatter))</li> +<li>Reductions (min/max, sum, product, logical ops)</li> +<li>MPI types (MPI.INT, MPI.FLOAT, MPI.DOUBLE)</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 30/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-31"> + <div class="inner"> + + <header><h1><code>mpi4py</code> hello, world</h1></header> + + + <section><div class="highlight"><pre><span></span><span class="lineno">1 </span><span class="c1"># mpi_hello_world.py</span> +<span class="lineno">2 </span><span class="kn">from</span> <span class="nn">mpi4py</span> <span class="kn">import</span> <span class="n">MPI</span> +<span class="lineno">3 </span> +<span class="lineno">4 </span><span class="n">comm</span> <span class="o">=</span> <span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span> +<span class="lineno">5 </span><span class="n">size</span> <span class="o">=</span> <span class="n">comm</span><span class="o">.</span><span class="n">Get_size</span><span class="p">()</span> +<span class="lineno">6 </span><span class="n">rank</span> <span class="o">=</span> <span class="n">comm</span><span class="o">.</span><span class="n">Get_rank</span><span class="p">()</span> +<span class="lineno">7 </span> +<span class="lineno">8 </span><span class="k">print</span> <span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">rank</span><span class="p">)</span> +</pre></div> + +<p>Run with:</p> +<pre><code>mpirun -np 4 python mpi_hello_world.py +</code></pre></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 31/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-32"> + <div class="inner"> + + <header><h1>Non-trivial example, Laplace-Filter</h1></header> + + + <section><ul> +<li>Edge detection algorithm</li> +<li>On edges, gradient of color points normal to edge line</li> +<li>Thus gradient vector field is source-free, Laplace vanishes:</li> +</ul> +<p> + \[ 0 \equiv \Delta c_{x, y} = 4 c_{x,y} - c_{x+1,y} - c_{x-1,y} - c_{x,y+1} -c_{x,y-1}\] +</p> + +<ul> +<li>Stencil computation over nearest neighbors, need <a href="https://sites.cs.ucsb.edu/~gilbert/cs140resources/notes/GhostCells.pdf">ghost cells</a></li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 32/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-33"> + <div class="inner"> + + <header><h1>Laplace-Operator, scalar</h1></header> + + + <section><div class="highlight"><pre><span></span><span class="lineno"> 1 </span><span class="k">def</span> <span class="nf">laplace_kernel</span><span class="p">(</span><span class="n">output_field</span><span class="p">,</span> <span class="n">input_field</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">):</span> +<span class="lineno"> 2 </span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span> +<span class="lineno"> 3 </span> <span class="n">x</span> <span class="o">=</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">input_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:]</span> +<span class="lineno"> 4 </span> <span class="n">xp1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">input_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:],</span> <span class="mi">1</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> +<span class="lineno"> 5 </span> <span class="n">xm1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">input_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:],</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> +<span class="lineno"> 6 </span> <span class="n">yp1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">input_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:],</span> <span class="mi">1</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> +<span class="lineno"> 7 </span> <span class="n">ym1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">input_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:],</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> +<span class="lineno"> 8 </span> <span class="n">output_field</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="n">xp1</span> <span class="o">-</span> <span class="n">xm1</span> <span class="o">-</span> <span class="n">yp1</span> <span class="o">-</span> <span class="n">ym1</span> +<span class="lineno"> 9 </span> +<span class="lineno">10 </span> +<span class="lineno">11 </span><span class="k">class</span> <span class="nc">LaplaceFilter</span><span class="p">(</span><span class="n">FilterInterface</span><span class="p">,</span> <span class="n">FilterHelperMixin</span><span class="p">):</span> +<span class="lineno">12 </span> +<span class="lineno">13 </span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bmp_out</span><span class="p">:</span> <span class="n">Addressable2D</span><span class="p">,</span> <span class="n">bmp_in</span><span class="p">:</span> <span class="n">Addressable2D</span><span class="p">):</span> +<span class="lineno">14 </span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_and_assert_dims</span><span class="p">(</span><span class="n">bmp_out</span><span class="p">,</span> <span class="n">bmp_in</span><span class="p">)</span> +<span class="lineno">15 </span> <span class="n">laplace_kernel</span><span class="p">(</span><span class="n">bmp_out</span><span class="p">,</span> <span class="n">bmp_in</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span> +</pre></div> +</section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 33/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide slide-34"> + <div class="inner"> + + <header><h1><code>mpi4py</code> non-trivial example, Laplace-Operator</h1></header> + + + <section><p><img alt="Landscape" src="../slides/images/domain_decomposition.png" /></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 34/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 4-day-3.md --> + <div class="slide-wrapper"> + <div class="slide has_code slide-35"> + <div class="inner"> + + <header><h1>Laplace-Operator, exchange in <code>Bitmap</code></h1></header> + + + <section><div class="highlight"><pre><span></span><span class="lineno"> 1 </span><span class="c1">#laplacefilter.py</span> +<span class="lineno"> 2 </span><span class="k">def</span> <span class="nf">laplace_kernel</span><span class="p">(</span><span class="n">output_field</span><span class="p">,</span> <span class="n">input_field</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">):</span> +<span class="lineno"> 3 </span> <span class="c1"># Same code as before</span> +<span class="lineno"> 4 </span> +<span class="lineno"> 5 </span><span class="c1"># bitmap.py</span> +<span class="lineno"> 6 </span> <span class="k">def</span> <span class="nf">exchange</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> +<span class="lineno"> 7 </span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mpi_conn</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> +<span class="lineno"> 8 </span> <span class="k">return</span> +<span class="lineno"> 9 </span> <span class="k">else</span><span class="p">:</span> +<span class="lineno">10 </span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pixel_array</span> +<span class="lineno">11 </span> <span class="n">n_right</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mpi_rank</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mpi_size</span> +<span class="lineno">12 </span> <span class="n">n_left</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mpi_rank</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mpi_size</span> +<span class="lineno">13 </span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span> +<span class="lineno">14 </span> <span class="c1"># send lower edge (& receive upper)</span> +<span class="lineno">15 </span> <span class="n">send_data</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:]</span> +<span class="lineno">16 </span> <span class="n">recv_data</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span> +<span class="lineno">17 </span> <span class="bp">self</span><span class="o">.</span><span class="n">_mpi_conn</span><span class="o">.</span><span class="n">Sendrecv</span><span class="p">(</span><span class="n">send_data</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="n">n_right</span><span class="p">,</span> <span class="n">recvbuf</span><span class="o">=</span><span class="n">recv_data</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="n">n_left</span><span class="p">)</span> +<span class="lineno">18 </span> +<span class="lineno">19 </span> <span class="c1"># send upper edge (& receive lower)</span> +<span class="lineno">20 </span> <span class="n">send_data</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="p">:]</span> +<span class="lineno">21 </span> <span class="n">recv_data</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:]</span> +<span class="lineno">22 </span> <span class="bp">self</span><span class="o">.</span><span class="n">_mpi_conn</span><span class="o">.</span><span class="n">Sendrecv</span><span class="p">(</span><span class="n">send_data</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="n">n_left</span><span class="p">,</span> <span class="n">recvbuf</span><span class="o">=</span><span class="n">recv_data</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="n">n_right</span><span class="p">)</span> +</pre></div> +</section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="4-day-3.md">4-day-3.md</a> + </aside> + + <aside class="page_number"> + 35/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: --> + <div class="slide-wrapper"> + <div class="slide slide-"> + <div class="inner"> + + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="page_number"> + /37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 1-table-of-contents.md --> + <div class="slide-wrapper"> + <div class="slide slide-36"> + <div class="inner"> + + <header><h1>Table of Contents</h1></header> + + + <section><ul> +<li> +<p>Day 1: Adaptability & Extendibility</p> +<pre><code>* Modularity in python +* DRY +* SOLID +* Design Patterns +</code></pre> +</li> +<li> +<p>Day 2: Testing, Documentation & Readability</p> +<pre><code>* Packaging +* Unit Tests +* Doctest +* Sphinx +* GitLab Integration +</code></pre> +</li> +<li> +<p>Day 3: Performance & Scalability </p> +<pre><code>* Introduction +* Profiling & Benchmarking +* Data, Do's and Dont's +* Ahmdal's law +* Parallelisation with `joblib` and `mpi4py` +</code></pre> +</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="1-table-of-contents.md">1-table-of-contents.md</a> + </aside> + + <aside class="page_number"> + 36/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + <!-- slide source: 5-thanks.md --> + <div class="slide-wrapper"> + <div class="slide slide-37"> + <div class="inner"> + + <header><h1>Thanks</h1></header> + + + <section><ul> +<li>I would like to thank:<ul> +<li>C. Streeck and D. Schote for their support in organizing this workshop</li> +<li>D. Lübbert for giving me opportunity to develop and give it</li> +<li>YOU, for your interest and for following this course</li> +</ul> +</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + + <aside class="source"> + Source: <a href="5-thanks.md">5-thanks.md</a> + </aside> + + <aside class="page_number"> + 37/37 + </aside> + <div id="presenterContainer"> + Florian Burger (Q.45) + </div> + <div id="footerContainer"> + <div id="footerImage"></div> + </div> + </footer> + </div> + </div> + + </div> + </div> + + <div id="toc" class="sidebar hidden"> + <h2>Table of Contents</h2> + <table> + <caption>Table of Contents</caption> + +<!-- macro for generating subsection of TOC --> + +<!-- end of macro --> + + <!-- generating sections of TOC --> + + <tr id="toc-row-1"> + <th><a href="#slide:1">Table of Contents</a></th> + <td><a href="#slide:1">1</a></td> + </tr> + + + <tr id="toc-row-2"> + <th><a href="#slide:2">Performance & Scalability</a></th> + <td><a href="#slide:2">2</a></td> + </tr> + + + <tr id="toc-row-3"> + <th><a href="#slide:3">Single Core Performance History</a></th> + <td><a href="#slide:3">3</a></td> + </tr> + + + <tr id="toc-row-4"> + <th><a href="#slide:4">The Parallelism Multi-Verse</a></th> + <td><a href="#slide:4">4</a></td> + </tr> + + + <tr id="toc-row-5"> + <th><a href="#slide:5">Optimization - Recommendations</a></th> + <td><a href="#slide:5">5</a></td> + </tr> + + + <tr id="toc-row-6"> + <th><a href="#slide:6">Where is your time spent?</a></th> + <td><a href="#slide:6">6</a></td> + </tr> + + + <tr id="toc-row-7"> + <th><a href="#slide:7">Benchmarking & Profiling</a></th> + <td><a href="#slide:7">7</a></td> + </tr> + + + <tr id="toc-row-8"> + <th><a href="#slide:8">Python <code>cProfile</code></a></th> + <td><a href="#slide:8">8</a></td> + </tr> + + + <tr id="toc-row-9"> + <th><a href="#slide:9">Python <code>cProfile</code></a></th> + <td><a href="#slide:9">9</a></td> + </tr> + + + <tr id="toc-row-10"> + <th><a href="#slide:10">Python <code>line_profiler</code></a></th> + <td><a href="#slide:10">10</a></td> + </tr> + + + <tr id="toc-row-11"> + <th><a href="#slide:11">Python <code>line_profiler</code></a></th> + <td><a href="#slide:11">11</a></td> + </tr> + + + <tr id="toc-row-12"> + <th><a href="#slide:12">Hands On : Preparation</a></th> + <td><a href="#slide:12">12</a></td> + </tr> + + + <tr id="toc-row-13"> + <th><a href="#slide:13">Hands On</a></th> + <td><a href="#slide:13">13</a></td> + </tr> + + + <tr id="toc-row-14"> + <th><a href="#slide:14">Memory hierarchy & SIMD</a></th> + <td><a href="#slide:14">14</a></td> + </tr> + + + <tr id="toc-row-15"> + <th><a href="#slide:15">Data Structures</a></th> + <td><a href="#slide:15">15</a></td> + </tr> + + + <tr id="toc-row-16"> + <th><a href="#slide:16">Do's & Dont's</a></th> + <td><a href="#slide:16">16</a></td> + </tr> + + + <tr id="toc-row-17"> + <th><a href="#slide:17">Numpy Introduction I</a></th> + <td><a href="#slide:17">17</a></td> + </tr> + + + <tr id="toc-row-18"> + <th><a href="#slide:18">Numpy Introduction II</a></th> + <td><a href="#slide:18">18</a></td> + </tr> + + + <tr id="toc-row-19"> + <th><a href="#slide:19">Numpy Introduction III</a></th> + <td><a href="#slide:19">19</a></td> + </tr> + + + <tr id="toc-row-20"> + <th><a href="#slide:20">Hands On</a></th> + <td><a href="#slide:20">20</a></td> + </tr> + + + <tr id="toc-row-21"> + <th><a href="#slide:21">Discussion of Exercise 2</a></th> + <td><a href="#slide:21">21</a></td> + </tr> + + + <tr id="toc-row-22"> + <th><a href="#slide:22">Parallelisation</a></th> + <td><a href="#slide:22">22</a></td> + </tr> + + + <tr id="toc-row-23"> + <th><a href="#slide:23">Parallelisation</a></th> + <td><a href="#slide:23">23</a></td> + </tr> + + + <tr id="toc-row-24"> + <th><a href="#slide:24">Ahmdal's Law</a></th> + <td><a href="#slide:24">24</a></td> + </tr> + + + <tr id="toc-row-25"> + <th><a href="#slide:25">Python GIL</a></th> + <td><a href="#slide:25">25</a></td> + </tr> + + + <tr id="toc-row-26"> + <th><a href="#slide:26">Using <code>joblib</code></a></th> + <td><a href="#slide:26">26</a></td> + </tr> + + + <tr id="toc-row-27"> + <th><a href="#slide:27">Using <code>joblib</code></a></th> + <td><a href="#slide:27">27</a></td> + </tr> + + + <tr id="toc-row-28"> + <th><a href="#slide:28">Hands On</a></th> + <td><a href="#slide:28">28</a></td> + </tr> + + + <tr id="toc-row-29"> + <th><a href="#slide:29">Message Passing Interface (MPI)</a></th> + <td><a href="#slide:29">29</a></td> + </tr> + + + <tr id="toc-row-30"> + <th><a href="#slide:30">MPI Communication</a></th> + <td><a href="#slide:30">30</a></td> + </tr> + + + <tr id="toc-row-31"> + <th><a href="#slide:31"><code>mpi4py</code> hello, world</a></th> + <td><a href="#slide:31">31</a></td> + </tr> + + + <tr id="toc-row-32"> + <th><a href="#slide:32">Non-trivial example, Laplace-Filter</a></th> + <td><a href="#slide:32">32</a></td> + </tr> + + + <tr id="toc-row-33"> + <th><a href="#slide:33">Laplace-Operator, scalar</a></th> + <td><a href="#slide:33">33</a></td> + </tr> + + + <tr id="toc-row-34"> + <th><a href="#slide:34"><code>mpi4py</code> non-trivial example, Laplace-Operator</a></th> + <td><a href="#slide:34">34</a></td> + </tr> + + + <tr id="toc-row-35"> + <th><a href="#slide:35">Laplace-Operator, exchange in <code>Bitmap</code></a></th> + <td><a href="#slide:35">35</a></td> + </tr> + + + <tr id="toc-row-36"> + <th><a href="#slide:36">Table of Contents</a></th> + <td><a href="#slide:36">36</a></td> + </tr> + + + <tr id="toc-row-37"> + <th><a href="#slide:37">Thanks</a></th> + <td><a href="#slide:37">37</a></td> + </tr> + + + </table> + </div> + + <div id="help" class="sidebar hidden"> + <h2>Help</h2> + <table> + <caption>Help</caption> + <tr> + <th>Table of Contents</th> + <td>t</td> + </tr> + <tr> + <th>Exposé</th> + <td>ESC</td> + </tr> + <tr> + <th>Presenter View</th> + <td>p</td> + </tr> + <tr> + <th>Source Files</th> + <td>s</td> + </tr> + <tr> + <th>Slide Numbers</th> + <td>n</td> + </tr> + <tr> + <th>Toggle screen blanking</th> + <td>b</td> + </tr> + <tr> + <th>Show/hide next slide</th> + <td>c</td> + </tr> + <tr> + <th>Notes</th> + <td>2</td> + </tr> + <tr> + <th>Help</th> + <td>h</td> + </tr> + </table> + <br> + <strong>Generated with Darkslide 6.0.0</strong> + </div> + <script>main()</script> +</body> +</html> \ No newline at end of file diff --git a/course/slides/images/achter.jpg b/course/slides/images/achter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0fc27301ba19c038c096e0dd8d7c29b9f0a4aab Binary files /dev/null and b/course/slides/images/achter.jpg differ diff --git a/course/slides/images/ahmdal-slide.png b/course/slides/images/ahmdal-slide.png new file mode 100644 index 0000000000000000000000000000000000000000..3057bc0de5d56c2860b45d41b21f0e0cdd081417 Binary files /dev/null and b/course/slides/images/ahmdal-slide.png differ diff --git a/course/slides/images/blue_gene_p.jpg b/course/slides/images/blue_gene_p.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4554456beadafcce6ddb1ac58e5157289f144646 Binary files /dev/null and b/course/slides/images/blue_gene_p.jpg differ diff --git a/course/slides/images/domain_decomposition.png b/course/slides/images/domain_decomposition.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0af89c372aad1c2307cd0f66243dba6a14fc97 Binary files /dev/null and b/course/slides/images/domain_decomposition.png differ diff --git a/course/slides/images/mem_hierarchy.png b/course/slides/images/mem_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..a975a416bcbf9e731c1b24f916873e66800dbfa3 Binary files /dev/null and b/course/slides/images/mem_hierarchy.png differ diff --git a/course/slides/images/memory_and_simd.png b/course/slides/images/memory_and_simd.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5fa3b8159b17197c6a9bb4d891cb007a99454a Binary files /dev/null and b/course/slides/images/memory_and_simd.png differ diff --git a/course/slides/images/multi-verse.png b/course/slides/images/multi-verse.png new file mode 100644 index 0000000000000000000000000000000000000000..f38ee761d56e38a664692aa7d6026f78c6541500 Binary files /dev/null and b/course/slides/images/multi-verse.png differ diff --git a/course/slides/images/simd.png b/course/slides/images/simd.png new file mode 100644 index 0000000000000000000000000000000000000000..e35b58596b8a8c52f9af4955441ad86c388a6542 Binary files /dev/null and b/course/slides/images/simd.png differ diff --git a/course/slides/images/singlecore_performance.png b/course/slides/images/singlecore_performance.png new file mode 100644 index 0000000000000000000000000000000000000000..46cf59d7a9aa8cd3b6564856480ce9370917af36 Binary files /dev/null and b/course/slides/images/singlecore_performance.png differ