mirror of
https://github.com/fverdugo/XM_40017.git
synced 2026-11-15 05:37:17 +01:00
build based on 2c76ded
This commit is contained in:
1 parent
e1be41f09b
commit
3f2f8e38ac
42 files changed
+125398
-296
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 4.0 KiB |
+1
-1
@@ -1,2 +1,2 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Home · XM_40017</title><script data-outdated-warner src="assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script><script src="assets/iframeResizer.min.js"></script><link href="assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href><img src="assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href>XM_40017</a></span></div><form class="docs-search" action="search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li class="is-active"><a class="tocitem" href>Home</a></li><li><a class="tocitem" href="notebook-hello/">Hello World</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="matrix_matrix/">Matrix Multiplication</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Home</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Home</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/index.md#" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="XM_40017"><a class="docs-heading-anchor" href="#XM_40017">XM_40017</a><a id="XM_40017-1"></a><a class="docs-heading-anchor-permalink" href="#XM_40017" title="Permalink"></a></h1><p>Welcome!</p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="notebook-hello/">Hello World »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 31 July 2023 13:16">Monday 31 July 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Home · XM_40017</title><script data-outdated-warner src="assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script><link href="assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="assets/iframeResizer.min.js"></script><link href="assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href><img src="assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href>XM_40017</a></span></div><form class="docs-search" action="search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li class="is-active"><a class="tocitem" href>Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Home</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Home</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/index.md#" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="XM_40017"><a class="docs-heading-anchor" href="#XM_40017">XM_40017</a><a id="XM_40017-1"></a><a class="docs-heading-anchor-permalink" href="#XM_40017" title="Permalink"></a></h1><p>Welcome!</p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="julia_tutorial/">Julia Tutorial »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme<Line truncated
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>- · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/jacobi_2D/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>-</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>-</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/jacobi_2D.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/jacobi_2D.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/jacobi_2D.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/jacobi_2D.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Julia Asynchronous · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_async/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li class="is-active"><a class="tocitem" href>Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Julia Asynchronous</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Julia Asynchronous</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_async.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_async.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_async.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_async.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../julia_basics/">« Julia Basics</a><a class="docs-footer-nextpage" href="../julia_distributed/">Julia Distributed »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Julia Basics · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_basics/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li class="is-active"><a class="tocitem" href>Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Julia Basics</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Julia Basics</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_basics.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_basics.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_basics.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_basics.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../julia_intro/">« Why is Julia fast?</a><a class="docs-footer-nextpage" href="../julia_async/">Julia Asynchronous »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Julia Distributed · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_distributed/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li class="is-active"><a class="tocitem" href>Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Julia Distributed</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Julia Distributed</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_distributed.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_distributed.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_distributed.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_distributed.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../julia_async/">« Julia Asynchronous</a><a class="docs-footer-nextpage" href="../matrix_matrix/">Matrix Multiplication »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>- · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_distributed_test/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>-</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>-</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_distributed_test.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_distributed_test.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_distributed_test.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_distributed_test.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Why is Julia fast? · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_intro/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li class="is-active"><a class="tocitem" href>Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Why is Julia fast?</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Why is Julia fast?</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_intro.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_intro.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_intro.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_intro.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../julia_tutorial/">« Julia Tutorial</a><a class="docs-footer-nextpage" href="../julia_basics/">Julia Basics »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Jacobi/SOR · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_jacobi/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li class="is-active"><a class="tocitem" href>Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Jacobi/SOR</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Jacobi/SOR</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_jacobi.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_jacobi.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_jacobi.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_jacobi.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../sol_matrix_matrix/">« Solutions</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Julia Tutorial · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/julia_tutorial/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li class="is-active"><a class="tocitem" href>Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Julia Tutorial</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Julia Tutorial</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_tutorial.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/julia_tutorial.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_tutorial.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/julia_tutorial.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../julia_intro/">Why is Julia fast? »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -1,21 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Matrix Multiplication · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/matrix_matrix/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../notebook-hello/">Hello World</a></li><li><span class="tocitem">Notebooks</span><ul><li class="is-active"><a class="tocitem" href>Matrix Multiplication</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li class="is-active"><a href>Matrix Multiplication</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Matrix Multiplication</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/notebooks/notebook.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/matrix_matrix.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebook.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/matrix_matrix.html" style="width:100%"></iframe>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Matrix Multiplication · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/matrix_matrix/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox" checked/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li class="is-active"><a class="tocitem" href>Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li><a class="is-disabled">Matrix Multiplication</a></li><li class="is-active"><a href>Matrix Multiplication</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Matrix Multiplication</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/matrix_matrix.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/matrix_matrix.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/matrix_matrix.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/matrix_matrix.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../notebook-hello/">« Hello World</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 31 July 2023 13:16">Monday 31 July 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../julia_distributed/">« Julia Distributed</a><a class="docs-footer-nextpage" href="../sol_matrix_matrix/">Solutions »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
@@ -1,21 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Hello World · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/notebook-hello/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>Hello World</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Hello World</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Hello World</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/notebook-hello.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/notebook-hello.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebook-hello.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/notebook-hello.html" style="width:100%"></iframe>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>- · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/notebook-hello/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>-</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>-</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/notebook-hello.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/notebook-hello.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/notebook-hello.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/notebook-hello.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../matrix_matrix/">Matrix Multiplication »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 31 July 2023 13:16">Monday 31 July 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
</script></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -3,7 +3,7 @@
|
||||
<head><meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<title>notebook</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
|
||||
<title>julia_tutorial</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
|
||||
<script src='../assets/iframeResizer.contentWindow.min.js'></script>
|
||||
|
||||
|
||||
@@ -15123,233 +15123,418 @@ body[data-format='mobile'] .jp-OutputArea-child .jp-OutputArea-output {
|
||||
<!-- End of mathjax configuration --></head>
|
||||
<body class="jp-Notebook" data-jp-theme-light="false" data-jp-theme-name="JupyterLab Dark">
|
||||
|
||||
<div id="cell-id=babf8079" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h1 id="Hello,-world!">Hello, world!<a class="anchor-link" href="#Hello,-world!">¶</a></h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><div id="cell-id=f71f2545" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span><span class="p">]</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">Distributed</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="cell-id=4d6b67b6" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span><span class="p">]</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">https</span><span class="o">://</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">fverdugo</span><span class="o">/</span><span class="n">XM_40017</span><span class="o">.</span><span class="n">git</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="cell-id=815d977e" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">XM_40017</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><div id="cell-id=2cf68b65" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span><span class="n">XM_40017</span><span class="o">.</span><span class="n">greet</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021" width="350">
|
||||
<h3 id="Programming-large-scale-parallel-systems">Programming large-scale parallel systems<a class="anchor-link" href="#Programming-large-scale-parallel-systems">¶</a></h3><h3 id="Lectures-on-Julia-for-HPC">Lectures on Julia for HPC<a class="anchor-link" href="#Lectures-on-Julia-for-HPC">¶</a></h3><h1 id="Tutorial:-Getting-started-with-Julia">Tutorial: Getting started with Julia<a class="anchor-link" href="#Tutorial:-Getting-started-with-Julia">¶</a></h1><p>by Francesc Verdugo (VU Amsterdam)</p>
|
||||
<p>Version fall 2022</p>
|
||||
|
||||
</div>
|
||||
<div id="cell-id=81236a40" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<p>This is an attached picture:</p>
|
||||
<h2 id="Contents">Contents<a class="anchor-link" href="#Contents">¶</a></h2><ul>
|
||||
<li>Using the Julia REPL</li>
|
||||
<li>Running serial and parallel code</li>
|
||||
<li>Installing and managing packages</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=7c2e8d25" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img src="attachment:logo.png" align="left" width="200"/>
|
||||
</div>
|
||||
<h2 id="Introduction">Introduction<a class="anchor-link" href="#Introduction">¶</a></h2><p>Julia has its own way of running code and using packages. Many educational sources about Julia assume that you have this basic knowledge, which can be confusing to new users. In this lesson, we will learn these basic skills so that you can start learning more on Julia.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=d0f1685d" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<p>Another attached picture with markdown syntax <code>![]()</code>:</p>
|
||||
<p><img src="data:image/png;base64,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 truncated
|
||||
<h2 id="Preliminaries">Preliminaries<a class="anchor-link" href="#Preliminaries">¶</a></h2><p>This is a tutorial. To follow it:</p>
|
||||
<ul>
|
||||
<li>Download and install Julia from <a href="https://julialang.org/">https://julialang.org/</a></li>
|
||||
<li>Download and install VSCode and its Julia extension. How to: <a href="https://www.julia-vscode.org/docs/dev/gettingstarted/">https://www.julia-vscode.org/docs/dev/gettingstarted/</a></li>
|
||||
<li>Continue reading this document</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=7f4de0d2" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<p>A picture embedded with Base64:</p>
|
||||
<div>
|
||||
<img src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=0d36cf9e" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<p>This is a linked picture:</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=0b541664" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img src="https://raw.githubusercontent.com/fverdugo/XM_40017main/notebooks/figures/logo.png" align="left" width="200"/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=cae7f8ac" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="The-Julia-REPL">The Julia REPL<a class="anchor-link" href="#The-Julia-REPL">¶</a></h2><p>There are several ways of opening Julia depending on your operating system and your IDE, but it is usually as simple as launching the Julia app. With VSCode, open a folder (File > Open Folder). Then, press <code>Ctrl</code>+<code>Shift</code>+<code>P</code> to open the command bar, and execute <code>Julia: Start REPL</code>. If this does not work, make sure you have the Julia extension for VSCode installed. Independently of the method you use, opening Julia results in a window with some text ending with:</p>
|
||||
<pre><code>julia>
|
||||
</code></pre>
|
||||
<p>You have just opened the Julia <em>read-evaluate-print loop</em>, or simply the Julia <em>REPL</em>. Congrats! You will spend most of time using the REPL, when working in Julia. The REPL is a console waiting for user input. Just as in other consoles, the string of text right before the input area (<code>julia></code> in the case) is called the <em>command prompt</em> or simply the <em>prompt</em>.</p>
|
||||
<p>The usage is as follows:</p>
|
||||
<ul>
|
||||
<li>You write some input</li>
|
||||
<li>press enter</li>
|
||||
<li>you get the output</li>
|
||||
</ul>
|
||||
<p>For instance, try this</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><div id="cell-id=6603cd99" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span><span class="mi">1</span><span class="o">+</span><span class="mi">1</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div id="cell-id=c3b59ed4" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Hello-world!">Hello world!<a class="anchor-link" href="#Hello-world!">¶</a></h2><p>A "Hello world" example looks like this in Julia</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Hello, world!"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>Try to run it in the REPL.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Help-mode">Help mode<a class="anchor-link" href="#Help-mode">¶</a></h2><p>Curious about what function <code>println</code> does? Enter into <em>help</em> mode to look into the documentation. This is done by typing a question mark (<code>?</code>) into the inut field:</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="o">?</span>
|
||||
</pre></div>
|
||||
<p>After typing <code>?</code>, the command prompt changes to <code>help?></code>. It means we are in help mode. Now, we can type a function name to see its documentation.</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">help</span><span class="o">?></span><span class="w"> </span><span class="n">println</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Package-and-shell-modes">Package and shell modes<a class="anchor-link" href="#Package-and-shell-modes">¶</a></h2><p>The REPL comes with two more modes, namely <em>package</em> and <em>shell</em> modes. To enter package mode type</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="p">]</span>
|
||||
</pre></div>
|
||||
<p>Package mode is used to install and manage packages. We are going to discuss the package mode in greater detail later. To return back to normal mode press the backspace key several times.</p>
|
||||
<p>To enter shell mode type semicolon (<code>;</code>)</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="p">;</span>
|
||||
</pre></div>
|
||||
<p>The prompt should have changed to <code>shell></code> indicating that we are in shell mode. Now you can type commands that you would normally do on your system command line. For instance,</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">shell</span><span class="o">></span><span class="w"> </span><span class="n">ls</span>
|
||||
</pre></div>
|
||||
<p>will display the contents of the current folder in Mac or Linux. Using shell mode in Windows is not straightforward, and thus not recommended for beginners.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Running-more-complex-code">Running more complex code<a class="anchor-link" href="#Running-more-complex-code">¶</a></h2><p>Real-world Julia programs are not typed in the REPL in practice. They are written in one or more files and <em>included</em> in the REPL. To try this, create a new file called <code>hello.jl</code>, write the code of the "Hello world" example above, and save it. If you are using VSCode, you can create the file using File > New File > Julia File. Once the file is saved with the name <code>hello.jl</code>, execute it as follows</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">include</span><span class="p">(</span><span class="s">"hello.jl"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<div class="alert alert-block alert-warning">
|
||||
<b>Warning:</b> Make sure that the file <code>"hello.jl"</code> is located in the current working directory of your Julia session.
|
||||
<b>Warning:</b> Make sure that the file <code>"hello.jl"</code> is located in the current working directory of your Julia session. You can query the current directory with function <code>pwd()</code>. You can change to another directory with function <code>cd()</code> if needed. Also, make sure that the file extension is <code>.jl</code>.
|
||||
</div>
|
||||
<p>The recommended way of running Julia code is using the REPL as we did. But it is also possible to run code directly from the system command line. To this end, open a terminal and call Julia followed buy the path to the file containing the code you want to execute.</p>
|
||||
<pre><code>$ julia hello.jl
|
||||
</code></pre>
|
||||
<p>Previous line assumes that you have Julia properly installed in the system and that is usable from the terminal. In UNIX systems (Linux and Mac), the Julia binary needs to be in one of the directories listed in the <code>PATH</code> environment variable. To check that Julia is properly installed, you can use</p>
|
||||
<pre><code>$ julia --version
|
||||
</code></pre>
|
||||
<p>If this runs without error and you see a version number, you are good to go!</p>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> In this tutorial, when a code snipped starts with <code>$</code>, it should be run in the terminal. Otherwise, the code is to be run in the Julia REPL.
|
||||
</div>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> Avoid calling Julia code from the terminal, use the Julia REPL instead! Each time you call Julia from the terminal, you start a fresh Julia session and Julia will need to compile your code from scratch. This can be time consuming for large projects. In contrast, if you execute code in the REPL, Julia will compile code incrementally, which is much faster. Running code in a cluster (like in DAS-5 for the Julia assignment) is among the few situations you need to run Julia code from the terminal.
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cell-id=5b3e3d68" class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> Avoid calling Julia code from the terminal
|
||||
</div>
|
||||
<h2 id="Running-parallel-code">Running parallel code<a class="anchor-link" href="#Running-parallel-code">¶</a></h2><p>Since we are in a parallel computing course, let's run a parallel "hello world" example in Julia. Open a Julia REPL and write</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">Distributed</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="nd">@everywhere</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Hello, world! I am proc </span><span class="si">$</span><span class="p">(</span><span class="n">myid</span><span class="p">())</span><span class="s"> from </span><span class="si">$</span><span class="p">(</span><span class="n">nprocs</span><span class="p">())</span><span class="s">"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>Here, we are using the <code>Distributed</code> package, which is part of the Julia standard library that provides distributed memory parallel support. The code prints the process id and the number of processes in the current Julia session.</p>
|
||||
<p>You will provably only see output from 1 proces. We need to add more processes to run the example in parallel. This is done with the <code>addprocs</code> function.</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">addprocs</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>We have added 3 new processes, plus the old one, we have 4 processes. Run the code again.</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="nd">@everywhere</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Hello, world! I am proc </span><span class="si">$</span><span class="p">(</span><span class="n">myid</span><span class="p">())</span><span class="s"> from </span><span class="si">$</span><span class="p">(</span><span class="n">nprocs</span><span class="p">())</span><span class="s">"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>Now, you should see output from 4 processes.</p>
|
||||
<p>It is possible to specify the number of processes when starting Julia from the terminal with the <code>-p</code> argument (useful, e.g., when running in a cluster). If you launch Julia from the terminal as</p>
|
||||
<pre><code>$ julia -p 3
|
||||
</code></pre>
|
||||
<p>and then run</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="nd">@everywhere</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Hello, world! I am proc </span><span class="si">$</span><span class="p">(</span><span class="n">myid</span><span class="p">())</span><span class="s"> from </span><span class="si">$</span><span class="p">(</span><span class="n">nprocs</span><span class="p">())</span><span class="s">"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>You should get output from 4 processes as before.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><div id="cell-id=b7267f6e" class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea">
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="CodeMirror cm-s-jupyter">
|
||||
<div class=" highlight hl-julia"><pre><span></span>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Installing-packages">Installing packages<a class="anchor-link" href="#Installing-packages">¶</a></h2><p>One of the most useful features of Julia is its package manager. It allows one to install Julia packages in a straightforward and platform independent way. To illustrate this, let us consider the following parallel "Hello world" example.</p>
|
||||
<p>Copy the following block of code into a new file named <code>"hello_mpi.jl"</code></p>
|
||||
<div class="highlight"><pre><span></span><span class="c"># file hello_mpi.jl</span>
|
||||
<span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||||
<span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||||
<span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||||
<span class="n">nranks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_size</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||||
<span class="n">println</span><span class="p">(</span><span class="s">"Hello world, I am rank </span><span class="si">$rank</span><span class="s"> of </span><span class="si">$nranks</span><span class="s">"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>As you can see from this example, one can access MPI from Julia in a clean way, without type annotations and other complexities of C/C++ code.</p>
|
||||
<p>Now, run the file from the REPL</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">incude</span><span class="p">(</span><span class="s">"hello_mpi.jl"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>It provably didn't work, right? Read the error message and note that the MPI package needs to be installed to run this code.</p>
|
||||
<p>To install a package, we need to enter <em>package</em> mode. Remember that we entered into help mode by typing <code>?</code>. Package mode is activated by typing <code>]</code></p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="p">]</span>
|
||||
</pre></div>
|
||||
<p>At this point, the promp should have changed to <code>(@v1.8) pkg></code> indicating that we are in package mode. The text between parenthesis indicates which is the active <em>project</em>, i.e., where packages are going to be installed. In this case, we are working with the global project associated with our Julia installation (which is Julia 1.8 in this example, but it can be another version in your case).</p>
|
||||
<p>To install the MPI package, type</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">MPI</span>
|
||||
</pre></div>
|
||||
<p>Congrats, you have installed MPI!</p>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> Many Julia package names end with <code>.jl</code>. This is just a way of signaling that a package is written in Julia. When using such packages, the <code>.jl</code> needs to be ommited. In this case, we have isntalled the <code>MPI.jl</code> package even though we have only typed <code>MPI</code> in the REPL.
|
||||
</div>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b>
|
||||
The package you have installed it is the Julia interface to MPI, called <code>MPI.jl</code>. Note that it is not a MPI library by itself. It is just a thin wrapper between MPI and Julia. To use this interface, you need an actual MPI library installed in your system such as OpenMPI or MPICH. Julia downloads and installs a MPI library for you, but it is also possible to use a MPI library already available in your system. This is useful, e.g., when running on HPC clusters. See the documentation of <code>MPI.jl</code> for further details.
|
||||
</div>
|
||||
<p>To check that the package was installed properly, exit package mode by pressing the backspace key several times, and run it again</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">incude</span><span class="p">(</span><span class="s">"hello_mpi.jl"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>Now, it should work, but you provably get output from a single MPI rank only.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Running-MPI-code">Running MPI code<a class="anchor-link" href="#Running-MPI-code">¶</a></h2><p>To run MPI applications in parallel, you need a launcher like <code>mpiexec</code>. MPI codes written in Julia are not an exception to this rule. From the system terminal, you can run</p>
|
||||
<pre><code>$ mpiexec -np 4 julia hello_mpi.jl
|
||||
</code></pre>
|
||||
<p>But it will provably don't work since the version of <code>mpiexec</code> needs to match with the MPI version we are using from Julia. You can find the path to the <code>mpiexec</code> binary you need to use with these commands</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">mpiexec_path</span>
|
||||
</pre></div>
|
||||
<p>and then try again</p>
|
||||
<pre><code>$ /path/to/my/mpiexec -np 4 julia hello_mpi.jl
|
||||
</code></pre>
|
||||
<p>with your particular path.</p>
|
||||
<p>However, this is not very convenient. Don't worry if you could not make it work! A more elegant way to run MPI code is from the Julia REPL directly, by using these commands:</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">mpiexec</span><span class="p">(</span><span class="n">cmd</span><span class="o">-></span><span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$cmd</span><span class="sb"> -np 4 julia hello_mpi.jl`</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
<p>Now, you should see output from 4 ranks.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Installing-packages-locally">Installing packages locally<a class="anchor-link" href="#Installing-packages-locally">¶</a></h2><p>We have installed the <code>MPI</code> package globally and it will be available in all Julia sessions. However, in some situations, we want to work with different versions of the same package or to install packages in an isolated way to avoid potential conflicts with other packages. This can be done by using local projects.</p>
|
||||
<p>A project is simply a folder in the hard disk. To use a particular folder as your project, you need to <em>activate</em> it. This is done by entering package mode and using the <code>activate</code> command followed by the path to the folder you want to activate.</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">activate</span><span class="w"> </span><span class="o">.</span>
|
||||
</pre></div>
|
||||
<p>Previous command will activate the current working directory. Note that the dot <code>.</code> is indeed the path to the current folder.</p>
|
||||
<p>The prompt has changed to <code>(lessons) pkg></code> indicating that we are in the project within the <code>lessons</code> folder. The particular folder name can be different in your case.</p>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> You can activate a project directly when opening Julia from the terminal using the <code>--project</code> flag. The command <code>$ julia --project=.</code> will open Julia and activate a project in the current directory. You can also achieve the same effect by setting the environment variable <code>JULIA_PROJECT</code> with the path of the folder you want to activate.
|
||||
</div>
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Tip:</b> The active project folder and the current working directory are two independent concepts! For instance, <code>(@v1.8) pkg> activate folderB</code> and then <code>julia> cd("folderA")</code>, will activate the project in <code>folderB</code> and change the current working directory to <code>folderA</code>.
|
||||
</div>
|
||||
<p>At this point all package-related operations will be local to the new project. For instance, install the <code>DataFrames</code> package.</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="n">lessons</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">DataFrames</span>
|
||||
</pre></div>
|
||||
<p>Use the package to check that it is installed</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">DataFrames</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">DataFrame</span><span class="p">(</span><span class="n">a</span><span class="o">=</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="n">b</span><span class="o">=</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span>
|
||||
</pre></div>
|
||||
<p>Now, we can return to the global project to check that <code>DataFrames</code> has not been installed there. To return to the global environment, use <code>activate</code> without a folder name.</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="n">lessons</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">activate</span>
|
||||
</pre></div>
|
||||
<p>The prompt is again <code>(@v1.8) pkg></code></p>
|
||||
<p>Now, try to use <code>DataFrames</code>.</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">DataFrames</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">DataFrame</span><span class="p">(</span><span class="n">a</span><span class="o">=</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="n">b</span><span class="o">=</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span>
|
||||
</pre></div>
|
||||
<p>You should get an error or a warning unless you already had <code>DataFrames</code> installed globally.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Project-and-Manifest-files">Project and Manifest files<a class="anchor-link" href="#Project-and-Manifest-files">¶</a></h2><p>The information about a project is stored in two files <code>Project.toml</code> and <code>Manifest.toml</code>.</p>
|
||||
<ul>
|
||||
<li><p><code>Project.toml</code> contains the packages explicitly installed (the direct dependencies)</p>
|
||||
</li>
|
||||
<li><p><code>Manifest.toml</code> contains direct and indirect dependencies along with the concrete version of each package.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>In other words, <code>Project.toml</code> contains the packages relevant for the user, whereas <code>Manifest.toml</code> is the detailed snapshot of all dependencies. The <code>Manifest.toml</code> can be used to reproduce the same envinonment in another machine.</p>
|
||||
<p>You can see the path to the current <code>Project.toml</code> file by using the <code>status</code> operator (or <code>st</code> in its short form) while in package mode</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">status</span>
|
||||
</pre></div>
|
||||
<p>The information about the <code>Manifest.toml</code> can be inspected by passing the <code>-m</code> flag.</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">-</span><span class="n">m</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Installing-packages-from-a-project-file">Installing packages from a project file<a class="anchor-link" href="#Installing-packages-from-a-project-file">¶</a></h2><p>Project files can be used to install lists of packages defined by others. E.g., to install all the dependencies of a Julia application.</p>
|
||||
<p>Assume that a colleague has sent to you a <code>Project.toml</code> file with this content:</p>
|
||||
<pre><code>[deps]
|
||||
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
|
||||
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||
MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
|
||||
</code></pre>
|
||||
<p>Copy the contents of previous code block into a file called <code>Project.toml</code> and place it in an empty folder named <code>newproject</code>. It is important that the file is named <code>Project.toml</code>. You can create a new folder from the REPL with</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">mkdir</span><span class="p">(</span><span class="s">"newproject"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
<p>To install all the packages registered in this file you need to activate the folder containing your <code>Project.toml</code> file</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">activate</span><span class="w"> </span><span class="n">newproject</span>
|
||||
</pre></div>
|
||||
<p>and then <em>instantiating</em> it</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="n">newproject</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">instantiate</span>
|
||||
</pre></div>
|
||||
<p>The instantiate command will download and install all listed packages and their dependencies in just one click.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Getting-help-in-package-mode">Getting help in package mode<a class="anchor-link" href="#Getting-help-in-package-mode">¶</a></h2><p>You can get help about a particular package operator by writing <code>help</code> in front of it</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">help</span><span class="w"> </span><span class="n">activate</span>
|
||||
</pre></div>
|
||||
<p>You can get an overview of all package commands by typing <code>help</code> alone</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">help</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Package-operations-in-Julia-code">Package operations in Julia code<a class="anchor-link" href="#Package-operations-in-Julia-code">¶</a></h2><p>In some situations it is required to use package commands in Julia code, e.g., to automatize installation and deployment of Julia applications. This can be done using the <code>Pkg</code> package. For instance</p>
|
||||
<div class="highlight"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">Pkg</span>
|
||||
<span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">Pkg</span><span class="o">.</span><span class="n">status</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
<p>is equivalent to call <code>status</code> in package mode.</p>
|
||||
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nd">@v1</span><span class="mf">.8</span><span class="p">)</span><span class="w"> </span><span class="n">pkg</span><span class="o">></span><span class="w"> </span><span class="n">status</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
|
||||
<div class="jp-Cell-inputWrapper">
|
||||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||||
</div>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
|
||||
<h2 id="Conclusion">Conclusion<a class="anchor-link" href="#Conclusion">¶</a></h2><p>We have learned the basics of how to work with Julia. Now, you should be ready to start learning more on the language. If you want to further dig into the topics we have covered here, you can take a look and the following links</p>
|
||||
<ul>
|
||||
<li>Julia Manual <a href="https://docs.julialang.org/en/v1/manual/getting-started/">https://docs.julialang.org/en/v1/manual/getting-started/</a></li>
|
||||
<li>Package manager <a href="https://pkgdocs.julialang.org/v1/getting-started/">https://pkgdocs.julialang.org/v1/getting-started/</a></li>
|
||||
</ul>
|
||||
<p>If you want to interact with the Julia community on discourse, sign in at <a href="https://discourse.julialang.org/">https://discourse.julialang.org/</a></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -7460,7 +7460,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div class="alert alert-block alert-info">
|
||||
<b>Note:</b> Do not forget to execute the cells below before starting this notebook!
|
||||
<b>Note:</b> Do not forget to execute the cells below before starting this notebook!
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7501,7 +7501,12 @@ a.anchor-link {
|
||||
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="o">|></span><span class="w"> </span><span class="n">println</span>
|
||||
<span class="k">end</span>
|
||||
<span class="n">alg_1_deps_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="s">"b"</span><span class="p">)</span>
|
||||
<span class="n">alg_1_comm_overhead_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="w"> </span><span class="s">"c"</span><span class="p">)</span>
|
||||
<span class="n">alg_1_comp_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="w"> </span><span class="s">"a"</span><span class="p">)</span>
|
||||
<span class="n">alg_2_complex_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="w"> </span><span class="s">"b"</span><span class="p">)</span>
|
||||
<span class="n">alg_2_deps_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="s">"d"</span><span class="p">)</span>
|
||||
<span class="n">alg_3_deps_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="w"> </span><span class="s">"c"</span><span class="p">)</span>
|
||||
<span class="n">alg_3_complex_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">answer_checker</span><span class="p">(</span><span class="n">answer</span><span class="p">,</span><span class="w"> </span><span class="s">"d"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7553,7 +7558,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_intro_0.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7596,7 +7601,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_machines.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7743,7 +7748,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_intro_algs.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7779,7 +7784,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_intro_q_1.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7840,7 +7845,7 @@ d) row A[i,:] and the whole matrix B</code></pre>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_machines_1.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz50shFUIguxLXFr3CkittW6tVm21FhVxX1t3qlg1QEgmIQLuOy51a1Er2Fq1Vau2WutPVASsWK0Lsu9o2Lcsc39/nATmnnsnmZlkZgLzfb9eeb2Sc+eceQhZJvc553kc6n300Ued6+rqRgGnAd8BchAREREREREREREREdm11AFfAH/Oycm585BDDlkL4ADMnDnzQOAVoE/m4hMREREREREREREREUmrJcBJQ4YM+cSZM2dOl+rq6o+BvpmOSkREREREREREREREJM0W5+fnHxyqrq6+FiVLREREREREREREREQkO/Wtrq6+NgScnulIREREREREREREREREMuj0ELBnpqMQERERERERERERERHJoD1DQJtMRyEiIiIiIiIiIiIiIpJBbUKZjkBERERERERERERERCTTlDAREREREREREREREZGsp4SJiIiIiIiIiIiIiIhkPSVMREREREREREREREQk6+Um+PgPgH+lIA4REREREREREREREZGWdDTw/XgfnFDCxHGctwcPHlycaEQiIiIiIiIiIiIiIiLpNGvWrFtc1407YaKSXCIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZLzfTAYiIyK5v5syZu7mue3goFOoB5GU6HpFm2gzM/frrrz8cPnx4XaaDEREREREREZGWoYRJ9hoBnN/MNf4C/K7hg+nTp7dt06bNMOAw13W7A04z14+b67rbgEU5OTl/GzRo0Hvpel7JWl2Ap5u5xhbgtBaIpaX9CBjdzDVmAGGAr776qs26desmAFc5jtPGdd1mLi3SehQVFS2aNWvWdYMHD34+avhPQLtmLn0uUNXMNRLRAZjWzDVqgVPswRkzZvRwHOcAx3G6NHP9RG12HOeLwYMHz03z80p2GgMc0cw17gD+2QKxiIiIiIhIMyhhkr32Ak5s5hpfNLwze/bsH0Qikamu6/Zt5ppJcRyTm4lEImNmzpz5Qm1t7QWHHXbY+kzEIlmhDc3//tnUEoGkQE+a/29zAd56663ctWvXvuA4zgnND0ukVernuu6fZs6c+eshQ4Y8Wj92PNCxmesWNHN+ovJo/vd9bfQHs2fP7h+JRO4HTiJDJWBd12XmzJmzI5HINUOHDp2eiRgkawym+d9DU1siEBERERERaR4lTORt4Mkk534KMGvWrH0jkchrNP8G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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8001,6 +8006,10 @@ $$</p>
|
||||
<div class="alert alert-block alert-success">
|
||||
<b>Question:</b> How many scalars are communicated from and to a worker? Assume that matrices A, B, and C are N by N matrices.
|
||||
</div>
|
||||
<pre><code>a) 3N
|
||||
b) 2N + 2
|
||||
c) 2N + 1
|
||||
d) N² + 1</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8012,7 +8021,8 @@ $$</p>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="c"># TODO multiple choice</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, c, or d </span>
|
||||
<span class="n">alg_1_comm_overhead_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8028,6 +8038,9 @@ $$</p>
|
||||
<div class="alert alert-block alert-success">
|
||||
<b>Question:</b> How many operations are done in a worker?
|
||||
</div>
|
||||
<pre><code>a) O(N)
|
||||
b) O(N²)
|
||||
c) O(N³)</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8039,7 +8052,8 @@ $$</p>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="c"># TODO multiple choice</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, or c</span>
|
||||
<span class="n">alg_1_comp_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8081,7 +8095,7 @@ $$</p>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_intro_q_2.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8122,7 +8136,7 @@ d) row A[i,:] and the whole matrix B</code></pre>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, c, or d </span>
|
||||
<span class="n">alg_2_deps_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
@@ -8153,7 +8167,7 @@ d) row A[i,:] and the whole matrix B</code></pre>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_machines_2.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz51sJBAwAQIEEpIgLoggi6i4W7faShUrda9W6g7ihgnEEEIgca0IrqVWpe6/urZatWqVShVZBBSVJQkBAgQIkJCFLDO/Py6RnFmSmSyTYL7v14vXK3PuPWdOhiyT+9zneSwOWLFixWF1dXV3ApcARwIhiIiIiIiIiIiIiIiI/LzUAT8Cfw8JCXlkxIgRewAsgKVLlx4LvAcMaL/9iYiIiIiIiIiIiIiIBNVm4ILRo0evtlatWhVTXV29Ekho712JiIiIiIiIiIiIiIgE2abw8PDhjurq6ikoWCIiIiIiIiIiIiIiIp1TQnV19RQH8Nv23omIiIiIiIiIiIiIiEg7+q0DGNTeuxAREREREREREREREWlHgxxARHvvQkREREREREREREREpB1FONp7ByIiIiIiIiIiIiIiIu1NARMREREREREREREREen0FDAREREREREREREREZFOTwETERERERERERERERHp9EIDPP8r4D9tsA8REREREREREREREZHWdAZwgr8nBxQwsSzrs1GjRqUGuiMREREREREREREREZFgWrZs2f0ul8vvgIlKcomIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiI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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8305,7 +8319,7 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, c, or d </span>
|
||||
<span class="n">alg_2_complex_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
@@ -8342,7 +8356,7 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_intro_q_3.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8368,6 +8382,10 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="alert alert-block alert-success">
|
||||
<b>Question:</b> Which are the data dependencies of the computations done by the worker in charge of computing the range of rows C[rows,:] ?
|
||||
</div>
|
||||
<pre><code>a) A[rows,:] and B[:,rows]
|
||||
b) the whole matrix A and B[:,rows]
|
||||
c) A[rows,:] and the whole matrix B
|
||||
d) the whole matrices A and B</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8379,7 +8397,8 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="c"># TODO multiple choice and checker</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, c, or d </span>
|
||||
<span class="n">alg_3_deps_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8409,7 +8428,7 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:fig_matmul_machines_3.png" width="450"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15XFTl/gfwzxlg2AQEZBEEAfd9t7K03bablZW3PbtZWS6plbLJJgoulabpzWtdy9tmv2y7t26Wbd4sTXBLMxdAEBBQEJBtYOb8/jii88zGDDADOp/368XrBd9znmcehm043/N8vxLO27NnT1etVjsPwL0A+gFwARERERERERERERER0eVFC+BPAB+7uLi8MmLEiLMAIAHA7t27hwD4EkCPjlsfERERERERERERERGRQ50EcPvo0aMPSPv37/fXaDT7AER09KqIiIiIiIiIiIiIiIgcrECtVg9TaTSaOWCyhIiIiIiIiIiIiIiInFOERqOZowJwX0evhIiIiIiIiIiIiIiIqAPdpwLQq6NXQURERERERERERERE1IF6qQC4d/QqiIiIiIiIiIiIiIiIOpC7qqNXQERERERERERERERE1NGYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpudp4/k4AP9hhHURERERERERERERERO3pOgBXWHuyTQkTSZJ+HDVqVKytKyIiIiIiIiIiIiIiInKkrKyspbIsW50wYUkuIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfn2tELICKiy9/u3bv9ZFkep1KpQgG4dfR6iNqoFsCx48eP/zZlyhRtRy+GiIiIiIiIiNoHEybO6wEAj7Vxjk8A/KP5gx07dni6u7tPBnClLMvBAKQ2zk/UkWoBHNfpdFvGjh170OCYP4B32zh/HYB72ziHPYwHENfGOXYBSAGAo0ePuldWVi4BMEOSJHdZlts4NVHnERMTk5+VlTV31KhRW/TC/wfAq41TPwKgvI1z2KILgM1tnKMJwCTD4K5du0IlSRosSZJ/G+cn6jCSJNVptdpcE68HmsUDuKaND/MygG1tnIOIiIiIiNqICRPn1RvAbW2c48/md7Kzs6/S6XQfyrIc0cY5iToVlUqV8ttvv62TJGnu6NGjG8+H3dH2n5+aNo63l+5o++cmA8D333/vevbs2U8lSbq17csi6pQiZVn+v927dz89evToDedjEwH4tHFejzaOt5Ub2v5z36T/QXZ2dk+dTrcGwO1gCVi6xMmyDJVKhd27d/8py/K8MWPGfGlwyii0/WfowzaOJyIiIiKidsCECf0IYGMrxx4EgKysrAE6ne5rtP0CEVFnpJIk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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8436,6 +8455,10 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="alert alert-block alert-success">
|
||||
<b>Question:</b> Which is the complexity of the communication and computations done by a worker in algorithm 3?
|
||||
</div>
|
||||
<pre><code>a) O(N²) communication and O(N³) computation
|
||||
b) O(N²) communication and O(N³/P) computation
|
||||
c) O(N²) communication and O(N²) computation
|
||||
d) O(N²/P) communication and O(N³/P) computation</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8447,7 +8470,8 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="c"># TODO multiple choice and checker function</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"x"</span><span class="w"> </span><span class="c"># replace x with a, b, c, or d </span>
|
||||
<span class="n">alg_3_complex_check</span><span class="p">(</span><span class="n">answer</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8545,8 +8569,7 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
|
||||
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
|
||||
<div class="cm-editor cm-s-jupyter">
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="c"># TODO move solution to a separate notebook and remove part of the implementation here</span>
|
||||
<span class="k">function</span><span class="w"> </span><span class="n">matmul_dist_3!</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||||
<div class="highlight hl-julia"><pre><span></span><span class="k">function</span><span class="w"> </span><span class="n">matmul_dist_3!</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||||
<span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size</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="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
|
||||
<span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
|
||||
@@ -8555,17 +8578,7 @@ d) O(N) communication and O(N) computation</code></pre>
|
||||
<span class="w"> </span><span class="nd">@assert</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">l</span>
|
||||
<span class="w"> </span><span class="nd">@assert</span><span class="w"> </span><span class="n">mod</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">nworkers</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span>
|
||||
<span class="w"> </span><span class="c"># Implement here</span>
|
||||
<span class="w"> </span><span class="n">nrows_w</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">div</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">nworkers</span><span class="p">())</span>
|
||||
<span class="w"> </span><span class="nd">@sync</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">w</span><span class="p">)</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">enumerate</span><span class="p">(</span><span class="n">workers</span><span class="p">())</span>
|
||||
<span class="w"> </span><span class="n">rows_w</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="o">:</span><span class="n">nrows_w</span><span class="p">)</span><span class="w"> </span><span class="o">.+</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">nrows_w</span>
|
||||
<span class="w"> </span><span class="n">Aw</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">A</span><span class="p">[</span><span class="n">rows_w</span><span class="p">,</span><span class="o">:</span><span class="p">]</span>
|
||||
<span class="w"> </span><span class="n">ftr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nd">@spawnat</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">begin</span>
|
||||
<span class="w"> </span><span class="n">Cw</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">similar</span><span class="p">(</span><span class="n">Aw</span><span class="p">,</span><span class="n">nrows_w</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||||
<span class="w"> </span><span class="n">matmul_seq!</span><span class="p">(</span><span class="n">Cw</span><span class="p">,</span><span class="n">Aw</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||||
<span class="w"> </span><span class="n">Cw</span>
|
||||
<span class="w"> </span><span class="k">end</span>
|
||||
<span class="w"> </span><span class="nd">@async</span><span class="w"> </span><span class="n">C</span><span class="p">[</span><span class="n">rows_w</span><span class="p">,</span><span class="o">:</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fetch</span><span class="p">(</span><span class="n">ftr</span><span class="p">)</span>
|
||||
<span class="w"> </span><span class="k">end</span>
|
||||
<span class="w"> </span>
|
||||
<span class="w"> </span><span class="n">C</span>
|
||||
<span class="k">end</span>
|
||||
</pre></div>
|
||||
|
||||
@@ -7538,7 +7538,7 @@ a.anchor-link {
|
||||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||||
<div>
|
||||
<img align="left" alt="No description has been provided for this image" src="attachment:logo.png" width="200"/>
|
||||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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 truncated
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,2 +0,0 @@
|
||||
[deps]
|
||||
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,739 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f64b009a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021\" width=\"350\">\n",
|
||||
"\n",
|
||||
"### Programming large-scale parallel systems\n",
|
||||
"### Lectures on Julia for HPC\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Asynchronous programming in Julia\n",
|
||||
"\n",
|
||||
"by Francesc Verdugo (VU Amsterdam)\n",
|
||||
"\n",
|
||||
"Version fall 2022"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bf68ad38",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
"\n",
|
||||
"In this notebook, we will learn the basics of asynchronous programming in Julia. In particular, we will learn about:\n",
|
||||
"\n",
|
||||
"- Tasks\n",
|
||||
"- Channels\n",
|
||||
"\n",
|
||||
"Understanding these concepts is important to learn later distributed computing."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "caf64254",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Tasks\n",
|
||||
"\n",
|
||||
"### Creating a task\n",
|
||||
"\n",
|
||||
"A task is a piece of computation work that can be run asynchronously (i.e., that can be run in the background). To create a task, we first need to create a function that represents the work to be done in the task. In next cell, we generate a task that generates and sums two matrices."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fe668cb1",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function work()\n",
|
||||
" println(\"Starting work\")\n",
|
||||
" sleep(7)\n",
|
||||
" a = rand(3,3)\n",
|
||||
" b = rand(3,3)\n",
|
||||
" r = a + b\n",
|
||||
" println(\"Finishing work\")\n",
|
||||
" r\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "67ee0328",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"t = Task(work)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e459c5c2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Scheduling a task\n",
|
||||
"\n",
|
||||
"The task has been created, but the corresponding work has not started. Note that we do not see any output from function `work` yet. To run the task we need to schedule it."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8778c199",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"schedule(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f1fb9283",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Fetching the task result\n",
|
||||
"\n",
|
||||
"The task has been executed, but we do not see the result. To get the result we need to fetch it."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0c7b626e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"fetch(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fedbbd71",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Tasks run asynchronously\n",
|
||||
"\n",
|
||||
"It is important to note that tasks run asynchronously. To illustrate this let's create and schedule a new task."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4ccc996c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"t = Task(work)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "015bea27",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"schedule(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5ec0718e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Note that while the task is running we can execute Julia code. To check this, execute the next two cells while the task is running."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a70fcbe8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"sin(4π)*exp(-0.1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6def444b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"1 + 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d483d4d0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"How is this possible? Tasks run in the brackground and this particular task is sleeping for most of the time. Thus, it is possible to use the current Julia process for other operations while the tasks is sleeping."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "910323fd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Tasks do not run in parallel\n",
|
||||
"\n",
|
||||
"It is also important to note that tasks do not run in parallel. We were able to run code while previous tasks was running because the task was idling most of the time. If the task does actual work, the current process will be busy running this task and it is likely that we cannot run other code at the same time. Let's illustrate this with an example. The following code computes an approximation of $\\pi$ using [Leibniz formula](https://en.wikipedia.org/wiki/Leibniz_formula_for_pi). The quality of the approximation increases with the value of `n`."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b53ac640",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function compute_π(n)\n",
|
||||
" s = 1.0\n",
|
||||
" for i in 1:n\n",
|
||||
" s += (isodd(i) ? -1 : 1) / (i*2+1)\n",
|
||||
" end\n",
|
||||
" 4*s\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7614df94",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" Call this function with a large number. Note that it will take some time."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "63f2aec3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"compute_π(4_000_000_000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "840ff590",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Create a task that performs this computation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f16ade6c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"fun = () -> compute_π(4_000_000_000)\n",
|
||||
"t = Task(fun)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "60c2567c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Schedule the tasks and then try to execute the 2nd cell bellow. Note that the current process will be busy running the task."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "1f28a388",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"schedule(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "52e060e7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"1+1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "25048665",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Tasks take a function with no arguments\n",
|
||||
"\n",
|
||||
"This function needs to have zero arguments, but it can capture variables if needed. If we try to create a task with a function that has arguments, it will result in an error when we schedule it."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "87397749",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"add(a,b) = a + b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e99766c7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"t = Task(add)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "1a785bae",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"schedule(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ebfce725",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"If we need, we can capture variables in the function to be run by the task as shown in the next cells."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "06f54fa0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a = rand(3,3)\n",
|
||||
"b = rand(3,3);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4c9e586e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"fun = () -> a + b\n",
|
||||
"t = Task(fun)\n",
|
||||
"schedule(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "cd829a64",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Useful macro: `@async`\n",
|
||||
"\n",
|
||||
"So far, we have created tasks using low-level functions, but there are more convenient ways of creating and scheduling tasks. For instance using the `@async` macro. This macro is used to run a piece of code asynchronously. Under the hood it puts the code in an anonymous function, creates a task, and schedules it. For instance, the next cell is equivalent to previous one."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9b5152d1",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@async a + b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ac3262d8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Another useful macro: `@sync`\n",
|
||||
"\n",
|
||||
"This macro is used to wait for all the tasks created with `@async` in a given block of code. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ef2e49f9",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@sync begin\n",
|
||||
" @async sleep(3)\n",
|
||||
" @async sleep(4)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "98f0d685",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Channels\n",
|
||||
"\n",
|
||||
"### Sending data between tasks\n",
|
||||
"\n",
|
||||
"Julia provides channels as a way to send data between tasks. A channel is like a FIFO queue in which tasks can put and take values from. In next example, we create a channel and a task that puts five values into the channel. Finally, the task closes the channel."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b88d5308",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"chnl = Channel{Int}()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3421c7a6",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@async begin\n",
|
||||
" for i in 1:5\n",
|
||||
" put!(chnl,i)\n",
|
||||
" end\n",
|
||||
" close(chnl)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1df0508c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"By executing next cell several times, we will get the values from the channel. We are indeed communicating values from two different tasks. If we execute the cell more than 5 times, it will raise an error since the channel is closed. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "64b9436e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"take!(chnl)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "757a1b07",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Channels are iterable\n",
|
||||
"\n",
|
||||
"Instead of taking values from a channel until an error occurs, we can also iterate over the channel in a for loop until the channel is closed."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2fc22dfa",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"chnl = Channel{Int}()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fa62a4df",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@async begin\n",
|
||||
" for i in 1:5\n",
|
||||
" put!(chnl,i)\n",
|
||||
" end\n",
|
||||
" close(chnl)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e511e19b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"for i in chnl\n",
|
||||
" @show i\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b1a2a557",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Calls to `put!` and `take!` are blocking\n",
|
||||
"\n",
|
||||
"Note that `put!` and `take!` are blocking operations. Calling `put!` blocks the tasks until another task calls `take!` and viceversa. Thus, we need at least 2 tasks for this to work. If we call `put!` and `take!` from the same task, it will result in a dead lock. We have added a print statement to previous example. Run it again and note how `put!` blocks until we call `take!`. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f34373ca",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"chnl = Channel{Int}()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "bfde2ecd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@async begin\n",
|
||||
" for i in 1:5\n",
|
||||
" put!(chnl,i)\n",
|
||||
" println(\"I have put $i\")\n",
|
||||
" end\n",
|
||||
" close(chnl)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5830659d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"take!(chnl)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "006140bd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Buffered channels\n",
|
||||
"\n",
|
||||
"We can be a bit more flexible and use a buffered channel. In this case, `put!` will block only if the channel is full and `take!` will block if the channel is empty. We repeat previous example, but with a buffered channel of size 2. Note that we can call `put!` until the channel is full. At this point, we need to wait to until we call `take!` which removes an item from the channel, making room for a new item."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "dfe06b5f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"buffer_size = 2\n",
|
||||
"chnl = Channel{Int}(buffer_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6289bc2e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@async begin\n",
|
||||
" for i in 1:5\n",
|
||||
" put!(chnl,i)\n",
|
||||
" println(\"I have put $i\")\n",
|
||||
" end\n",
|
||||
" close(chnl)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2a87cd5f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"take!(chnl)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "2a23b1c3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questions\n",
|
||||
"\n",
|
||||
"How long the next cells will take each?\n",
|
||||
"\n",
|
||||
"### Q1 (Asynchronous.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "dd45ae08",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time compute_π(100_000_000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "18d6cfe3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time for i in 1:10\n",
|
||||
" compute_π(100_000_000)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5f19d38c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Q2 (Asynchronous.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "dac0c92a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time for i in 1:10\n",
|
||||
" @async compute_π(100_000_000)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5041c355",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Q3 (Asynchronous.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "c06dc4a5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time @sync for i in 1:10\n",
|
||||
" @async compute_π(100_000_000)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "841b690e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Q4 (Asynchronous.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6ac116bb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"buffer_size = 4\n",
|
||||
"chnl = Channel{Int}(buffer_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "25363a90",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time begin\n",
|
||||
" put!(chnl,3)\n",
|
||||
" i = take!(chnl)\n",
|
||||
" sleep(i)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "df663f11",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Q5 (Asynchronous.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9abeed40",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"chnl = Channel{Int}()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8e8428ce",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time begin\n",
|
||||
" put!(chnl,3)\n",
|
||||
" i = take!(chnl)\n",
|
||||
" sleep(i)\n",
|
||||
"end"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.8.5",
|
||||
"language": "julia",
|
||||
"name": "julia-1.8"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,692 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "acfe5cc9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"<div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ae2a0512",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Seminars Computational Science\n",
|
||||
"### Julia tutorial\n",
|
||||
"\n",
|
||||
"# Why is Julia fast?\n",
|
||||
"\n",
|
||||
"by Francesc Verdugo (VU Amsterdam)\n",
|
||||
"\n",
|
||||
"2022-11-24"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e040636a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
"\n",
|
||||
"We will learn\n",
|
||||
"\n",
|
||||
"- Basic julia concepts:\n",
|
||||
" - type-inference\n",
|
||||
" - JIT compilation\n",
|
||||
"- Some Julia syntax\n",
|
||||
"- Some useful Julia packages"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bc1d9ce2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Using Jupyter notebooks in Julia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ff199820",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Running a cell\n",
|
||||
"\n",
|
||||
"Click on a cell and press `Shift` + `Enter`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a8e4fba2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"1+3\n",
|
||||
"4*5"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0e035ee9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Cell order is important"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "187db91d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"foo() = \"Well done!\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a29023dc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"foo()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0b788d3b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Package and help modes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "23e1803d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"] add BenchmarkTools DataFrames PyCall Conda Test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4353e6ec",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"? print"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "44c03fde",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## How fast is Julia code?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6c088d9e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Example\n",
|
||||
"\n",
|
||||
"Sum entries of a given array $a = [a_1,a_2,...,a_n]$\n",
|
||||
"\n",
|
||||
" $$s = \\sum_{i=1}^n a_i$$\n",
|
||||
"\n",
|
||||
"### "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "34e3c7dd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Hand-written sum function\n",
|
||||
"\n",
|
||||
"### Exercise\n",
|
||||
"Write a function that computes the sum of all elements in array `a`. You can view the solution at the bottom of the notebook."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a672edac",
|
||||
"metadata": {
|
||||
"code_folding": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ✍️ Exercise 1\n",
|
||||
"function sum_hand(a)\n",
|
||||
" # TODO\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0494a1b3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Test-driven development\n",
|
||||
"Next, you can test your solution. You can use the Julia macro `@test` which is provided in the `Test` package."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ebac7b9e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "aa5505d4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a = rand(5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fc11923c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@test sum_hand(a) ≈ sum(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e23f3ddf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Benchmarking\n",
|
||||
"In order to track the performance of your code, it is useful to time the execution of single functions. In Julia, the most conventional way of measuring the computation time is the macro `@time`. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "caff0307",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a = rand(10^7);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6d073236",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@time sum_hand(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c664522e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Note that `@time` also measures the compile time of a function if it's the first call to that function. So make sure to run `@time` twice on a freshly compiled function in order to get a more meaningful result. \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Now in order to benchmark our code, we need to run it several times. To do this we can call our code in a for-loop and gather the runtimes using the Julia macro `@elapsed`. This measures the runtime of an expression in seconds, just as the `@time` macro, only `@elapsed` discards the result of the computation and returns the elapsed time instead. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "bba864c1",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@elapsed sum_hand(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "70317d33",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BenchmarkTools\n",
|
||||
"\n",
|
||||
"The `BenchmarkTools` extension package provides useful macros for sampling runtimes automatically. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "424ffe03",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using BenchmarkTools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "079ef7d0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"First of all, the `@benchmark` macro runs the code multiple times and gives out a lot of details: the minimum and maximum time, mean time, median time, number of samples taken, memory allocations, etc. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b5bb9a12",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bch_sum_hand = @benchmark sum_hand($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c77d454b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"For quick sanity checks, one can use the `@btime` macro, which is a convenience wrapper around `@benchmark`. It returns only the minimum execution time and memory allocations. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fee5493d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@btime sum_hand($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "3a1a774c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Similar to the `@elapsed` macro, `BenchmarkTool`'s `@belapsed` discards the return value of the function and instead returns the minimum runtime in seconds. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8e0cdb8c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@belapsed sum_hand($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fb530b87",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"As opposed to `@time` and `@elapsed`, `@btime` and `@belapsed` run the code several times and return the minimum runtime, thus eliminating possible compilation times from the measurement. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "782be14f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Built-in sum function"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "07df4939",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bch_sum = @benchmark sum($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "18972fa7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Hand-written sum in Python\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "038702c0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using PyCall"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8e1dcbfa",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"py\"\"\"\n",
|
||||
"def sum_py_hand(A):\n",
|
||||
" s = 0.0\n",
|
||||
" for a in A:\n",
|
||||
" s += a\n",
|
||||
" return s\n",
|
||||
"\"\"\"\n",
|
||||
"sum_py_hand = py\"sum_py_hand\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "60ca4517",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@test sum(a) ≈ sum_py_hand(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2f009076",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bch_sum_py_hand = @benchmark sum_py_hand($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "22d29afa",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Numpy sum "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0f7ffb8e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Conda"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e667fc80",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"numpy = pyimport(\"numpy\")\n",
|
||||
"sum_numpy = numpy[\"sum\"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ee0361df",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@test sum_numpy(a) ≈ sum(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d2f4e9ea",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bch_sum_numpy = @benchmark sum_numpy($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d7c3cbd6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Sumary of the results\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5ce4c97a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"timings = [bch_sum_hand,bch_sum,bch_sum_py_hand,bch_sum_numpy]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9d5caabd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"methods = [\"sum_hand\",\"sum\",\"sum_py_hand\",\"sum_numpy\"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8b7a3661",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using DataFrames"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "82b11610",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"df = DataFrame(method=methods,time=timings)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f03c4281",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Improving the hand-written sum in Julia\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "7696719c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ✍️ Exercise 3\n",
|
||||
"function sum_hand_fast(a)\n",
|
||||
" s = 0.0\n",
|
||||
" @simd for ai in a\n",
|
||||
" s += ai\n",
|
||||
" end\n",
|
||||
" s\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0b461036",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@test sum_hand_fast(a) ≈ sum(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fc228cba",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@benchmark sum_hand_fast($a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "328f9128",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conlcusions so far\n",
|
||||
"\n",
|
||||
"- Julia code (for loops) are much faster than in Python\n",
|
||||
"- Julia code can be as fast as optimized C code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f9ce5464",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Why Julia is fast?\n",
|
||||
"\n",
|
||||
"- Julia is a compiled language (like C, C++, Fortran)\n",
|
||||
"- Julia is JIT compiled (C, C++, Fortran are AOT compiled)\n",
|
||||
"- Type declarations are optional in Julia\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "aa5254e4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Conclusion: Why we use Julia in this course\n",
|
||||
"\n",
|
||||
"- Julia code is fast (it can be as fast as C)\n",
|
||||
"- Julia is a high-level language with simpler syntax than C \n",
|
||||
"- Julia supports different parallel programming models\n",
|
||||
"\n",
|
||||
"We will look into the third point in a later section of this course. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d4efafe2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Solution to the exercises\n",
|
||||
"\n",
|
||||
"### Solution to Exercise 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "17f73c0f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function sum_hand(a)\n",
|
||||
" s = 0.0\n",
|
||||
" for ai in a\n",
|
||||
" s += ai\n",
|
||||
" end\n",
|
||||
" s\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d12d6400",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Solution to Exercise 2"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e39094da",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Statistics\n",
|
||||
"\n",
|
||||
"a = rand(10^7)\n",
|
||||
"num_it = 15\n",
|
||||
"runtimes = zeros(num_it)\n",
|
||||
"for i in 1:num_it\n",
|
||||
" runtimes[i] = @elapsed sum_hand(a)\n",
|
||||
"end\n",
|
||||
"@show mean(runtimes) \n",
|
||||
"@show std(runtimes)\n",
|
||||
"@show minimum(runtimes)\n",
|
||||
"@show maximum(runtimes);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "7943f1cc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ✍️ Exercise 3\n",
|
||||
"function sum_hand_fast(a)\n",
|
||||
" s = 0.0\n",
|
||||
" @simd for ai in a\n",
|
||||
" s += ai\n",
|
||||
" end\n",
|
||||
" s\n",
|
||||
"end"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.8.5",
|
||||
"language": "julia",
|
||||
"name": "julia-1.8"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -0,0 +1,684 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "2133c064",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021\" width=\"350\">\n",
|
||||
"\n",
|
||||
"### Programming large-scale parallel systems\n",
|
||||
"### Lectures on Julia for HPC\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Distributed Jacobi (SOR) method\n",
|
||||
"\n",
|
||||
"by Francesc Verdugo (VU Amsterdam)\n",
|
||||
"\n",
|
||||
"Version fall 2022"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "a7b64d5a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
"\n",
|
||||
"- How to parallelize the Jacobi method in Julia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8bfa86d6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Mathematical background\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### 1D Laplace equation\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Find a function $u(x)$ such that\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"$u''(x) = 0 $ for $x\\in(0,L)$\n",
|
||||
"\n",
|
||||
"$u(0) = -1$\n",
|
||||
"\n",
|
||||
"$u(L) = 1$\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "de45f04c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Analytical solution\n",
|
||||
"\n",
|
||||
"$u(x) = (x-L)/L$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_00.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "bba2fb43",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "392dd6e1",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### A 3D Laplace equation in a complex domain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_plap.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "e7d815e0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f1450f45",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### The jacobi method"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_08.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "e794b036",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "bb20b40a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"jacobi (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function jacobi(n,nsteps)\n",
|
||||
" u = zeros(n+2)\n",
|
||||
" u_new = zeros(n+2)\n",
|
||||
" u[1] = -1\n",
|
||||
" u[end] = 1\n",
|
||||
" for istep in 1:nsteps\n",
|
||||
" for i in 2:(n+1)\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" u[2:end-1] = u_new[2:end-1]\n",
|
||||
" end\n",
|
||||
" u\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "9d251dba",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"7-element Vector{Float64}:\n",
|
||||
" -1.0\n",
|
||||
" -0.6666666666666666\n",
|
||||
" -0.3333333333333333\n",
|
||||
" 0.0\n",
|
||||
" 0.3333333333333333\n",
|
||||
" 0.6666666666666666\n",
|
||||
" 1.0"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"jacobi(5,1000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "dda71761",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Parallelization strategy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7c5a0d60",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Data partition and dependencies\n",
|
||||
"\n",
|
||||
"`u_new[i] = 0.5*(u[i-1]+u[i+1])`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_07.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "52626d50",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA6gAAADyCAYAAABAvOgkAAAACXBIWXMAAB7CAAAewgFu0HU+AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAGbJJREFUeJzt3X2YXXVhJ/DvTBISQgKIEAgghIggr8KiBaXYarG+1drFrVsfFVdLgZSK1XVd2+5afJRHfWrVRRGTVpfFvtiX3e3aqgUeLSpWfImmRhARYxAFSUI0kkBCyNz945xhzlzuzNyEmTm/mfl8nuc+93funLnnm+HO5X7n/M45A6tXr+4EAAAAWjbYdgAAAABIFFQAAAAKMb9r+fkDAwMb2wgCAADA3NLpdFYkuX54eVRBHRgY2HjxxRffMd2hAAAAmHvWrFmTTmfktEim+AIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARZjfdgAAYEY4LMnSJFuS/LzlLADMUvagAgD9+GyS7ye5Zhq3OZDkqUkuSPKbSc6fxm0POynJ1+vb01rYPmV4UZJ3J7m87SAw29mDCgD0Y7DrfipdkuSlSc5J8oTG42uTPH0att90SJKz6vGh07xtyvHvk1yU5K4kV03D9g5N9fo/J8mZSfarH39hkkemYfvQGgUVAOjHTUnuTfK1adjWq5OcW487SXYlWTQN2+1lV2O8s6UMzC1vS/L2Mb5m9iOznoIKAPTj96ZxW19NVYhvSfLlJB9I8qpp3H7T11NNNWZu+0CSG1Idgz3Vltb3P031+l+Q5HnTsF0ogoIKAJTmTW0HgC631rfp8PEkH0tye6oZBJdFQWUOUVABgLG8JcnLux67IckftpBlul2ZZF7XY3+e5M4WstCOQ5Ic1/XYw0nW7+XzPDHJ9UkeSnJeH+t/ay+fH2YVBRUAGMuhSVbW48VJFib5XntxptWbM3JimmE3RkGdS16Y5C+6HrsryYq9fJ4FqU60tWMSMsGs50BrAGAsb0m1F+mQVFMO55IXpppW+bwke1rOQjtuTfKe+vaplrPAnGEPKgDAY32uMe60loI2ratvSXJhkhe3mAXmDHtQAQAAKII9qADAZHtykv/Qx3o/SPK3U5wFptMzkpzZ9diB9f38JBf3+J4vpDpjLxAFFQCYfCcleXcf690QBZXZ5deT/LcxvrYwyeoej/9OFFR4lIIKAEy2O1OdWGYic+WMwMwdtyb5u67HFiV5SZJHkvzfHt+zYapDwUyioAIAk+32JG9tOwS04BP1remIJPcm2ZXHXlcY6OIkSQBAPx6u7w8cd63Z6ZH6vvu6qMwdw2dy9tkZpphfMgCgHz+s70/J3Pv8sKW+P7bVFLTp5/X9YUkG2gwCs91c+x8MALBvPp1qL9KxSf57qhO+TJUjkpzVuD2xfnxx1+PHTGGGpi/W9xcnOWCatklZvlXfL0ryvDaDwGznGFQAoB+3J/lQktcnuSLJHyXZXn/tnUneN4nbel2SK3s8flKSrzeWP5zksknc7ljem+qyOWcmuS3J2oxM+70oI3vXmL1+kOSzSX4lyV8l+ZOMnNzo3iQ3T+K2TkzypsbyKY3x1UmG6vHdqX73YFZRUAGAfv1+qg/qr01y9BRu56fp78ymWyZeZVJ8I1VB/UiqvbbNPbfTUZApw+tSldTjM/oySv+U8QvqpiSHZOQ41okcmd7XS02qP4gM+2YUVGYhBRUA6NdQkvfXt6l0TX0rySeTfCrJyUmWZeQ4xG2tJWK6/TDJ6UkuSLU3f/hz9ETXMB1K9UeXfn0//Z0F+769eE6YMRRUAID+7Emyvu0QtOqhJH85xdv4Yfq7jjDMSk6SBAAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAizG87APRyzTXXHDU4OPjytnOM59prrz1vaGhoMEk2bNiwfvPmzVvbztTltCSH1OO7k2xoMUsvRyd5cj3enmRti1n6cU2SnW2HoC8vT3JU2yHGcWySFfV4W5J17UXp6cAkZzaWv5hkqKUsYzkvI39kX5+ktPffpm8k+XzbIejLsUkuaDvEOAaSPLuxvC7Ve0hJnpbk4Hp8V5KN7UV5rBUrVhx7+OGHr0iSgw8+eNsFF1xQ2vvvKPfee+8Hr7jiikfazjHdFFSKNG/evOM7nc772s4xnq985SsZGnr0M9tL28wyS7yy7QATuC4K6kxxeZJz2w6xFy5sO8AESn9/Kz3fB6KgzhQnJSn6s0eX0l/7xdm4cWM2btyYJFm5cmVS+Pvv8uXLVyeZcwXVFF8AAACKYA8qM8W32g7Qw+nDg4ULF/5k165dm9oM08PJGfkdfyjJ91rM0suKVFMJk6STappeSRYlOaHtEDxu99W3kjw5yQH1eE+SW1vM0ssTM2qK9JINKW6K7/bjR8aLtibzC5vi+9CRyZ7Fbafg8VpyZ9sJugwk25/cWL4nyZa2wozhlCTz6vGOJN9vMctjLFy4cOWuXbuWJEmn0xlK8u2WI3VbnOT4Cdea5RRUZoqnX3LJJbvbDtE0ODjYGR6fc845H/785z//jjbz9LA5yaH1+NYkz2gxSy//mOTX6vHOVMetlOTMVMeOMbN9JMkVbYfoclOSX6rHO1Lea/+yJB8aWbz5ouRpO1pL09PAV0bGZ/+f5KY/ay9LL8ven2x+VtspeDwGhpIHCjv05DuLkpOb08Xfk+SqttKM4WdJDqrH30x1vHgxTj311M+tXbv2OUmye/fuHZdccklR779r1qx5VqfT+VLbOdpmii8AAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoI6e7wlyY317bI+1v+HxvrPmMJcAAAAfZnfdgAmzSlJzq/H3+lj/V9OclA9/tOpCAQAALA37EEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCArq3DW/7QAAAABNCursMdQY7zfBuguSLJ7CLAAAAHtNQZ09djTGyydY94QkA1OYBQAAYK8pqLPHfY3xMROs+6KpDAIAALAvFNTZ49uN8elJjh9jvQOTvGHq4wAAAOwdBXX2+FySXfV4MMm1SQ7uWmd5kk8mOTLJnmlLBgAA0Adncp09tiX5eJKL6uVzk9yZ5IYkP0vypCTPTXVypKuTvDDJyumPuW8GBgaesXr16qJK9apVqx4db968+egkZ7eXpqfm7/cBKS/fExrjwZSX74S2AzApjkp5r62ljfG8lJdvxejFD56UHPBQK0n6suWw5A2ntJ1itIeXtJ2AyVDa62pn90kwj0157x/zGuMlKSzfAw888Oj778DAwLzVq1cXla/T6ZzcdoYSKKizyx8kOS/JifXyE5O8omudf07yliSnZQYV1E6n86W2M4zntttuuzjJxW3nGMdJSW5pO8Q4FqbsfMxcF2XkD3clOiDFv/Y/enXbCcZ360urG0ymzmBy1cfaTjGBN9W3Up2Rwt7f7rjjjkfHCxYsWJzC8lFRUGeXLakK6ruS/FaqDz7D7khyTZIPppree2OSh+uv3T+NGQEAAHpSUGefzan2FvxekuNSXRP1nvrxpnfWNwAAgCIoqLPXziTfaTvEvrrnnnu+uHLlyqKP4XnZy162+JFHHhlIkvXr1++88847izpGNtW02eHf8d0Z2WNeivmpMibVXv2dLWbpx46JV6EQ52f0cVClWZDqj4dJma/9wST7N5ZLfO0vzsj1vHem7BP/7W47AH27MdVxkyVrzo57KMlQW0HGsCgj778Pp7DX/xlnnLHguOOO2y9Jli5dumf//fcv7f13lAsvvPDBtjO0QUGlSFdcccVQyvxQ1CQflKnoDxwzxANtB5iA9zemwp6U/9qS73FYt25d1q1b9+jydddd12IaxuIyMwAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAI89sOAADQomclOS/JT5L8r5azAMx5CioAMJe9KsmqJPdEQQVonSm+AAAAFMEeVABgLvufSdYl2dp2EAAUVABgbvtafQOgAAoqADDXHJDk8K7H9iS5q4UsADQoqADAXPPiJH/T9dg9SY5qIQsADQoqADDX3J3k7+rxMUnObjELAA0KKgAw13y5viXJK5L8VYtZAGhwmRkAAACKoKACAABQBAUVAACAIiioAAAAFEFBBQAAoAgKKgAwl3Xq+4FWUwCQREEFAOa27fX9E+NzEUDrvBEDAHPZbfX9fkme3WYQABRUAGBu25Dk5nr8F0lel+T8+nZmW6EA5qr5bQcAAGjZbyf5lyRHJflo4/Hrk7yglUQAc5SCCgDMdXckOTXJa5KclmRp/fi/tZYIYI5SUAEAkp8m+UDbIQDmOsegAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUIT5bQeAXtasWXNGp9P5cNs5xnPllVeeMjQ0NJAkW7duvevBBx98oO1MXVYkWVKPtyT5SXtReLine truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d5e089f4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### \"Ghost\" entries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_09.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "1dc26426",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "acbbd646",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Remote channels"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_06.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "08dab820",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "034fa536",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Implementation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "a98e7ef1",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Disclaimer\n",
|
||||
"\n",
|
||||
"The most natural way of implementing a distributed Jacobi method is to use a library that provides distributed arrays:\n",
|
||||
"\n",
|
||||
"- [DistributedArrays.jl](https://github.com/JuliaParallel/DistributedArrays.jl)\n",
|
||||
"- [PartitionedArrays.jl](https://github.com/fverdugo/PartitionedArrays.jl)\n",
|
||||
"\n",
|
||||
"We will use low-level Julia functions as an academic exercise.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5a2437ae",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Adding some procs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d95ff334",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Distributed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2d64e580",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"addprocs(3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9cd52702",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Helper functions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4aad98a4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function initialize_vectors(n)\n",
|
||||
" @assert mod(n,nworkers()) == 0\n",
|
||||
" local_n = div(n,nworkers())\n",
|
||||
" u = zeros(local_n+2)\n",
|
||||
" u_new = zeros(local_n+2)\n",
|
||||
" u[1] = -1.0\n",
|
||||
" u[end] = 1.0\n",
|
||||
" u,u_new\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3fceebbd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function compute_error(u,n)\n",
|
||||
" local_n = length(u)-2\n",
|
||||
" u_exact = copy(u)\n",
|
||||
" p = myid() - 1\n",
|
||||
" for local_i in 0:(local_n+1)\n",
|
||||
" global_i = local_i + (p-1)*local_n + 1\n",
|
||||
" Δ = 1/(n+1)\n",
|
||||
" u_exact[local_i+1] = 2*(Δ*global_i-Δ)-1\n",
|
||||
" end\n",
|
||||
" maximum(abs.(u[2:end-1].-u_exact[2:end-1]))\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fd06d27f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Distributed Jacobi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "56d3bd49",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function jacobi_dist(n,nsteps)\n",
|
||||
" nw = nworkers()\n",
|
||||
" ftrs_prev_snd = Vector{Future}(undef,nw)\n",
|
||||
" ftrs_next_snd = Vector{Future}(undef,nw)\n",
|
||||
" fun = ()->Channel{Float64}(1)\n",
|
||||
" for w in workers()\n",
|
||||
" p = w-1\n",
|
||||
" ftrs_prev_snd[p] = @spawnat w RemoteChannel(fun,myid())\n",
|
||||
" ftrs_next_snd[p] = @spawnat w RemoteChannel(fun,myid())\n",
|
||||
" end\n",
|
||||
" ftrs = Vector{Future}(undef,nw)\n",
|
||||
" @sync for w in workers()\n",
|
||||
" ftrs[w-1] = @spawnat w jacobi_worker(\n",
|
||||
" n,nsteps,ftrs_prev_snd,ftrs_next_snd)\n",
|
||||
" end\n",
|
||||
" reduce(max,fetch.(ftrs))\n",
|
||||
"end\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ab2c25f3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Exercise: complete the cell below"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "739ccfa5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function jacobi_worker(\n",
|
||||
" n,nsteps,ftrs_prev_snd,ftrs_next_snd)\n",
|
||||
" u, u_new = initialize_vectors(n)\n",
|
||||
" w = myid(); p = w-1\n",
|
||||
" # TODO: Setup channels\n",
|
||||
" #chn_prev_snd\n",
|
||||
" #chn_prev_rcv\n",
|
||||
" #chn_next_snd\n",
|
||||
" #chn_next_rcv\n",
|
||||
" for step in 1:nsteps \n",
|
||||
" # TODO: Communicate\n",
|
||||
" # Local computations\n",
|
||||
" for i in 2:(length(u)-1)\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" u[2:end-1] = u_new[2:end-1]\n",
|
||||
" end\n",
|
||||
" @show u\n",
|
||||
" err = compute_error(u,n)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "edbb2318",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Test-driven development"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b2301383",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"err = jacobi_dist(6,1000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "63ec8554",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Remember: remote channels"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_06.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "d4f59c15",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b2d8bdbc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Possible enhancements"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0af07603",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Is it possible to overlap computation and communication?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_jacobi_09.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "d401c647",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"<div>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "80e67eb9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2nd exercise:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f9aaa50c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function jacobi_worker(\n",
|
||||
" n,nsteps,ftrs_prev_snd,ftrs_next_snd)\n",
|
||||
" u, u_new = initialize_vectors(n)\n",
|
||||
" p = myid()-1\n",
|
||||
" chn_prev_snd = fetch(ftrs_prev_snd[p])\n",
|
||||
" chn_next_snd = fetch(ftrs_next_snd[p])\n",
|
||||
" if myid()!=2\n",
|
||||
" chn_prev_rcv = fetch(ftrs_next_snd[p-1])\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" chn_next_rcv = fetch(ftrs_prev_snd[p+1])\n",
|
||||
" end\n",
|
||||
" for step in 1:nsteps\n",
|
||||
" # TODO overlap communication and computation\n",
|
||||
" if myid() != 2\n",
|
||||
" put!(chn_prev_snd,u[2])\n",
|
||||
" u[1] = take!(chn_prev_rcv)\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" put!(chn_next_snd,u[end-1])\n",
|
||||
" u[end] = take!(chn_next_rcv)\n",
|
||||
" end\n",
|
||||
" for i in 2:(length(u)-1)\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" u[2:end-1] = u_new[2:end-1]\n",
|
||||
" end\n",
|
||||
" @show u\n",
|
||||
" err = compute_error(u,n)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d9f12348",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Solution of the exercises"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d7d067f8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 1st exercise"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0e2514b0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function jacobi_worker(\n",
|
||||
" n,nsteps,ftrs_prev_snd,ftrs_next_snd)\n",
|
||||
" u, u_new = initialize_vectors(n)\n",
|
||||
" p = myid()-1\n",
|
||||
" chn_prev_snd = fetch(ftrs_prev_snd[p])\n",
|
||||
" chn_next_snd = fetch(ftrs_next_snd[p])\n",
|
||||
" if myid()!=2\n",
|
||||
" chn_prev_rcv = fetch(ftrs_next_snd[p-1])\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" chn_next_rcv = fetch(ftrs_prev_snd[p+1])\n",
|
||||
" end\n",
|
||||
" for step in 1:nsteps \n",
|
||||
" if myid() != 2\n",
|
||||
" put!(chn_prev_snd,u[2])\n",
|
||||
" u[1] = take!(chn_prev_rcv)\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" put!(chn_next_snd,u[end-1])\n",
|
||||
" u[end] = take!(chn_next_rcv)\n",
|
||||
" end\n",
|
||||
" # Local computations\n",
|
||||
" for i in 2:(length(u)-1)\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" u[2:end-1] = u_new[2:end-1]\n",
|
||||
" end\n",
|
||||
" @show u\n",
|
||||
" err = compute_error(u,n)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "157e705d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2nd exercise"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b6f5a89f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function jacobi_worker(\n",
|
||||
" n,nsteps,ftrs_prev_snd,ftrs_next_snd)\n",
|
||||
" u, u_new = initialize_vectors(n)\n",
|
||||
" p = myid()-1\n",
|
||||
" chn_prev_snd = fetch(ftrs_prev_snd[p])\n",
|
||||
" chn_next_snd = fetch(ftrs_next_snd[p])\n",
|
||||
" if myid()!=2\n",
|
||||
" chn_prev_rcv = fetch(ftrs_next_snd[p-1])\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" chn_next_rcv = fetch(ftrs_prev_snd[p+1])\n",
|
||||
" end\n",
|
||||
" for step in 1:nsteps \n",
|
||||
" if myid() != 2\n",
|
||||
" put!(chn_prev_snd,u[2])\n",
|
||||
" t1 = @async u[1] = take!(chn_prev_rcv)\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" put!(chn_next_snd,u[end-1])\n",
|
||||
" t2 = @async u[end] = take!(chn_next_rcv)\n",
|
||||
" end\n",
|
||||
" # Local computations (interior)\n",
|
||||
" for i in 3:(length(u)-2)\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" # Wait for ghost values\n",
|
||||
" if myid() != 2\n",
|
||||
" wait(t1)\n",
|
||||
" end\n",
|
||||
" if myid() != nprocs()\n",
|
||||
" wait(t2)\n",
|
||||
" end\n",
|
||||
" # Update near boundary values\n",
|
||||
" for i in [2,length(u)-1]\n",
|
||||
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
|
||||
" end\n",
|
||||
" u[2:end-1] = u_new[2:end-1]\n",
|
||||
" end\n",
|
||||
" @show u\n",
|
||||
" err = compute_error(u,n)\n",
|
||||
"end"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.8.5",
|
||||
"language": "julia",
|
||||
"name": "julia-1.8"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -0,0 +1,505 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021\" width=\"350\">\n",
|
||||
"\n",
|
||||
"### Programming large-scale parallel systems\n",
|
||||
"### Lectures on Julia for HPC\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Tutorial: Getting started with Julia\n",
|
||||
"\n",
|
||||
"by Francesc Verdugo (VU Amsterdam)\n",
|
||||
"\n",
|
||||
"Version fall 2022"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
"\n",
|
||||
"- Using the Julia REPL\n",
|
||||
"- Running serial and parallel code\n",
|
||||
"- Installing and managing packages"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Introduction\n",
|
||||
"\n",
|
||||
"Julia has its own way of running code and using packages. Many educational sources about Julia assume that you have this basic knowledge, which can be confusing to new users. In this lesson, we will learn these basic skills so that you can start learning more on Julia."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Preliminaries\n",
|
||||
"\n",
|
||||
"This is a tutorial. To follow it:\n",
|
||||
"\n",
|
||||
"- Download and install Julia from https://julialang.org/\n",
|
||||
"- Download and install VSCode and its Julia extension. How to: https://www.julia-vscode.org/docs/dev/gettingstarted/\n",
|
||||
"- Continue reading this document \n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## The Julia REPL\n",
|
||||
"\n",
|
||||
"There are several ways of opening Julia depending on your operating system and your IDE, but it is usually as simple as launching the Julia app. With VSCode, open a folder (File > Open Folder). Then, press `Ctrl`+`Shift`+`P` to open the command bar, and execute `Julia: Start REPL`. If this does not work, make sure you have the Julia extension for VSCode installed. Independently of the method you use, opening Julia results in a window with some text ending with:\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"julia> \n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"You have just opened the Julia *read-evaluate-print loop*, or simply the Julia *REPL*. Congrats! You will spend most of time using the REPL, when working in Julia. The REPL is a console waiting for user input. Just as in other consoles, the string of text right before the input area (`julia>` in the case) is called the *command prompt* or simply the *prompt*.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"The usage is as follows:\n",
|
||||
"- You write some input\n",
|
||||
"- press enter\n",
|
||||
"- you get the output\n",
|
||||
"\n",
|
||||
"For instance, try this\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> 1 + 1\n",
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Hello world!\n",
|
||||
"\n",
|
||||
"A \"Hello world\" example looks like this in Julia\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> println(\"Hello, world!\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Try to run it in the REPL."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Help mode\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Curious about what function `println` does? Enter into *help* mode to look into the documentation. This is done by typing a question mark (`?`) into the inut field:\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> ?\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"After typing `?`, the command prompt changes to `help?>`. It means we are in help mode. Now, we can type a function name to see its documentation.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"help?> println\n",
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Package and shell modes\n",
|
||||
"\n",
|
||||
"The REPL comes with two more modes, namely *package* and *shell* modes. To enter package mode type\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> ]\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Package mode is used to install and manage packages. We are going to discuss the package mode in greater detail later. To return back to normal mode press the backspace key several times.\n",
|
||||
"\n",
|
||||
"To enter shell mode type semicolon (`;`)\n",
|
||||
"```julia\n",
|
||||
"julia> ;\n",
|
||||
"```\n",
|
||||
"The prompt should have changed to `shell>` indicating that we are in shell mode. Now you can type commands that you would normally do on your system command line. For instance, \n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"shell> ls\n",
|
||||
"```\n",
|
||||
"will display the contents of the current folder in Mac or Linux. Using shell mode in Windows is not straightforward, and thus not recommended for beginners.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Running more complex code\n",
|
||||
"\n",
|
||||
"Real-world Julia programs are not typed in the REPL in practice. They are written in one or more files and *included* in the REPL. To try this, create a new file called `hello.jl`, write the code of the \"Hello world\" example above, and save it. If you are using VSCode, you can create the file using File > New File > Julia File. Once the file is saved with the name `hello.jl`, execute it as follows\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> include(\"hello.jl\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-warning\">\n",
|
||||
"<b>Warning:</b> Make sure that the file <code>\"hello.jl\"</code> is located in the current working directory of your Julia session. You can query the current directory with function <code>pwd()</code>. You can change to another directory with function <code>cd()</code> if needed. Also, make sure that the file extension is <code>.jl</code>.\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"The recommended way of running Julia code is using the REPL as we did. But it is also possible to run code directly from the system command line. To this end, open a terminal and call Julia followed buy the path to the file containing the code you want to execute.\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"$ julia hello.jl\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Previous line assumes that you have Julia properly installed in the system and that is usable from the terminal. In UNIX systems (Linux and Mac), the Julia binary needs to be in one of the directories listed in the `PATH` environment variable. To check that Julia is properly installed, you can use\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"$ julia --version\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"If this runs without error and you see a version number, you are good to go!\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Tip:</b> In this tutorial, when a code snipped starts with <code>$</code>, it should be run in the terminal. Otherwise, the code is to be run in the Julia REPL.\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Tip:</b> Avoid calling Julia code from the terminal, use the Julia REPL instead! Each time you call Julia from the terminal, you start a fresh Julia session and Julia will need to compile your code from scratch. This can be time consuming for large projects. In contrast, if you execute code in the REPL, Julia will compile code incrementally, which is much faster. Running code in a cluster (like in DAS-5 for the Julia assignment) is among the few situations you need to run Julia code from the terminal.\n",
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Running parallel code\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Since we are in a parallel computing course, let's run a parallel \"hello world\" example in Julia. Open a Julia REPL and write \n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> using Distributed\n",
|
||||
"julia> @everywhere println(\"Hello, world! I am proc $(myid()) from $(nprocs())\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Here, we are using the `Distributed` package, which is part of the Julia standard library that provides distributed memory parallel support. The code prints the process id and the number of processes in the current Julia session.\n",
|
||||
"\n",
|
||||
"You will provably only see output from 1 proces. We need to add more processes to run the example in parallel. This is done with the `addprocs` function.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> addprocs(3)\n",
|
||||
"```\n",
|
||||
"We have added 3 new processes, plus the old one, we have 4 processes. Run the code again.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> @everywhere println(\"Hello, world! I am proc $(myid()) from $(nprocs())\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Now, you should see output from 4 processes.\n",
|
||||
"\n",
|
||||
"It is possible to specify the number of processes when starting Julia from the terminal with the `-p` argument (useful, e.g., when running in a cluster). If you launch Julia from the terminal as\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"$ julia -p 3\n",
|
||||
"```\n",
|
||||
"and then run \n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> @everywhere println(\"Hello, world! I am proc $(myid()) from $(nprocs())\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"You should get output from 4 processes as before.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Installing packages\n",
|
||||
"\n",
|
||||
"One of the most useful features of Julia is its package manager. It allows one to install Julia packages in a straightforward and platform independent way. To illustrate this, let us consider the following parallel \"Hello world\" example.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Copy the following block of code into a new file named `\"hello_mpi.jl\"`\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"# file hello_mpi.jl\n",
|
||||
"using MPI\n",
|
||||
"MPI.Init()\n",
|
||||
"comm = MPI.COMM_WORLD\n",
|
||||
"rank = MPI.Comm_rank(comm)\n",
|
||||
"nranks = MPI.Comm_size(comm)\n",
|
||||
"println(\"Hello world, I am rank $rank of $nranks\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"As you can see from this example, one can access MPI from Julia in a clean way, without type annotations and other complexities of C/C++ code.\n",
|
||||
"\n",
|
||||
"Now, run the file from the REPL\n",
|
||||
"```julia\n",
|
||||
"julia> incude(\"hello_mpi.jl\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"It provably didn't work, right? Read the error message and note that the MPI package needs to be installed to run this code.\n",
|
||||
"\n",
|
||||
"To install a package, we need to enter *package* mode. Remember that we entered into help mode by typing `?`. Package mode is activated by typing `]`\n",
|
||||
"```julia\n",
|
||||
"julia> ]\n",
|
||||
"```\n",
|
||||
"At this point, the promp should have changed to `(@v1.8) pkg>` indicating that we are in package mode. The text between parenthesis indicates which is the active *project*, i.e., where packages are going to be installed. In this case, we are working with the global project associated with our Julia installation (which is Julia 1.8 in this example, but it can be another version in your case).\n",
|
||||
"\n",
|
||||
"To install the MPI package, type\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> add MPI\n",
|
||||
"```\n",
|
||||
"Congrats, you have installed MPI!\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
" <b>Tip:</b> Many Julia package names end with <code>.jl</code>. This is just a way of signaling that a package is written in Julia. When using such packages, the <code>.jl</code> needs to be ommited. In this case, we have isntalled the <code>MPI.jl</code> package even though we have only typed <code>MPI</code> in the REPL.\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
" <b>Tip:</b>\n",
|
||||
"The package you have installed it is the Julia interface to MPI, called <code>MPI.jl</code>. Note that it is not a MPI library by itself. It is just a thin wrapper between MPI and Julia. To use this interface, you need an actual MPI library installed in your system such as OpenMPI or MPICH. Julia downloads and installs a MPI library for you, but it is also possible to use a MPI library already available in your system. This is useful, e.g., when running on HPC clusters. See the documentation of <code>MPI.jl</code> for further details.\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"To check that the package was installed properly, exit package mode by pressing the backspace key several times, and run it again\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> incude(\"hello_mpi.jl\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Now, it should work, but you provably get output from a single MPI rank only.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Running MPI code\n",
|
||||
"\n",
|
||||
"To run MPI applications in parallel, you need a launcher like `mpiexec`. MPI codes written in Julia are not an exception to this rule. From the system terminal, you can run\n",
|
||||
"```\n",
|
||||
"$ mpiexec -np 4 julia hello_mpi.jl\n",
|
||||
"```\n",
|
||||
"But it will provably don't work since the version of `mpiexec` needs to match with the MPI version we are using from Julia. You can find the path to the `mpiexec` binary you need to use with these commands\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> using MPI\n",
|
||||
"julia> MPI.mpiexec_path\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"and then try again\n",
|
||||
"```\n",
|
||||
"$ /path/to/my/mpiexec -np 4 julia hello_mpi.jl\n",
|
||||
"```\n",
|
||||
"with your particular path.\n",
|
||||
"\n",
|
||||
"However, this is not very convenient. Don't worry if you could not make it work! A more elegant way to run MPI code is from the Julia REPL directly, by using these commands:\n",
|
||||
"```julia\n",
|
||||
"julia> using MPI\n",
|
||||
"julia> mpiexec(cmd->run(`$cmd -np 4 julia hello_mpi.jl`))\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Now, you should see output from 4 ranks."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Installing packages locally\n",
|
||||
"\n",
|
||||
"We have installed the `MPI` package globally and it will be available in all Julia sessions. However, in some situations, we want to work with different versions of the same package or to install packages in an isolated way to avoid potential conflicts with other packages. This can be done by using local projects.\n",
|
||||
"\n",
|
||||
"A project is simply a folder in the hard disk. To use a particular folder as your project, you need to *activate* it. This is done by entering package mode and using the `activate` command followed by the path to the folder you want to activate.\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> activate .\n",
|
||||
"```\n",
|
||||
" Previous command will activate the current working directory. Note that the dot `.` is indeed the path to the current folder.\n",
|
||||
" \n",
|
||||
"The prompt has changed to `(lessons) pkg>` indicating that we are in the project within the `lessons` folder. The particular folder name can be different in your case.\n",
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
" <b>Tip:</b> You can activate a project directly when opening Julia from the terminal using the <code>--project</code> flag. The command <code>$ julia --project=.</code> will open Julia and activate a project in the current directory. You can also achieve the same effect by setting the environment variable <code>JULIA_PROJECT</code> with the path of the folder you want to activate.\n",
|
||||
" </div>\n",
|
||||
" \n",
|
||||
" \n",
|
||||
" <div class=\"alert alert-block alert-info\">\n",
|
||||
" <b>Tip:</b> The active project folder and the current working directory are two independent concepts! For instance, <code>(@v1.8) pkg> activate folderB</code> and then <code>julia> cd(\"folderA\")</code>, will activate the project in <code>folderB</code> and change the current working directory to <code>folderA</code>.\n",
|
||||
" \n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"At this point all package-related operations will be local to the new project. For instance, install the `DataFrames` package.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"(lessons) pkg> add DataFrames\n",
|
||||
"```\n",
|
||||
"Use the package to check that it is installed\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> using DataFrames\n",
|
||||
"julia> DataFrame(a=[1,2],b=[3,4])\n",
|
||||
"```\n",
|
||||
"Now, we can return to the global project to check that `DataFrames` has not been installed there. To return to the global environment, use `activate` without a folder name.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"(lessons) pkg> activate\n",
|
||||
"```\n",
|
||||
"The prompt is again `(@v1.8) pkg>`\n",
|
||||
"\n",
|
||||
"Now, try to use `DataFrames`.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> using DataFrames\n",
|
||||
"julia> DataFrame(a=[1,2],b=[3,4])\n",
|
||||
"```\n",
|
||||
"You should get an error or a warning unless you already had `DataFrames` installed globally.\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Project and Manifest files\n",
|
||||
"\n",
|
||||
"The information about a project is stored in two files `Project.toml` and `Manifest.toml`.\n",
|
||||
"\n",
|
||||
"- `Project.toml` contains the packages explicitly installed (the direct dependencies)\n",
|
||||
"\n",
|
||||
"- `Manifest.toml` contains direct and indirect dependencies along with the concrete version of each package.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"In other words, `Project.toml` contains the packages relevant for the user, whereas `Manifest.toml` is the detailed snapshot of all dependencies. The `Manifest.toml` can be used to reproduce the same envinonment in another machine.\n",
|
||||
"\n",
|
||||
"You can see the path to the current `Project.toml` file by using the `status` operator (or `st` in its short form) while in package mode\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> status\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"The information about the `Manifest.toml` can be inspected by passing the `-m` flag.\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> status -m\n",
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Installing packages from a project file\n",
|
||||
"\n",
|
||||
"Project files can be used to install lists of packages defined by others. E.g., to install all the dependencies of a Julia application.\n",
|
||||
"\n",
|
||||
"Assume that a colleague has sent to you a `Project.toml` file with this content:\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"[deps]\n",
|
||||
"BenchmarkTools = \"6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf\"\n",
|
||||
"DataFrames = \"a93c6f00-e57d-5684-b7b6-d8193f3e46c0\"\n",
|
||||
"MPI = \"da04e1cc-30fd-572f-bb4f-1f8673147195\"\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Copy the contents of previous code block into a file called `Project.toml` and place it in an empty folder named `newproject`. It is important that the file is named `Project.toml`. You can create a new folder from the REPL with \n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> mkdir(\"newproject\")\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"To install all the packages registered in this file you need to activate the folder containing your `Project.toml` file\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> activate newproject\n",
|
||||
"```\n",
|
||||
"and then *instantiating* it\n",
|
||||
"```julia\n",
|
||||
"(newproject) pkg> instantiate\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"The instantiate command will download and install all listed packages and their dependencies in just one click."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Getting help in package mode\n",
|
||||
"\n",
|
||||
"You can get help about a particular package operator by writing `help` in front of it\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> help activate\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"You can get an overview of all package commands by typing `help` alone\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> help\n",
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Package operations in Julia code\n",
|
||||
"\n",
|
||||
"In some situations it is required to use package commands in Julia code, e.g., to automatize installation and deployment of Julia applications. This can be done using the `Pkg` package. For instance\n",
|
||||
"\n",
|
||||
"```julia\n",
|
||||
"julia> using Pkg\n",
|
||||
"julia> Pkg.status()\n",
|
||||
"```\n",
|
||||
"is equivalent to call `status` in package mode.\n",
|
||||
"```julia\n",
|
||||
"(@v1.8) pkg> status\n",
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion\n",
|
||||
"\n",
|
||||
"We have learned the basics of how to work with Julia. Now, you should be ready to start learning more on the language. If you want to further dig into the topics we have covered here, you can take a look and the following links\n",
|
||||
"\n",
|
||||
"- Julia Manual https://docs.julialang.org/en/v1/manual/getting-started/\n",
|
||||
"- Package manager https://pkgdocs.julialang.org/v1/getting-started/\n",
|
||||
"\n",
|
||||
"If you want to interact with the Julia community on discourse, sign in at https://discourse.julialang.org/"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.8.5",
|
||||
"language": "julia",
|
||||
"name": "julia-1.8"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> Do not forget to execute the cells below before starting this notebook!\n",
|
||||
"<b>Note:</b> Do not forget to execute the cells below before starting this notebook! \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -41,7 +41,12 @@
|
||||
" end |> println\n",
|
||||
"end\n",
|
||||
"alg_1_deps_check(answer) = answer_checker(answer,\"b\")\n",
|
||||
"alg_2_deps_check(answer) = answer_checker(answer,\"d\")"
|
||||
"alg_1_comm_overhead_check(answer) = answer_checker(answer, \"c\")\n",
|
||||
"alg_1_comp_check(answer) = answer_checker(answer, \"a\")\n",
|
||||
"alg_2_complex_check(answer) = answer_checker(answer, \"b\")\n",
|
||||
"alg_2_deps_check(answer) = answer_checker(answer,\"d\")\n",
|
||||
"alg_3_deps_check(answer) = answer_checker(answer, \"c\")\n",
|
||||
"alg_3_complex_check(answer) = answer_checker(answer, \"d\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -77,17 +82,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_intro_0.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "88bc2633",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:fig_matmul_intro_0.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyIAAADBCAYAAAAzdQTvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7J15nFXFlce/1YBgXIJOlDgxZnHJxC2rmsmi0awak5lEbRDcMUFQiTug0n27AfcVFSQRUREENJNFo04yiRqzqEkmE1GTGJeMyxg0UVSIINA1f5z7mvvq1H193+v37r0N9f18/Hyk7rv16vV7davOqXN+xwCbAbvTP/4BLO1nH4HAQOVDwCb97ON/gNVNGMuGxHuAbfvZx1+AZf0fSiAw4BgOvK+ffbwK/LEJYykjQ4EP9rOPN4HfNWEsgcBAZA/gLf3s4xGAfQDbz/+CERLYmHmB/s+h9+Y+6vLzbfr/d/1m7qMOBMrBwfR//vw091Hnx3vp/9/nhdxHHQiUh6X0fw7tMzjR4VrgmQYH82yD9wUCGwJ/QU4FG+E9gGneUDZIXgaWN3hvo/cFAgOdlcBTDd67Of0/jRwoWODpBu99sZkDCQQGGM/S+InIDkCvDVI5EWl0IgYCgcZZQTgRSaNyInJO0QMJBDYyRrHxnIisKHoggcBGyNPEJyJtRY8kEAgEAoFAIBAIbHwM7vslTaKL/bHsXNVmeJ5OfthQfxGHAls7rQ8T8UBjA8xIF4dh2aqqrY3f08GDdfc1hyH8laOwDHKu/JSIJ/oxytpEbAIcBVQbooP4CVN5su7+ZjCCNfybah/GYibzaoOj7JuItwNf8VxZRMRrdffXzW708ImqNsNqLPOJ6GlskIEyY2EIMhfcOfgTQ/1zwUo4y797Li0xLQwTszACPHMQFhvqn4MWdgU+6TS/CdxkaN1csLAbOHNQRBxuMuI9q7e/fYF/cZpfMHB7g0PM+r6fBnZxmv/PwB0N9ncI8E9O81IDv2qkv0Ce2I8BezqNfwfznQb7Oxj4Z6fxcTD3NtZf5vf9MrCd0/gnMPc10JdBnrtDnQu/BPNIQ8PL9r5twJGe9/0FmEcb6G9L5PTQ5ftgWiiSYocD7Z4L3wPTQLig3RH4jNPYA9wIZk39/dVHfoZIG8+xju8DW/S2WXro4ot08uO6+opoBxY7rS8j6kWtxfJG/N7r4/p7WM40PszUOsPbXuA84Ayn9WHgpn6OsjYRbxKxAzC1qn0djxCxD1Ed+Q4RbaxhPvA558otTOZb/R5r7fdeRsRB6A3YZ4CRdfY1nB5uR3I2kkwMRsiGi4E1Ft4JdDqXHrWwt6kj98eKYT8f+LxzaZGhxXNBYtUPRBtBn8W/YKViRW3pDvRc+GYrjZCY/wVuQxsPI4CL6ukoNmruojqGuQf9/bSC54HvA1sm39vCgQZ+VE9HFg4FbnWaXyGP9S7QDJ5DDN+3VTfbMWAW1teV3R/4HtWOk5XAXv0ZYEZeBf6D6n3jKjG0zO/r7OtM4EKn7QngI/0YXwZMD9i3Alc6F54B+yEwL9fZ4SxgjNN2JxJW3ELMcrAfB452LowC+zkw67L3ZYchz1xXQa47DyMEXI94K5nKn4FvqPe33EykrPt0InZCf8kWOJao4WT77ETcAcx0WoezjsXxSUM2ujgQON1pXcEg2olY1c9RZiECfuK07Q5cUVcvhnPQRsjjbMq4hkeWHctQjkU2L0naidRvrRYGuB698bqDTq7uzwADA4Ju4L+ctt3Qi1VfTEFvcn3PvaYTnxYchwgnJDnMwgl1djcX31yAqxobXXaMxOu3A284l2ZYfVKSihVZ+iXoRMrI6Ode0zH+770NmG+1NzsVCzsC1+lmjjX6uRcoJeY5xPvvGvFzwNYhr2xHAAvQp7fjwfyhPyPMhvkZsm9IMgxYAnYL/fo07N7ANKdxNTASTP2RDHVjZiIGVZIdgBvjk5qM2BPQRshzwNFg6j69bYATgcectv2ByXX2cxXaCPkZsi7mQr45IhGLgHlO67bAApaoyaWZyVDkNGJL58rFRPygKWPMwnaciT4S3ws4L9P9EdtjuQmtljSOqfyp/wPMNIYehjAG+Ktz5etEHJGxj32xypO8ijbamcTrzRhmn0zhFdoYCbiW+5V0Z/QYdjER+KrT+izibcjjgRIokNjLfwRaivN4K8f4fWLhU+hFehXQbshnLhjxko9EQqiSXGEzes8tnAx8zWl+FjimkdCoRjAiCXma0zwYWGSVVzmVa5DwsiT3kvUZ3QSMrFVzneZtgYVWbyYVlt717q3OpUuNnLYEBgzmLuASp3FzZBM/rO/7bRtwMzo06now85sxwoycjz7R2wWYk+12uxXym3adtqeB+e/+Dq4OxqIFmg4GTsp2u90DuMxpXAscDuZv/R1cNsxKxGnjntp3gz0gWx+2HTjeaXwJGF3fqUr/KCJZfQLgHuN9mscyKOO8zGXAh53Wh3BDjFrNONYgcYHuMd5pdHnjtNcTMRi4Bb2gXktEnce0/eQcliEWvfuDm02kQiOqOY9tgIXoBfVkOtT321okP6fDaR1GD4uJlNFaTcRHseqIWL7fSH2/gQ0UQ+pcmGXh/bXutZKrdjM61PWbRgpV5obxPw+HAkusduBUYSWO3Q1/WguMMvD35o2ybwxci3h/k2wP3Gj7kLu2cDg6ZOFFYLTR32+rOQm93u1HtjXrYnSoykMEFbmByjnAL5w235zz0YGEWSZ5FHEc5IjpQZwz/+dcOBzsMbXvtZXIg3c7F24DM6s548uKWY7faXNpnNNTAxsbkGzqXJgK5ufNGmE2zKPoWlltwAKwb699r02LLhoL5vlmjTAL+RsiEnbUjvYSdhKpiZa871DEiEkiHsBI/ZhaT8QzGI6h2ktosMwjUhMtyTR0EuhStlQewHyI+Ck6VlMm2mVqolXuaeNN5gPvcK4sIVJhBPkQcSGoU7GdqRWbfwFvRbwzbuLaZCJ+2dTxBUqPgXsQj1+SzZFNvHcuxJviecjRfpIlOeSFpHEx2mPuW3R6sb3eWVzv7BRDYXPhBFAnxAcBp6bdYP3e2R7gCFNA8TlD6no31eqQ1l4sfBntnV2OGIX5r3eBJmDWIg5M12N+MthD0u+z+wHnOo2rEK91o/Wr+oF5Ud5bGfVXg3VPIZOcis5hewZyCeP2YH6NDmMaAtwc55GkMRudw/ZT6sxhax7mOiQ3McnbgXnxSZoHG4fUKefUBWBaKuThoxj53ojHgYlOqxw9ihJSNdN5F3pxkZjoSMVE50cntyMhAEm2AhYxhyHq9REHAGc5rXK8dpqKic6PXelA68XvwWtc6n29YRLwBaf1CeDrzR9cZiRPSBflHEkXY713rGI2un7HnURc3vzhBQYInfhzp9J+E2ehlduepMC5YNbPBZU7ZdPHNQdw49XvgpRnQA7UyBe5wMLH3dfb3nh13Hj1GYY6BVGaiIHHSc8XcUNtsGLU3kD1yY8FjjOh3tcAx8Q5BCrM8TqwnlpSdlv8kQcTwDzcihFmw9yHziGI87Ksp8Cd3Qvt5IkjS+pOEG8mVwDfddp8eVkx9uugQtfj03RTpKjNeMDNE/oiIgrg4wp0uO6DaNGWXCiujkjEDcCNTusIYGFVvsgchrCWRWip3iuI+F5Lx5iFrTkD+K3Tug8vOMlYM6gkmlX/zQ3jifhjK4fYJ+2sYzBHoT0144kYXdUS8TEsXc7rJNGsEcncZhLxMm0cgYSTrMdyNd18oKqtixOREI4kaYtEYCMhzhfx5U6Ns05iopVisL6ky3ZDsXMhzhcZhc6dmmmdxEQri9ho53XPAUfllReShhEVQXcxHYLki7hytteAM88l6dJ9XuWOgUWIcZFkBLAgmS8Sy0n71ruZRm+YAgMScyc6v2A4sBhsInfCVlT4XHGDxWDcXNsimI428HdDiVrY+LOpvJCzwBQsP20qIh+ugX8o2PHVTdYn5hOvF8ZdL3KmN1/EddpMB+tE4NjD0KdQcX5hPipZLsUWNNwsJev/MSb1/usFLgHcmL3fUL8yQGuYyGoGMRKt1X8WUewpFYnbBaBOe+bSqY7UiuFcnsekKHtMiz2l58enPTinPYZTicgz0SydDu7HeJQ9eljChbGnNGJPLBc7r5FEs0gZY4GNjES+iDsXrrXxqYElZS7A6YZyzAUDD6A9XMOQULMtACzsgT71WIvkU5RiLhgxMG5xmt8J3FDJF7ES732c85qXKCYvJI0JiGGVZH9Eba3CRcC/Oq/5LSTWxMCGwGR0yONHqQ6TPpuCVPiyYdJEPo4De1Ti3z4Vvh9SvyphizDLEaeNG/J4Odg4J9mmqfB1gWm5Cl82zCPosNU4J9nGOcl2R9JUZzGFqfAVa4icyUraUrL+Iw4g4mB0MpYkGRWRF5LGVJ7EqJAHiR2Xeh1d6GIxj6LD04qlE7+yx7o4X2Q184B3Oddvo5PZ+QwwIzZF2eMN5hCRnmgWkXOiWaCsGH/MbzJfZB466fJ2RFe+TFyALt63M/CtRF6IOxc6DNyfx+DqYBwS4pTkYOBk688Fs8BYI/U8SoERb+Vo9HrXZeEzFr6ETjx9HTGmVucxxkBe9OaLuCIQ3wT7VbD7op0Iq8hN4jYrqfkis8C+H+xE/Cp8eUncZsT4RCBi1Tq7JfJcd0VL7gVmtH5s9WDmkCLykcgLcfNfLgNTqApfsYYIQAePYtSGfBBS1M8ncft1Ip7KZWz10MmtoDbkWyNx1mc77XKMVk/hwPzwK3u8xkPowoFPMUxJvxWPFCBMUfbgV+hY+LspLNEsUGKmgjJO9wTvXHiaEoQyuZheFRS1IR+FzAU36fJHaPGKwoklkMegN+QXI95VN+nyolZXT28EIw4oNwm9jfT1bqzRBlhgg8A8i8zNasEbOUG4Ba3CdwqY3+U0uDow96I35JshghnuuroGMaZyVeHLyKVIvaQkOyH7oaOc9mWIVG9ZTluTjEdOzpIcBPwarTr7INUnsLine truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
@@ -117,17 +118,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_machines.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "5828e243",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:fig_matmul_machines.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
@@ -250,17 +247,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_intro_algs.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "6a706283",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:fig_matmul_intro_algs.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
@@ -285,17 +278,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_intro_q_1.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "acfb354b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:fig_matmul_intro_q_1.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -340,17 +329,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_machines_1.png": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz50shFUIguxLXFr3CkittW6tVm21FhVxX1t3qlg1QEgmIQLuOy51a1Er2Fq1Vau2WutPVASsWK0Lsu9o2Lcsc39/nATmnnsnmZlkZgLzfb9eeb2Sc+eceQhZJvc553kc6n300Ued6+rqRgGnAd8BchAREREREREREREREdm11AFfAH/Oycm585BDDlkL4ADMnDnzQOAVoE/m4hMREREREREREREREUmrJcBJQ4YM+cSZM2dOl+rq6o+BvpmOSkREREREREREREREJM0W5+fnHxyqrq6+FiVLREREREREREREREQkO/Wtrq6+NgScnulIREREREREREREREREMuj0ELBnpqMQERERERERERERERHJoD1DQJtMRyEiIiIiIiIiIiIiIpJBbUKZjkBERERERERERERERCTTlDAREREREREREREREZGsp4SJiIiIiIiIiIiIiIhkPSVMREREREREREREREQk6+Um+PgPgH+lIA4REREREREREREREZGWdDTw/XgfnFDCxHGctwcPHlycaEQiIiIiIiIiIiIiIiLpNGvWrFtc1407YaKSXCIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZLzfTAYiIyK5v5syZu7mue3goFOoB5GU6HpFm2gzM/frrrz8cPnx4XaaDEREREREREZGWoYRJ9hoBnN/MNf4C/K7hg+nTp7dt06bNMOAw13W7A04z14+b67rbgEU5OTl/GzRo0Hvpel7JWl2Ap5u5xhbgtBaIpaX9CBjdzDVmAGGAr776qs26desmAFc5jtPGdd1mLi3SehQVFS2aNWvWdYMHD34+avhPQLtmLn0uUNXMNRLRAZjWzDVqgVPswRkzZvRwHOcAx3G6NHP9RG12HOeLwYMHz03z80p2GgMc0cw17gD+2QKxiIiIiIhIMyhhkr32Ak5s5hpfNLwze/bsH0Qikamu6/Zt5ppJcRyTm4lEImNmzpz5Qm1t7QWHHXbY+kzEIlmhDc3//tnUEoGkQE+a/29zAd56663ctWvXvuA4zgnND0ukVernuu6fZs6c+eshQ4Y8Wj92PNCxmesWNHN+ovJo/vd9bfQHs2fP7h+JRO4HTiJDJWBd12XmzJmzI5HINUOHDp2eiRgkawym+d9DU1siEBERERERaR4lTORt4Mkk534KMGvWrH0jkchrNP8G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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "70087bce",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:fig_matmul_machines_1.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz50shFUIguxLXFr3CkittW6tVm21FhVxX1t3qlg1QEgmIQLuOy51a1Er2Fq1Vau2WutPVASsWK0Lsu9o2Lcsc39/nATmnnsnmZlkZgLzfb9eeb2Sc+eceQhZJvc553kc6n300Ued6+rqRgGnAd8BchAREREREREREREREdm11AFfAH/Oycm585BDDlkL4ADMnDnzQOAVoE/m4hMREREREREREREREUmrJcBJQ4YM+cSZM2dOl+rq6o+BvpmOSkREREREREREREREJM0W5+fnHxyqrq6+FiVLREREREREREREREQkO/Wtrq6+NgScnulIREREREREREREREREMuj0ELBnpqMQERERERERERERERHJoD1DQJtMRyEiIiIiIiIiIiIiIpJBbUKZjkBERERERERERERERCTTlDAREREREREREREREZGsp4SJiIiIiIiIiIiIiIhkPSVMREREREREREREREQk6+Um+PgPgH+lIA4REREREREREREREZGWdDTw/XgfnFDCxHGctwcPHlycaEQiIiIiIiIiIiIiIiLpNGvWrFtc1407YaKSXCIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZTwkTERERERERERERERHJekqYiIiIiIiIiIiIiIhI1lPCREREREREREREREREsp4SJiIiIiIiIiIiIiIikvWUMBERERERERERERERkaynhImIiIiIiIiIiIiIiGQ9JUxERERERERERERERCTrKWEiIiIiIiIiIiIiIiJZLzfTAYiIyK5v5syZu7mue3goFOoB5GU6HpFm2gzM/frrrz8cPnx4XaaDEREREREREZGWoYRJ9hoBnN/MNf4C/K7hg+nTp7dt06bNMOAw13W7A04z14+b67rbgEU5OTl/GzRo0Hvpel7JWl2Ap5u5xhbgtBaIpaX9CBjdzDVmAGGAr776qs26desmAFc5jtPGdd1mLi3SehQVFS2aNWvWdYMHD34+avhPQLtmLn0uUNXMNRLRAZjWzDVqgVPswRkzZvRwHOcAx3G6NHP9RG12HOeLwYMHz03z80p2GgMc0cw17gD+2QKxiIiIiIhIMyhhkr32Ak5s5hpfNLwze/bsH0Qikamu6/Zt5ppJcRyTm4lEImNmzpz5Qm1t7QWHHXbY+kzEIlmhDc3//tnUEoGkQE+a/29zAd56663ctWvXvuA4zgnND0ukVernuu6fZs6c+eshQ4Y8Wj92PNCxmesWNHN+ovJo/vd9bfQHs2fP7h+JRO4HTiJDJWBd12XmzJmzI5HINUOHDp2eiRgkawym+d9DU1siEBERERERaR4lTORt4Mkk534KMGvWrH0jkchrNP8G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 truncated
|
||||
"</div>\n",
|
||||
"\n"
|
||||
]
|
||||
@@ -497,7 +482,12 @@
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> How many scalars are communicated from and to a worker? Assume that matrices A, B, and C are N by N matrices.\n",
|
||||
"</div>\n"
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) 3N\n",
|
||||
" b) 2N + 2\n",
|
||||
" c) 2N + 1\n",
|
||||
" d) N² + 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -507,7 +497,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO multiple choice"
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"alg_1_comm_overhead_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -517,7 +508,11 @@
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> How many operations are done in a worker? \n",
|
||||
"</div>"
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) O(N)\n",
|
||||
" b) O(N²)\n",
|
||||
" c) O(N³)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -527,7 +522,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO multiple choice"
|
||||
"answer = \"x\" # replace x with a, b, or c\n",
|
||||
"alg_1_comp_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -560,17 +556,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_intro_q_2.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "62e5c637",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig_matmul_intro_q_2.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -604,7 +596,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"answer = \"x\" \n",
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"alg_2_deps_check(answer)"
|
||||
]
|
||||
},
|
||||
@@ -624,18 +616,14 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_machines_2.png": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz51sJBAwAQIEEpIgLoggi6i4W7faShUrda9W6g7ihgnEEEIgca0IrqVWpe6/urZatWqVShVZBBSVJQkBAgQIkJCFLDO/Py6RnFmSmSyTYL7v14vXK3PuPWdOhiyT+9zneSwOWLFixWF1dXV3ApcARwIhiIiIiIiIiIiIiIiI/LzUAT8Cfw8JCXlkxIgRewAsgKVLlx4LvAcMaL/9iYiIiIiIiIiIiIiIBNVm4ILRo0evtlatWhVTXV29Ekho712JiIiIiIiIiIiIiIgE2abw8PDhjurq6ikoWCIiIiIiIiIiIiIiIp1TQnV19RQH8Nv23omIiIiIiIiIiIiIiEg7+q0DGNTeuxAREREREREREREREWlHgxxARHvvQkREREREREREREREpB1FONp7ByIiIiIiIiIiIiIiIu1NARMREREREREREREREen0FDAREREREREREREREZFOTwETERERERERERERERHp9EIDPP8r4D9tsA8REREREREREREREZHWdAZwgr8nBxQwsSzrs1GjRqUGuiMREREREREREREREZFgWrZs2f0ul8vvgIlKcomIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIpxfa3hsQEZGfv6VLl/ZwuVxjHQ5HXyCsvfcj0kIVwPoNGzZ8PWHChLr23oyIiIiIiIiItA4FTDqvy4BrWrjGm8Cf6x8sXrw4MiIiYjxwosvligOsFq4v0p4qgA1Op/ONMWPGfOd2LAZ4sYXrVwKXtHCNtnAqkNbCNZYAmQDr1q2L2Lt37xzgVsuyIlwuVwuXFuk4UlJSCpctW3bHqFGj3mgw/H9AVAuXvgooaeEagegGvNbCNWqBce6DS5Ys6WtZ1lDLsmJauL5Iu7Esq7Kuri7fy/uBetOAU1r4NA8DH7dwDRERERERaSEFTDqvw4FftnCNH+s/WL58+UlOp/NVl8uV0MI1RToUh8OR+fXXXz9pWdYdo0ePrjkwHEHLv3/KWzi/rfSj5Z+bC+DTTz8N3bNnz1uWZZ3f8m2JdEiJLpfr/5YuXXrD6NGjFxwYOxeIbuG6XVo4P1BhtPz7vrbhg+XLlw90Op3zgQtQCVg5xLlcLhwOB0uXLv3R5XLdefzxx7/ndsooWv499GoL54uIiIiISCtQwEQ+A55r5tzvAJYtW3a00+n8gJZfIBLpiByWZd1qWVYocNOBsb3Adc1crzfwQKvsrG39COQ2c+4mgOjo6JsBBUvk584CHluyZMkHY8aM2YT9cyK8mWv9hfYPLkwEmlNmzFn/wVdffZXsdDoXA31bbVciHcORlmW9u3Tp0j+MHj36+Qbj84B3m7nmncCxLd+aiIi0sTHAmQ0eb6blVQdERKQDUsBE1tL8gAkALpfrIRQskZ85l8t1w7Jly/48atSoZdjltJ5r5lIpHBoBk2208GcDcEMr7EPkUBDpcDh+D2QDL7VgnQVNn9LmXgBqmjyrEaGhoX91uVwKlsjPlQN48ssvv/z4xBNP3Hxg7D8tWO93KGAiInIoOB3zhrL/ooCJiMjPUnvfxSiHuBUrVhwGnNfe+xAJAguY0N6bOFR899134cAx7b0PkWCxLOu49t5DR7BkyZJjXC7X6e29D5E2FhkaGvqH9t6EiIiIiIi0PmWYSIvU1NQkORyOEF/HZ62cxdJdS42xk+NOZurQqQE/16rdq8hYkYGLg02jI0IiePT4R4mPig94PX9VO6uZsmQKWyq2GONXplzJhKTAr5+/s+kd/rLuL8ZY7y69mXfCPCJDIlu018bsqNrBpK8mUVlXaYxPHzadMb3GBLzeY98/xsdbzd6kx8Ycy6zjZmFZVov22pjVu1dz34r7jK+DcEc4j455lP5R/QNay4mTqUunsq50nTH+qwG/4oYjPJMjXC7X4ObtuvOpq6vrih1k8qrfs8/S8+23jbHKQYPIe+ghXI7AYvnhRUUMnjIFa//+g4OWRUFWFvuGDQtorYC4XCTNmEG3lSuN4T1nnsnmKVMCXi562TIGZmUZY84uXVg/bx7VcXEt2mpjHFVVDJ48mbDt243xbdddx86LLgp4vd5//zt9XnjBGKvu25f18+bhDG9upaqmhW/bxuDJk82vA6Bg5kz2HRd4LCPhoYfosWiRMbZv5EgKZszwer7L5eoe8JP8DFmWNcrXsWXLosnKGmiMdeniZN689cTFVQf0PLW1FnfdNYiCArPdyyWX7OCaa7b7mNU63nijN88/38cY69u3msceW09EhNPHLO/27AnlttsGU1ZmvpW6665NnHba3hbvtTGPPJLAZ5/1MMZGjNhHZmZBwGutXRvJvfcOwtng0w8JcfHQQxtISalq4U59q6uzuPvuQeTlmV8HF1+8k2uv3Rbweh9/HMNjj5nvJXr0qGX+/HV0725WqnO5XKMD37GIiIiIiHR0yjCRFnE4HBGNHb/16FvZX7efLRVbfvr3WsFrvLfFvVdm40prSklfkc7mis3GWpcOvLRNgyVgX4y/7ejbKK4qNp77ke8eYfXu1QGtlbcvjwe+fcBYZ2vlVm444oY2DZaAHZS5bvB1xnNvqdhC+op0du7fGdBai7YvYuGGhcY6pTWl3HLULW0aLAE7KHN639ON587fl0/a8jRqnIFVkVmwdgH/2fYfY60QK4SrBl3la0qjX+/iv+1XXUVd165EbNny07/DPv+cfn/+c0DrWLW1pKSn0yUvz1hr76mntm2wBMCyKLrtNkLKy43n7vO3vxH7wQcBLRW6ezfJ6enGOhFbtlB85ZVtGiwBOyizedIkwrdvN5474YEHiFq7NqC1ItetY8AjjxjrhG/bRtEtt7RpsATsoEzxZZd5vIbJ06YRumdPQGvFfPQRca+8YqwTUlZG0Y03ttHuf1Z8Bo5GjSrjxBNL2bIl4qd/GzZEcu+9KdTWBva744kn4vniix7GWlFRTn73ux0t/gSactFFO4iPrzaee9myaB5+eEBA67hckJU1kB9+iDLWGjKkos2DJQATJxbhclnGc//jHz157bXeAa1TWelg2rQUNm2KMNa68MJdbRosATsoM2nSFnbtCjOe+4kn+rNkSWDVYrdsiWDWrIHGOkVFEVx//TaPYMkBPbwNioiIiIjIoU0BE2lTseGxZI/MxuH2pZazKof8ffl+reFyuchamUVRRZExflbfs7g06dJW22tjhvQYwqSjJxljta5api2fRmlNqV9rVNZVkroslao68+LBHwf/sVkZHs1xXvx5/HrAr42xkv0lTF8+HSf+3RW7vWo7md9kGhkeABnDM4iPbNvgVb1JR09iWIx5MXzNnjXM+2Ge32ssL1nOgrVmu4BwRzi5o3KJColqlX2Kb87wcPJyc6mLMl/rfn/5C92/+srvdfrPm0fXVauMsYqjj2bzpEk+ZrSu6rg4CmbOBLdAYeLs2XQpLPRvEaeT5IwMwnaYF3p3n3suO8eNa62tNqr82GMpusHMqnJUV5OSmkpIRYVfazgqKkhJTcXhluFRdOut7Bs+vNX22pgd48dT8stfGmPhxcUkZWTYV6f9ELFpEwOzs81By2JjZibVfdWWo6XuumsTRx5pfk2tXt2VZ57x//fH4sU9+NvfzP+LqCgnubl5AWd4NIfDAdnZ+fTsaQbp33ijN++/H+v3OgsX9uXzzw8zxgYM2E96+sZW2WdTunevIycnj7Aw83vj0UcT+OEH/38P5uQkemT6jB5dxu9/37aZPvVSUiq5555NxpjTCenpyezaFebXGrW1FunpyezbZ2b6XHnlLine truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "fb6b572b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig_matmul_machines_2.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFTV+cfxz51sJBAwAQIEEpIgLoggi6i4W7faShUrda9W6g7ihgnEEEIgca0IrqVWpe6/urZatWqVShVZBBSVJQkBAgQIkJCFLDO/Py6RnFmSmSyTYL7v14vXK3PuPWdOhiyT+9zneSwOWLFixWF1dXV3ApcARwIhiIiIiIiIiIiIiIiI/LzUAT8Cfw8JCXlkxIgRewAsgKVLlx4LvAcMaL/9iYiIiIiIiIiIiIiIBNVm4ILRo0evtlatWhVTXV29Ekho712JiIiIiIiIiIiIiIgE2abw8PDhjurq6ikoWCIiIiIiIiIiIiIiIp1TQnV19RQH8Nv23omIiIiIiIiIiIiIiEg7+q0DGNTeuxAREREREREREREREWlHgxxARHvvQkREREREREREREREpB1FONp7ByIiIiIiIiIiIiIiIu1NARMREREREREREREREen0FDAREREREREREREREZFOTwETERERERERERERERHp9EIDPP8r4D9tsA8REREREREREREREZHWdAZwgr8nBxQwsSzrs1GjRqUGuiMREREREREREREREZFgWrZs2f0ul8vvgIlKcomIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiIiIiIiIiIiIhIp6eAiYiIiIiIiIiIiIiIdHoKmIiIiIiIiIiIiIiISKengImIiIiIiIiIiIiIiHR6CpiIiIiIiIiIiIiIiEinp4CJiIiIiIiIiIiIiIh0egqYiIiI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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
@@ -764,7 +752,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"answer = \"x\"\n",
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"alg_2_complex_check(answer)"
|
||||
]
|
||||
},
|
||||
@@ -787,17 +775,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_intro_q_3.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "f1b8c712",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig_matmul_intro_q_3.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -816,7 +800,13 @@
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> Which are the data dependencies of the computations done by the worker in charge of computing the range of rows C[rows,:] ? \n",
|
||||
"</div>\n"
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" a) A[rows,:] and B[:,rows] \n",
|
||||
" b) the whole matrix A and B[:,rows]\n",
|
||||
" c) A[rows,:] and the whole matrix B\n",
|
||||
" d) the whole matrices A and B"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -826,7 +816,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO multiple choice and checker"
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"alg_3_deps_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -844,17 +835,13 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig_matmul_machines_3.png": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15XFTl/gfwzxlg2AQEZBEEAfd9t7K03bablZW3PbtZWS6plbLJJgoulabpzWtdy9tmv2y7t26Wbd4sTXBLMxdAEBBQEJBtYOb8/jii88zGDDADOp/368XrBd9znmcehm043/N8vxLO27NnT1etVjsPwL0A+gFwARERERERERERERER0eVFC+BPAB+7uLi8MmLEiLMAIAHA7t27hwD4EkCPjlsfERERERERERERERGRQ50EcPvo0aMPSPv37/fXaDT7AER09KqIiIiIiIiIiIiIiIgcrECtVg9TaTSaOWCyhIiIiIiIiIiIiIiInFOERqOZowJwX0evhIiIiIiIiIiIiIiIqAPdpwLQq6NXQURERERERERERERE1IF6qQC4d/QqiIiIiIiIiIiIiIiIOpC7qqNXQERERERERERERERE1NGYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpudp4/k4AP9hhHURERERERERERERERO3pOgBXWHuyTQkTSZJ+HDVqVKytKyIiIiIiIiIiIiIiInKkrKyspbIsW50wYUkuIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfn2tELICKiy9/u3bv9ZFkep1KpQgG4dfR6iNqoFsCx48eP/zZlyhRtRy+GiIiIiIiIiNoHEybO6wEAj7Vxjk8A/KP5gx07dni6u7tPBnClLMvBAKQ2zk/UkWoBHNfpdFvGjh170OCYP4B32zh/HYB72ziHPYwHENfGOXYBSAGAo0ePuldWVi4BMEOSJHdZlts4NVHnERMTk5+VlTV31KhRW/TC/wfAq41TPwKgvI1z2KILgM1tnKMJwCTD4K5du0IlSRosSZJ/G+cn6jCSJNVptdpcE68HmsUDuKaND/MygG1tnIOIiIiIiNqICRPn1RvAbW2c48/md7Kzs6/S6XQfyrIc0cY5iToVlUqV8ttvv62TJGnu6NGjG8+H3dH2n5+aNo63l+5o++cmA8D333/vevbs2U8lSbq17csi6pQiZVn+v927dz89evToDedjEwH4tHFejzaOt5Ub2v5z36T/QXZ2dk+dTrcGwO1gCVi6xMmyDJVKhd27d/8py/K8MWPGfGlwyii0/WfowzaOJyIiIiKidsCECf0IYGMrxx4EgKysrAE6ne5rtP0CEVFnpJIk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 truncated
|
||||
}
|
||||
},
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "c14ebcb3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig_matmul_machines_3.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkwAAAOBCAYAAACzvIyfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15XFTl/gfwzxlg2AQEZBEEAfd9t7K03bablZW3PbtZWS6plbLJJgoulabpzWtdy9tmv2y7t26Wbd4sTXBLMxdAEBBQEJBtYOb8/jii88zGDDADOp/368XrBd9znmcehm043/N8vxLO27NnT1etVjsPwL0A+gFwARERERERERERERER0eVFC+BPAB+7uLi8MmLEiLMAIAHA7t27hwD4EkCPjlsfERERERERERERERGRQ50EcPvo0aMPSPv37/fXaDT7AER09KqIiIiIiIiIiIiIiIgcrECtVg9TaTSaOWCyhIiIiIiIiIiIiIiInFOERqOZowJwX0evhIiIiIiIiIiIiIiIqAPdpwLQq6NXQURERERERERERERE1IF6qQC4d/QqiIiIiIiIiIiIiIiIOpC7qqNXQERERERERERERERE1NGYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpudp4/k4AP9hhHURERERERERERERERO3pOgBXWHuyTQkTSZJ+HDVqVKytKyIiIiIiIiIiIiIiInKkrKyspbIsW50wYUkuIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfHhAkRERERERERERERETk9JkyIiIiIiIiIiIiIiMjpMWFCREREREREREREREROjwkTIiIiIiIiIiIiIiJyekyYEBERERERERERERGR02PChIiIiIiIiIiIiIiInB4TJkRERERERERERERE5PSYMCEiIiIiIiIiIiIiIqfn2tELICKiy9/u3bv9ZFkep1KpQgG4dfR6iNqoFsCx48eP/zZlyhRtRy+GiIiIiIiIiNoHEybO6wEAj7Vxjk8A/KP5gx07dni6u7tPBnClLMvBAKQ2zk/UkWoBHNfpdFvGjh170OCYP4B32zh/HYB72ziHPYwHENfGOXYBSAGAo0ePuldWVi4BMEOSJHdZlts4NVHnERMTk5+VlTV31KhRW/TC/wfAq41TPwKgvI1z2KILgM1tnKMJwCTD4K5du0IlSRosSZJ/G+cn6jCSJNVptdpcE68HmsUDuKaND/MygG1tnIOIiIiIiNqICRPn1RvAbW2c48/md7Kzs6/S6XQfyrIc0cY5iToVlUqV8ttvv62TJGnu6NGjG8+H3dH2n5+aNo63l+5o++cmA8D333/vevbs2U8lSbq17csi6pQiZVn+v927dz89evToDedjEwH4tHFejzaOt5Ub2v5z36T/QXZ2dk+dTrcGwO1gCVi6xMmyDJVKhd27d/8py/K8MWPGfGlwyii0/WfowzaOJyIiIiKidsCECf0IYGMrxx4EgKysrAE6ne5rtP0CEVFnpJIk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 truncated
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -877,7 +864,12 @@
|
||||
"\n",
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> Which is the complexity of the communication and computations done by a worker in algorithm 3?\n",
|
||||
"</div>"
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) O(N²) communication and O(N³) computation\n",
|
||||
" b) O(N²) communication and O(N³/P) computation\n",
|
||||
" c) O(N²) communication and O(N²) computation\n",
|
||||
" d) O(N²/P) communication and O(N³/P) computation"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -887,7 +879,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO multiple choice and checker function"
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"alg_3_complex_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -946,7 +939,6 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO move solution to a separate notebook and remove part of the implementation here\n",
|
||||
"function matmul_dist_3!(C,A,B)\n",
|
||||
" m = size(C,1)\n",
|
||||
" n = size(C,2)\n",
|
||||
@@ -956,17 +948,7 @@
|
||||
" @assert size(B,1) == l\n",
|
||||
" @assert mod(m,nworkers()) == 0\n",
|
||||
" # Implement here\n",
|
||||
" nrows_w = div(m,nworkers())\n",
|
||||
" @sync for (i,w) in enumerate(workers())\n",
|
||||
" rows_w = (1:nrows_w) .+ (i-1)*nrows_w\n",
|
||||
" Aw = A[rows_w,:]\n",
|
||||
" ftr = @spawnat w begin\n",
|
||||
" Cw = similar(Aw,nrows_w,n)\n",
|
||||
" matmul_seq!(Cw,Aw,B)\n",
|
||||
" Cw\n",
|
||||
" end\n",
|
||||
" @async C[rows_w,:] = fetch(ftr)\n",
|
||||
" end\n",
|
||||
" \n",
|
||||
" C\n",
|
||||
"end"
|
||||
]
|
||||
@@ -1137,7 +1119,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -1145,7 +1127,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
"source": [
|
||||
"\n",
|
||||
" <div>\n",
|
||||
"<img src=\"attachment:logo.png\" align=\"left\" width=\"200\"/>\n",
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"</div>\n"
|
||||
]
|
||||
},
|
||||
@@ -85,7 +85,7 @@
|
||||
"Another attached picture with markdown syntax `![]()`: \n",
|
||||
"\n",
|
||||
"\n",
|
||||
""
|
||||
"\n",
|
||||
" m = size(C,1)\n",
|
||||
" n = size(C,2)\n",
|
||||
" l = size(A,2)\n",
|
||||
" @assert size(A,1) == m\n",
|
||||
" @assert size(B,2) == n\n",
|
||||
" @assert size(B,1) == l\n",
|
||||
" @assert mod(m,nworkers()) == 0\n",
|
||||
" # Implement here\n",
|
||||
" nrows_w = div(m,nworkers())\n",
|
||||
" @sync for (i,w) in enumerate(workers())\n",
|
||||
" rows_w = (1:nrows_w) .+ (i-1)*nrows_w\n",
|
||||
" Aw = A[rows_w,:]\n",
|
||||
" ftr = @spawnat w begin\n",
|
||||
" Cw = similar(Aw,nrows_w,n)\n",
|
||||
" matmul_seq!(Cw,Aw,B)\n",
|
||||
" Cw\n",
|
||||
" end\n",
|
||||
" @async C[rows_w,:] = fetch(ftr)\n",
|
||||
" end\n",
|
||||
" C\n",
|
||||
"end"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Search · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/search/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../notebook-hello/">Hello World</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Search</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Search</a></li></ul></nav><div class="docs-right"><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article><p id="documenter-search-info">Loading search...</p><ul id="documenter-search-results"></ul></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 31 July 2023 13:16">Monday 31 July 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><script src="../search_index.js"></script><script src="../assets/search.js"></script></html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Search · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/search/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox"/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li><a class="tocitem" href="../sol_matrix_matrix/">Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Search</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Search</a></li></ul></nav><div class="docs-right"><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article><p id="documenter-search-info">Loading search...</p><ul id="documenter-search-results"></ul></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. ULine truncated
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
var documenterSearchIndex = {"docs":
|
||||
[{"location":"matrix_matrix/","page":"Matrix Multiplication","title":"Matrix Multiplication","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/notebooks/notebook.ipynb\"","category":"page"},{"location":"matrix_matrix/","page":"Matrix Multiplication","title":"Matrix Multiplication","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/matrix_matrix.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebook.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n </div>","category":"page"},{"location":"matrix_matrix/","page":"Matrix Multiplication","title":"Matrix Multiplication","text":"<iframe id=\"notebook\" src=\"../notebook-output/matrix_matrix.html\" style=\"width:100%\"></iframe>\n<script>\n document.addEventListener('DOMContentLoaded', function(){\n var myIframe = document.getElementById(\"notebook\");\n iFrameResize({log:true}, myIframe);\t\n});\n</script>","category":"page"},{"location":"","page":"Home","title":"Home","text":"CurrentModule = XM_40017","category":"page"},{"location":"#XM_40017","page":"Home","title":"XM_40017","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome!","category":"page"},{"location":"notebook-hello/","page":"Hello World","title":"Hello World","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/notebook-hello.ipynb\"","category":"page"},{"location":"notebook-hello/","page":"Hello World","title":"Hello World","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/notebook-hello.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebook-hello.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n </div>","category":"page"},{"location":"notebook-hello/","page":"Hello World","title":"Hello World","text":"<iframe id=\"notebook\" src=\"../notebook-output/notebook-hello.html\" style=\"width:100%\"></iframe>\n<script>\n document.addEventListener('DOMContentLoaded', function(){\n var myIframe = document.getElementById(\"notebook\");\n iFrameResize({log:true}, myIframe);\t\n});\n</script>","category":"page"}]
|
||||
[{"location":"jacobi_2D/","page":"-","title":"-","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/jacobi_2D.ipynb\"","category":"page"},{"location":"jacobi_2D/","page":"-","title":"-","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/jacobi_2D.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/jacobi_2D.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n</div>","category":"page"},{"location":"jacobi_2D/","page":"-","title":"-","text":"<iframe id=\"notebook\" src=\"../notebook-output/jacobi_2D.html\" style=\"width:100%\"></iframe>\n<script>\n document.addEventListener('DOMContentLoaded', function(){\n var myIframe = document.getElementById(\"notebook\");\n iFrameResize({log:true}, myIframe);\t\n});\n</script>","category":"page"},{"location":"julia_async/","page":"Julia Asynchronous","title":"Julia Asynchronous","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_async.ipynb\"","category":"page"},{"location":"julia_async/","page":"Julia Asynchronous","title":"Julia Asynchronous","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/julia_async.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_async.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n</div>","category":"page"},{"location":"julia_async/","page":"Julia Asynchronous","title":"Julia Asynchronous","text":"<iframe id=\"notebook\" src=\"../notebook-output/julia_async.html\" style=\"width:100%\"></iframe>\n<script>\n document.addEventListener('DOMContentLoaded', function(){\n var myIframe = document.getElementById(\"notebook\");\n iFrameResize({log:true}, myIframe);\t\n});\n</script>","category":"page"},{"location":"julia_distributed_test/","page":"-","title":"-","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_distributed_test.ipynb\"","category":"page"},{"location":"julia_distributed_test/","page":"-","title":"-","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/julia_distributed_test.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_distributed_test.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n</div>","category":"page"},{"location":"julia_distributed_test/","page":"-","title":"-","text":"<iframe id=\"notebook\" src=\"../notebook-output/julia_distributed_test.html\" style=\"width:100%\"></iframe>\n<script>\n document.addEventListener('DOMContentLoaded', function(){\n var myIframe = document.getElementById(\"notebook\");\n iFrameResize({log:true}, myIframe);\t\n});\n</script>","category":"page"},{"location":"julia_distributed/","page":"Julia Distributed","title":"Julia Distributed","text":"EditURL = \"https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/julia_distributed.ipynb\"","category":"page"},{"location":"julia_distributed/","page":"Julia Distributed","title":"Julia Distributed","text":"<div class=\"admonition is-success\">\n <header class=\"admonition-header\">Tip</header>\n <div class=\"admonition-body\">\n <ul>\n <li>\n Download this notebook and run it locally on your machine [recommended]. Click <a href=\"notebooks/julia_distributed.ipynb\" download>here</a>.\n </li>\n <li>\n You can also run this notebook in the cloud using Binder. Click <a href=\"https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/julia_distributed.ipynb\">here</a>\n .\n </li>\n </ul>\n </div>\n</div>","category":"page"},{"location":"julia_distributed/","page":"Julia Distributed","title":"Julia Distributed","text":"<iframe id=\"notebook\" src=\"../noteLine truncated
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Solutions · XM_40017</title><script data-outdated-warner src="../assets/warner.js"></script><link rel="canonical" href="https://fverdugo.github.io/XM_40017/sol_matrix_matrix/"/><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/><script src="../assets/iframeResizer.min.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.png" alt="XM_40017 logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="../">XM_40017</a></span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Notebooks</span><ul><li><a class="tocitem" href="../julia_tutorial/">Julia Tutorial</a></li><li><a class="tocitem" href="../julia_intro/">Why is Julia fast?</a></li><li><a class="tocitem" href="../julia_basics/">Julia Basics</a></li><li><a class="tocitem" href="../julia_async/">Julia Asynchronous</a></li><li><a class="tocitem" href="../julia_distributed/">Julia Distributed</a></li><li><input class="collapse-toggle" id="menuitem-2-6" type="checkbox" checked/><label class="tocitem" for="menuitem-2-6"><span class="docs-label">Matrix Multiplication</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="../matrix_matrix/">Matrix Multiplication</a></li><li class="is-active"><a class="tocitem" href>Solutions</a></li></ul></li><li><a class="tocitem" href="../julia_jacobi/">Jacobi/SOR</a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Notebooks</a></li><li><a class="is-disabled">Matrix Multiplication</a></li><li class="is-active"><a href>Solutions</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Solutions</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/fverdugo/XM_40017/blob/main/docs/src/notebooks/sol_matrix_matrix.ipynb" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><div class="admonition is-success">
|
||||
<header class="admonition-header">Tip</header>
|
||||
<div class="admonition-body">
|
||||
<ul>
|
||||
<li>
|
||||
Download this notebook and run it locally on your machine [recommended]. Click <a href="notebooks/sol_matrix_matrix.ipynb" download>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
You can also run this notebook in the cloud using Binder. Click <a href="https://mybinder.org/v2/gh/fverdugo/XM_40017/gh-pages?filepath=dev/notebooks/sol_matrix_matrix.ipynb">here</a>
|
||||
.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><iframe id="notebook" src="../notebook-output/sol_matrix_matrix.html" style="width:100%"></iframe>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
var myIframe = document.getElementById("notebook");
|
||||
iFrameResize({log:true}, myIframe);
|
||||
});
|
||||
</script></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../matrix_matrix/">« Matrix Multiplication</a><a class="docs-footer-nextpage" href="../julia_jacobi/">Jacobi/SOR »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.25 on <span class="colophon-date" title="Monday 7 August 2023 16:13">Monday 7 August 2023</span>. Using Julia version 1.9.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|
||||
Reference in new issue
Block a user