diff --git a/docs/make.jl b/docs/make.jl index b08fabd..fe377fb 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -122,8 +122,8 @@ makedocs(; #"Distributed computing with MPI" => "mpi_tutorial.md", "Matrix-matrix multiplication"=>"matrix_matrix.md", "MPI (point-to-point)" => "julia_mpi.md", - "Jacobi method" => "jacobi_method.md", "MPI (collectives)" => "mpi_collectives.md", + "Jacobi method" => "jacobi_method.md", #"All pairs of shortest paths" => "asp.md", #"Gaussian elimination" => "LEQ.md", #"Traveling salesperson problem" => "tsp.md", diff --git a/notebooks/figures/fig_jacobi.svg b/notebooks/figures/fig_jacobi.svg index 8e33062..4313e8e 100644 --- a/notebooks/figures/fig_jacobi.svg +++ b/notebooks/figures/fig_jacobi.svg @@ -19,7 +19,44 @@ inkscape:export-xdpi="200" inkscape:export-ydpi="200" xml:space="preserve">? - \ No newline at end of file +-1 +1 +i-1 +i+1 +i +-1 +1 +-1 +1 +i-1 +i+1 +i +-1 +1 +"red" phase +"black" phase + \ No newline at end of file diff --git a/notebooks/jacobi_method.ipynb b/notebooks/jacobi_method.ipynb index 31d421f..51a610c 100644 --- a/notebooks/jacobi_method.ipynb +++ b/notebooks/jacobi_method.ipynb @@ -45,18 +45,10 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": null, "id": "1dc78750", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🥳 Well done! \n" - ] - } - ], + "outputs": [], "source": [ "using Printf\n", "\n", @@ -71,6 +63,7 @@ "jacobi_1_check(answer) = answer_checker(answer, \"d\")\n", "jacobi_2_check(answer) = answer_checker(answer, \"b\")\n", "jacobi_3_check(answer) = answer_checker(answer, \"c\")\n", + "lh_check(answer) = answer_checker(answer, \"c\")\n", "sndrcv_check(answer) = answer_checker(answer,\"b\")\n", "function sndrcv_fix_answer()\n", " msg = \"\"\"\n", @@ -89,6 +82,16 @@ " \"\"\"\n", " println(msg)\n", "end\n", + "gauss_seidel_2_check(answer) = answer_checker(answer,\"d\")\n", + "function gauss_seidel_2_why()\n", + " msg = \"\"\"\n", + " All \"red\" cells can be updated in parallel as they only depend on the values of \"black\" cells.\n", + " In order workds, we can update the \"red\" cells in any order whithout changing the result. They only\n", + " depend on values in the \"black\" cells, which will not change during the loop over \"red\" cells.\n", + " Similarly, all \"black\" cells can be updated in parallel as they only depend on \"red\" cells.\n", + " \"\"\"\n", + " println(msg)\n", + "end\n", "println(\"🥳 Well done! \")" ] }, @@ -200,7 +203,7 @@ "id": "22fda724", "metadata": {}, "source": [ - "In our version of the jacobi method, we return after a given number of iterations. Other stopping criteria are possible. For instance, iterate until the difference between u and u_new is below a tolerance:" + "In our version of the Jacobi method, we return after a given number of iterations. Other stopping criteria are possible. For instance, iterate until the maximum difference between u and u_new is below a tolerance:" ] }, { @@ -210,19 +213,20 @@ "metadata": {}, "outputs": [], "source": [ - "using LinearAlgebra: norm\n", "function jacobi_with_tol(n,tol)\n", " u = zeros(n+2)\n", " u[1] = -1\n", " u[end] = 1\n", " u_new = copy(u)\n", - " increment = similar(u)\n", " while true\n", + " diff = 0.0\n", " for i in 2:(n+1)\n", - " u_new[i] = 0.5*(u[i-1]+u[i+1])\n", + " ui_new = 0.5*(u[i-1]+u[i+1])\n", + " u_new[i] = ui_new\n", + " diff_i = abs(ui_new-u[i])\n", + " diff = max(diff_i,diff) \n", " end\n", - " increment .= u_new .- u\n", - " if norm(increment)/norm(u_new) < tol\n", + " if diff < tol\n", " return u_new\n", " end\n", " u, u_new = u_new, u\n", @@ -248,7 +252,17 @@ "id": "6e085701", "metadata": {}, "source": [ - "However, we are not going to parallelize this more complex in this notebook (we will consider it later in this course)." + "However, we are not going to parallelize this more complex in this notebook (left as an exercise)." + ] + }, + { + "cell_type": "markdown", + "id": "9df06442", + "metadata": {}, + "source": [ + "## Parallelization of the Jacobi method\n", + "\n", + "Now, let us parallelize the Jacobi method." ] }, { @@ -257,7 +271,7 @@ "metadata": {}, "source": [ "\n", - "## Where can we exploit parallelism?\n", + "### Where can we exploit parallelism?\n", "\n", "Look at the two nested loops in the sequential implementation:\n", "\n", @@ -275,101 +289,6 @@ "\n" ] }, - { - "cell_type": "markdown", - "id": "798968b1", - "metadata": {}, - "source": [ - "### The Gauss-Seidel method \n", - "\n", - "The usage of `u_new` seems a bit unnecessary at first sight, right?. If we remove it, we get another method called Gauss-Seidel.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0f77b547", - "metadata": {}, - "outputs": [], - "source": [ - "function gauss_seidel(n,niters)\n", - " u = zeros(n+2)\n", - " u[1] = -1\n", - " u[end] = 1\n", - " for t in 1:niters\n", - " for i in 2:(n+1)\n", - " u[i] = 0.5*(u[i-1]+u[i+1])\n", - " end\n", - " end\n", - " u\n", - "end" - ] - }, - { - "cell_type": "markdown", - "id": "0dbc5358", - "metadata": {}, - "source": [ - "Note that the final solution is nearly the same for a large enough number of iterations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca31518b", - "metadata": {}, - "outputs": [], - "source": [ - "gauss_seidel(5,1000)" - ] - }, - { - "cell_type": "markdown", - "id": "c92e9c73", - "metadata": {}, - "source": [ - "
\n", - "Question: Which of the two loops in the Gauss-Seidel method are trivially parallelizable?\n", - "
\n", - "\n", - "```julia\n", - "for t in 1:niters\n", - " for i in 2:(n+1)\n", - " u[i] = 0.5*(u[i-1]+u[i+1])\n", - " end\n", - "end\n", - "```\n", - "\n", - " a) Both of them\n", - " b) The outer, but not the inner\n", - " c) None of them\n", - " d) The inner, but not the outer\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4edad93f", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "answer = \"x\" # replace x with a, b, c or d\n", - "gauss_seidel_1_check(answer)" - ] - }, - { - "cell_type": "markdown", - "id": "9df06442", - "metadata": {}, - "source": [ - "## Parallelization of the Jacobi method\n", - "\n", - "Now, let us parallelize the Jacobi method." - ] - }, { "cell_type": "markdown", "id": "97a2d7d5", @@ -545,6 +464,628 @@ "" ] }, + { + "cell_type": "markdown", + "id": "75f735a2", + "metadata": {}, + "source": [ + "## Extension to 2D\n", + "\n", + "\n", + "The Jacobi method studied so far was for a one dimensional Laplace equation. In real-world applications however, one solve equations in multiple dimensions. Typically 2D and 3D. The 2D and 3D cases are conceptually equivalent, but we will discuss the 2D case here for simplicity.\n", + "\n", + "Now the goal is to find the interior points of a 2D grid given the values at the boundary.\n", + "\n" + ] + }, + { + "attachments": { + "fig17.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "18659ed7", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ca411d89", + "metadata": {}, + "source": [ + "For the Laplace equation in 2D, the interior values in the computational grid (represented by a matrix $u$) are computed with this iterative scheme. The entry $(i,j)$ of matrix $u$ at iteration $t+1$ is computed as:\n", + "\n", + "\n", + "$u^{t+1}_{(i,j)} = \\dfrac{u^t_{(i-1,j)}+u^t_{(i+1,j)}+u^t_{(i,j-1)}+u^t_{(i,j+1)}}{4}$\n", + "\n", + "Note that each entry is updated as the average of the four neighbors (top,bottom,left,right) of that entry in the previous iteration. " + ] + }, + { + "cell_type": "markdown", + "id": "8c916627", + "metadata": {}, + "source": [ + "### Serial implementation\n", + "\n", + "The next code implements a simple example, where the boundary values are equal to 1." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e843565", + "metadata": {}, + "outputs": [], + "source": [ + "function jacobi_2d(n,niters)\n", + " u = zeros(n+2,n+2)\n", + " u[1,:] = u[end,:] = u[:,1] = u[:,end] .= 1\n", + " u_new = copy(u)\n", + " for t in 1:niters\n", + " for j in 2:(n+1)\n", + " for i in 2:(n+1)\n", + " north = u[i,j+1]\n", + " south = u[i,j-1]\n", + " east = u[i+1,j]\n", + " west = u[i-1,j]\n", + " u_new[i,j] = 0.25*(north+south+east+west)\n", + " end\n", + " end\n", + " u, u_new = u_new, u\n", + " end\n", + " u\n", + "end" + ] + }, + { + "cell_type": "markdown", + "id": "f4dc50b1", + "metadata": {}, + "source": [ + "If you run the function for zero iterations you will see the initial condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4acf219e", + "metadata": {}, + "outputs": [], + "source": [ + "n = 10\n", + "niters = 0\n", + "u = jacobi_2d(n,niters)" + ] + }, + { + "cell_type": "markdown", + "id": "efd4df6a", + "metadata": {}, + "source": [ + "If you run the problem for enough iterations, you should converge to the exact solution. In this case, the exact solution is a matrix with all values equal to one." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c120b8b", + "metadata": {}, + "outputs": [], + "source": [ + "n = 10\n", + "niters = 300\n", + "u = jacobi_2d(n,niters)" + ] + }, + { + "cell_type": "markdown", + "id": "85895681", + "metadata": {}, + "source": [ + "### Where can we exploit parallelism?\n", + "\n", + "```julia\n", + "for t in 1:niters\n", + " for j in 2:(n+1)\n", + " for i in 2:(n+1)\n", + " north = u[i,j+1]\n", + " south = u[i,j-1]\n", + " east = u[i+1,j]\n", + " west = u[i-1,j]\n", + " u_new[i,j] = 0.25*(north+south+east+west)\n", + " end\n", + " end\n", + " u, u_new = u_new, u\n", + "end\n", + "```\n", + "\n", + "- The outer loop cannot be parallelized (like in the 1d case). \n", + "- The two inner loops are trivially parallel\n" + ] + }, + { + "cell_type": "markdown", + "id": "65e4f745", + "metadata": {}, + "source": [ + "### Parallelization strategies\n", + "\n", + "In 2d one has more flexibility in order to distribute the data over the processes. We consider these three alternatives:\n", + "\n", + "- 1D block partition (each worker handles a subset of consecutive rows and all columns)\n", + "- 2D block partition (each worker handles a subset of consecutive rows and columns)\n", + "- 2D cyclic partition (each workers handles a subset of alternating rows ans columns)\n", + "\n", + "The three partition types are depicted in the following figure for 4 processes." + ] + }, + { + "attachments": { + "fig-jacobi-partitions.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "11e834b5", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "7384ddfe", + "metadata": {}, + "source": [ + "Which of the thee alternatives is more efficient? To answer this question we need to quantify how much data is processed and communicated in each case. The following analysis assumes that the grid is of $N$ by $N$ cells and that the number of processes is $P$." + ] + }, + { + "cell_type": "markdown", + "id": "f733d88f", + "metadata": {}, + "source": [ + "### 1D block partition\n", + "\n", + "The following figure shows the portion of vector `u_new` that is updated at each iteration by a particular process (CPU 3) left picture, and which entries of `u` are needed to update this data, right picture. We use analogous figures for the other partitions below.\n" + ] + }, + { + "attachments": { + "g26521.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "6b983ffd", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4f1e0942", + "metadata": {}, + "source": [ + "- We update $N^2/P$ items per iteration\n", + "- We need data from 2 neighbors (2 messages per iteration)\n", + "- We communicate $N$ items per message\n", + "- Communication/computation ratio is $2N/(N^2/P) = 2P/N =O(P/N)$" + ] + }, + { + "cell_type": "markdown", + "id": "a9bed431", + "metadata": {}, + "source": [ + "### 2D block partition" + ] + }, + { + "attachments": { + "g26305.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "6f7b5b36", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "abb6520c", + "metadata": {}, + "source": [ + "- We update $N^2/P$ items per iteration\n", + "- We need data from 4 neighbors (4 messages per iteration)\n", + "- We communicate $N/\\sqrt{P}$ items per message\n", + "- Communication/computation ratio is $ (4N/\\sqrt{P})/(N^2/P)= 4\\sqrt{P}/N =O(\\sqrt{P}/N)$" + ] + }, + { + "cell_type": "markdown", + "id": "9aaf1ca6", + "metadata": {}, + "source": [ + "### 2D cyclic partition" + ] + }, + { + "attachments": { + "g26911.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "77701278", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9cd32923", + "metadata": {}, + "source": [ + "- We update $N^2/P$ items\n", + "- We need data from 4 neighbors (4 messages per iteration)\n", + "- We communicate $N^2/P$ items per message (the full data owned by the neighbor)\n", + "- Communication/computation ratio is $O(1)$" + ] + }, + { + "cell_type": "markdown", + "id": "191fa03b", + "metadata": {}, + "source": [ + "### Summary\n", + "\n", + "|Partition | Messages
per iteration | Communication
per worker | Computation
per worker | Ratio communication/
computation |\n", + "|---|---|---|---|---|\n", + "| 1d block | 2 | O(N) | N²/P | O(P/N) |\n", + "| 2d block | 4 | O(N/√P) | N²/P | O(√P/N) |\n", + "| 2d cyclic | 4 |O(N²/P) | N²/P | O(1) |" + ] + }, + { + "cell_type": "markdown", + "id": "c0c6d216", + "metadata": {}, + "source": [ + "### Which partition is the best one?\n", + "\n", + "\n", + "\n", + "- Both 1d and 2d block partitions are potentially scalable if $P<\n", + "Question: Which of the two loops in the Gauss-Seidel method are trivially parallelizable?\n", + "\n", + "\n", + "```julia\n", + "for t in 1:niters\n", + " for i in 2:(n+1)\n", + " u[i] = 0.5*(u[i-1]+u[i+1])\n", + " end\n", + "end\n", + "```\n", + "\n", + " a) Both of them\n", + " b) The outer, but not the inner\n", + " c) None of them\n", + " d) The inner, but not the outer\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b383598", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "answer = \"x\" # replace x with a, b, c or d\n", + "gauss_seidel_1_check(answer)" + ] + }, + { + "cell_type": "markdown", + "id": "6b06f709", + "metadata": {}, + "source": [ + "If you look into the algorithm closely, you will realize that the steps in loop over `i` are not independent. To update `u[i]` we first need to update `u[i-1]`, which requires to update `u[i-2]` etc. This happens for Gauss-Seidel but not for Jacobi. For Jacobi the updates are written into the temporary array `u_new` instead of updating `u` directly. In other words, in Jacobi, updating `u_new[i]` does not require any entry updated entry of `u_new`. It only requires entries in vector `u`, which is not modified in the loop over `i`." + ] + }, + { + "cell_type": "markdown", + "id": "099634d9", + "metadata": {}, + "source": [ + "### Backwards Gauss-Seidel\n", + "\n", + "In addition, the the result of the Gauss-Seidel method depends on the order of the steps in the loop over `i`. This is another symptom that tells you that this loop is hard to parallelize. For instance, if you do the iterations over `i` by reversing the loop order, you get another method called *backward* Gauss-Seidel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff03c246", + "metadata": {}, + "outputs": [], + "source": [ + "function backward_gauss_seidel(n,niters)\n", + " u = zeros(n+2)\n", + " u[1] = -1\n", + " u[end] = 1\n", + " for t in 1:niters\n", + " for i in (n+1):-1:2\n", + " u[i] = 0.5*(u[i-1]+u[i+1])\n", + " end\n", + " end\n", + " u\n", + "end" + ] + }, + { + "cell_type": "markdown", + "id": "63c4ce1f", + "metadata": {}, + "source": [ + "Both Jacobi and *forward* and *backward* Gauss-Seidel converge to the same result, but they lead to slightly different values during the iterations. Check it with the following cells. First, run it with one `niters=1` and then with `niters=100`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abe31423", + "metadata": {}, + "outputs": [], + "source": [ + "n = 5\n", + "niters = 1\n", + "u_forward = gauss_seidel(n,niters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23430f70", + "metadata": {}, + "outputs": [], + "source": [ + "u_backward = backward_gauss_seidel(n,niters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b2b2437", + "metadata": {}, + "outputs": [], + "source": [ + "u_jacobi = jacobi(n,niters)" + ] + }, + { + "cell_type": "markdown", + "id": "0deb5549", + "metadata": {}, + "source": [ + "### Red-black Gauss-Seidel\n", + "\n", + "There is another version called *red-black* Gauss-Seidel. This uses a very clever order for the steps in the loop over `i`. It does this loop in two phases. First, one updates the entries with even index, and then the entries with odd index." + ] + }, + { + "attachments": { + "g28304.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "dda0a371", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9707f13b", + "metadata": {}, + "source": [ + "The implementation is given in the following cell. Note that we introduced an extra loop that represent\n", + "each one of the two phases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0cbe2d8", + "metadata": {}, + "outputs": [], + "source": [ + "function red_black_gauss_seidel(n,niters)\n", + " u = zeros(n+2)\n", + " u[1] = -1\n", + " u[end] = 1\n", + " for t in 1:niters\n", + " for color in (0,1)\n", + " for i in (n+1):-1:2\n", + " if color == mod(i,2)\n", + " u[i] = 0.5*(u[i-1]+u[i+1])\n", + " end\n", + " end\n", + " end\n", + " end\n", + " u\n", + "end" + ] + }, + { + "cell_type": "markdown", + "id": "13ce270f", + "metadata": {}, + "source": [ + "Run the method for several values of `niters`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59c1e7f8", + "metadata": {}, + "outputs": [], + "source": [ + "n = 5\n", + "niters = 1000\n", + "red_black_gauss_seidel(n,niters)" + ] + }, + { + "cell_type": "markdown", + "id": "d1bacc26", + "metadata": {}, + "source": [ + "
\n", + "Question: Which of the loops in the red-black Gauss-Seidel method are trivially parallelizable?\n", + "
\n", + "\n", + "```julia\n", + "for t in 1:niters\n", + " for color in (0,1)\n", + " for i in (n+1):-1:2\n", + " if color == mod(i,2)\n", + " u[i] = 0.5*(u[i-1]+u[i+1])\n", + " end\n", + " end\n", + " end\n", + "end\n", + "```\n", + "\n", + " a) All loops\n", + " b) Loop over t only\n", + " c) Loop over color only\n", + " d) Loop over i only\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d511cc02", + "metadata": {}, + "outputs": [], + "source": [ + "answer = \"x\" # replace x with a, b, c or d\n", + "gauss_seidel_2_check(answer)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8946b83f", + "metadata": {}, + "outputs": [], + "source": [ + "gauss_seidel_2_why()" + ] + }, { "cell_type": "markdown", "id": "8ed4129c", @@ -552,7 +1093,13 @@ "source": [ "## MPI implementation\n", "\n", - "We consider the implementation of the Jacobi method using MPI. The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed.jl, but it requires some extra effort to setup the remote channels right for the communication between neighbor processes.\n", + "We consider the implementation of the Jacobi method using MPI. We will consider the 1D version for simplicity.\n", + "\n", + "\n", + "
\n", + "Note: The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed.jl, but it requires some extra effort to setup the remote channels right for the communication between neighbor processes. \n", + "
\n", + "\n", "\n", "We are going to implement the method in a function with the following signature\n", "\n", @@ -571,8 +1118,8 @@ }, { "cell_type": "code", - "execution_count": 53, - "id": "77088426", + "execution_count": null, + "id": "d31c1e41", "metadata": {}, "outputs": [], "source": [ @@ -594,7 +1141,7 @@ }, { "cell_type": "markdown", - "id": "cae5af50", + "id": "04a38c37", "metadata": {}, "source": [ "In the following cells, we discuss the implementation of the helper functions `init`, `ghost_exchange`, and `local_update`." @@ -602,7 +1149,7 @@ }, { "cell_type": "markdown", - "id": "5da3e049", + "id": "96b8d40e", "metadata": {}, "source": [ "### Initialization\n", @@ -612,8 +1159,8 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "ee17f3cb", + "execution_count": null, + "id": "b98a9348", "metadata": {}, "outputs": [], "source": [ @@ -641,7 +1188,7 @@ }, { "cell_type": "markdown", - "id": "dee2b3b9", + "id": "1b9e75d8", "metadata": {}, "source": [ "This function crates and initializes the vector `u` and the auxiliary vector `u_new` and fills in the boundary values. Note that we are not creating the full arrays like in the sequential case. We are only creating the parts to be managed by the current rank. To this end, we start by computing the number of entries to be updated in this rank, i.e., variable `load`. We have assumed that `n` is a multiple of the number of ranks for simplicity. If this is not the case, we stop the computation with `MPI.Abort`. Note that we are allocating two extra elements in `u` (and `u_new`) for the ghost cells or boundary conditions. The following figure displays the arrays created for `n==9` and `nranks==3` (thus `load == 3`). Note that the first and last elements of the arrays are displayed with gray edges denoting that they are the extra elements allocated for ghost cells or boundary conditions." @@ -654,7 +1201,7 @@ } }, "cell_type": "markdown", - "id": "5885e6e7", + "id": "756b8d01", "metadata": {}, "source": [ "
\n", @@ -664,7 +1211,7 @@ }, { "cell_type": "markdown", - "id": "0efe5f7a", + "id": "3f0e49e4", "metadata": {}, "source": [ "### Communication\n", @@ -679,7 +1226,7 @@ } }, "cell_type": "markdown", - "id": "f7045b08", + "id": "6b214777", "metadata": {}, "source": [ "
\n", @@ -689,7 +1236,7 @@ }, { "cell_type": "markdown", - "id": "e340cfd0", + "id": "c1bd8413", "metadata": {}, "source": [ "The communication step happens in function `ghost_exchange!`. This one modifies the ghost cells in the input vector `u` by importing data using MPI point-to-point communication. See the following code:" @@ -697,8 +1244,8 @@ }, { "cell_type": "code", - "execution_count": 59, - "id": "f3221768", + "execution_count": null, + "id": "688638a1", "metadata": {}, "outputs": [], "source": [ @@ -729,7 +1276,7 @@ }, { "cell_type": "markdown", - "id": "8948edc4", + "id": "5bf5408c", "metadata": {}, "source": [ "Note that we have used `MPI.Sendrecv!` to send and receive values." @@ -737,7 +1284,7 @@ }, { "cell_type": "markdown", - "id": "186254b6", + "id": "d2ce54e4", "metadata": {}, "source": [ "
\n", @@ -778,18 +1325,10 @@ }, { "cell_type": "code", - "execution_count": 62, - "id": "77e94001", + "execution_count": null, + "id": "8498c7e2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "It's not correct. Keep trying! 💪\n" - ] - } - ], + "outputs": [], "source": [ "answer = \"x\" # replace x with a, b, c or d\n", "sndrcv_check(answer)" @@ -797,7 +1336,7 @@ }, { "cell_type": "markdown", - "id": "fd3f87e4", + "id": "d863cb89", "metadata": {}, "source": [ "
\n", @@ -809,27 +1348,17 @@ }, { "cell_type": "code", - "execution_count": 75, - "id": "16a76ea1", + "execution_count": null, + "id": "629a3356", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "One needs to carefully order the sends and the receives to avoid cyclic dependencies\n", - "that might result in deadlocks. The actual implementation is left as an exercise. \n", - "\n" - ] - } - ], + "outputs": [], "source": [ "sndrcv_fix_answer()" ] }, { "cell_type": "markdown", - "id": "0bc9ed9d", + "id": "82e21f4e", "metadata": {}, "source": [ "### Local computation\n", @@ -839,8 +1368,8 @@ }, { "cell_type": "code", - "execution_count": 55, - "id": "cfce8c20", + "execution_count": null, + "id": "f43560e5", "metadata": {}, "outputs": [], "source": [ @@ -856,7 +1385,7 @@ }, { "cell_type": "markdown", - "id": "ffc1b539", + "id": "47861c19", "metadata": {}, "source": [ "### Running the code\n", @@ -866,8 +1395,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "d990bd1c", + "execution_count": null, + "id": "53674411", "metadata": {}, "outputs": [], "source": [ @@ -876,7 +1405,7 @@ }, { "cell_type": "markdown", - "id": "9ac0d914", + "id": "c966375a", "metadata": {}, "source": [ "The following cells includes all previous code snippets into a final one. Note that we are eventually calling function `jacobi_mpi` and showing the result vector `u`. Run the following code for 1 MPI rank, then for 2 and 3 MPI ranks. Look into the values of `u`. Does it make sense?" @@ -884,18 +1413,10 @@ }, { "cell_type": "code", - "execution_count": 92, - "id": "0926b746", + "execution_count": null, + "id": "f91e4759", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "u = [-1.0, -0.7999999999999999, -0.5999999999999999, -0.3999999999999999, -0.19999999999999996, 0.0, 0.19999999999999996, 0.3999999999999999, 0.5999999999999999, 0.7999999999999999, 1.0]\n" - ] - } - ], + "outputs": [], "source": [ "using MPI\n", "code = quote\n", @@ -916,7 +1437,7 @@ }, { "cell_type": "markdown", - "id": "d5d5bb40", + "id": "8e4fe21d", "metadata": {}, "source": [ "### Checking the result\n", @@ -929,8 +1450,8 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "ec9dcdec", + "execution_count": null, + "id": "49a220c6", "metadata": {}, "outputs": [], "source": [ @@ -973,7 +1494,7 @@ }, { "cell_type": "markdown", - "id": "93fb1bd6", + "id": "e66bad1b", "metadata": {}, "source": [ "Run the following cell to see the result. Is the result as expected?" @@ -981,20 +1502,10 @@ }, { "cell_type": "code", - "execution_count": 97, - "id": "8e173a5f", + "execution_count": null, + "id": "4a9f4a54", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "u_root = [-1.0, -0.7999999999999999, -0.5999999999999999, -0.3999999999999999, -0.19999999999999996, 0.0, 0.19999999999999996, 0.3999999999999999, 0.5999999999999999, 0.7999999999999999, 1.0]\n", - "u_root = Float64[]\n", - "u_root = Float64[]\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -1016,7 +1527,7 @@ }, { "cell_type": "markdown", - "id": "d0edbad5", + "id": "dc9b2b51", "metadata": {}, "source": [ "Now that we have collected the parallel vector into a single array, we can compare it against the sequential implementation. This is done in the following cells." @@ -1024,8 +1535,8 @@ }, { "cell_type": "code", - "execution_count": 98, - "id": "6abd3a76", + "execution_count": null, + "id": "cb053382", "metadata": {}, "outputs": [], "source": [ @@ -1048,18 +1559,10 @@ }, { "cell_type": "code", - "execution_count": 102, - "id": "58c2f44e", + "execution_count": null, + "id": "ffe6c605", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test passed 🥳\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -1091,7 +1594,7 @@ }, { "cell_type": "markdown", - "id": "1bd7a876", + "id": "73cd4d73", "metadata": {}, "source": [ "Note that we have used function `isapprox` to compare the results. This function checks if two values are the same within machine precision. Using `==` is generally discouraged when working with floating point numbers as they can be affected by rounding-off errors." @@ -1099,7 +1602,7 @@ }, { "cell_type": "markdown", - "id": "a6602ada", + "id": "d73c838c", "metadata": {}, "source": [ "
\n", @@ -1107,25 +1610,17 @@ "
\n", "\n", " a) The test will still pass.\n", - " c) The test will fail due to rounding-off errors.\n", - " b) The test might pass or fail depending on `n`.\n", + " b) The test will fail due to rounding-off errors.\n", + " c) The test might pass or fail depending on `n`.\n", " d) The test might pass or fail depending on the number of MPI ranks." ] }, { "cell_type": "code", - "execution_count": 105, - "id": "6b1c9f68", + "execution_count": null, + "id": "cd2427f1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "It's not correct. Keep trying! 💪\n" - ] - } - ], + "outputs": [], "source": [ "answer = \"x\" # replace x with a, b, c or d\n", "jacobitest_check(answer)" @@ -1133,7 +1628,7 @@ }, { "cell_type": "markdown", - "id": "0825df69", + "id": "790e7064", "metadata": {}, "source": [ "Run cell below for an explanation of the correct answer." @@ -1141,22 +1636,10 @@ }, { "cell_type": "code", - "execution_count": 106, - "id": "7a1a1342", + "execution_count": null, + "id": "72ed2aa1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The test will pass. The parallel implementation does exactly the same operations\n", - "in exactly the same order than the sequential one. Thus, the result should be\n", - "exactly the same. Note however this is often not true in other parallel algorithms.\n", - "Specially, when one does parallel reductions.\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "jacobitest_why()" ] @@ -1168,9 +1651,7 @@ "source": [ "## Latency hiding\n", "\n", - "Can our implementation above be improved? Note that we only need communications to update the values at the boundary of the portion owned by each process. The other values (the one in green in the figure below) can be updated without communications. This provides the opportunity of overlapping the computation of the interior values (green cells in the figure) with the communication of the ghost values. This technique is called latency hiding, since we are hiding communication latency by overlapping it with computation that we need to do anyway.\n", - "\n", - "The modification of the implementation above to include latency hiding is leaved as an exercise (see below).\n" + "Can our implementation above be improved? Note that we only need communications to update the values at the boundary of the portion owned by each process. The other values (the one in green in the figure below) can be updated without communications. This provides the opportunity of overlapping the computation of the interior values (green cells in the figure) with the communication of the ghost values. This technique is called latency hiding, since we are hiding communication latency by overlapping it with computation that we need to do anyway. The actual implementation is left as an exercise (see Exercise 1)." ] }, { @@ -1190,288 +1671,45 @@ }, { "cell_type": "markdown", - "id": "9d4de5a9", + "id": "c2d48c45", "metadata": {}, "source": [ - "## Extension to 2D\n", + "
\n", + "Question: Which MPI directives would you use to implement latency hiding in the communication the ghost values?\n", + "
\n", "\n", - "\n", - "Now, let us study the method for a 2D example." - ] - }, - { - "attachments": { - "fig17.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "f14142ea", - "metadata": {}, - "source": [ - "
\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "b1e1a12b", - "metadata": {}, - "source": [ - "For the Laplace equation in 2D, the interior values in the computational grid (represented by a matrix $u$) are computed with this iterative scheme. The entry $(i,j)$ of matrix $u$ at iteration $t+1$ is computed as:\n", - "\n", - "\n", - "$u^{t+1}_{(i,j)} = \\dfrac{u^t_{(i-1,j)}+u^t_{(i+1,j)}+u^t_{(i,j-1)}+u^t_{(i,j+1)}}{4}$\n", - "\n", - "Note that each entry is updated as the average of the four neighbors (top,bottom,left,right) of that entry in the previous iteration. " - ] - }, - { - "cell_type": "markdown", - "id": "6f5d2895", - "metadata": {}, - "source": [ - "### Serial implementation\n", - "\n", - "The next code implements a simple example, where the boundary values are equal to 1." + " a) MPI_Send and MPI_Recv\n", + " b) MPI_Bsend and MPI_Recv\n", + " c) MPI_Isend and MPI_Irecv \n", + " d) MPI_Sendrecv" ] }, { "cell_type": "code", "execution_count": null, - "id": "4ab59b2f", + "id": "29ade8f6", "metadata": {}, "outputs": [], "source": [ - "function jacobi_2d(n,niters)\n", - " u = zeros(n+2,n+2)\n", - " u[1,:] = u[end,:] = u[:,1] = u[:,end] .= 1\n", - " u_new = copy(u)\n", - " for t in 1:niters\n", - " for j in 2:(n+1)\n", - " for i in 2:(n+1)\n", - " north = u[i,j+1]\n", - " south = u[i,j-1]\n", - " east = u[i+1,j]\n", - " west = u[i-1,j]\n", - " u_new[i,j] = 0.25*(north+south+east+west)\n", - " end\n", - " end\n", - " u, u_new = u_new, u\n", - " end\n", - " u\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6da0aa54", - "metadata": {}, - "outputs": [], - "source": [ - "u = jacobi_2d(10,0)" + "answer = \"x\" # replace x with a, b, c or d\n", + "lh_check(answer)" ] }, { "cell_type": "markdown", - "id": "45d786dd", + "id": "9bd014b0", "metadata": {}, "source": [ - "### Where can we exploit parallelism?\n", + "## Conclusion\n", "\n", - "```julia\n", - "for t in 1:niters\n", - " for j in 2:(n+1)\n", - " for i in 2:(n+1)\n", - " north = u[i,j+1]\n", - " south = u[i,j-1]\n", - " east = u[i+1,j]\n", - " west = u[i-1,j]\n", - " u_new[i,j] = 0.25*(north+south+east+west)\n", - " end\n", - " end\n", - " u, u_new = u_new, u\n", - "end\n", - "```\n", - "\n", - "- The outer loop cannot be parallelized (like in the 1d case). \n", - "- The two inner loops are trivially parallel\n" - ] - }, - { - "cell_type": "markdown", - "id": "f93e2024", - "metadata": {}, - "source": [ - "### Parallelization strategies\n", - "\n", - "In 2d one has more flexibility in order to distribute the data over the processes. We consider these three alternatives:\n", - "\n", - "- 1D block partition (each worker handles a subset of consecutive rows and all columns)\n", - "- 2D block partition (each worker handles a subset of consecutive rows and columns)\n", - "- 2D cyclic partition (each workers handles a subset of alternating rows ans columns)\n", - "\n", - "The three partition types are depicted in the following figure for 4 processes." - ] - }, - { - "attachments": { - "fig-jacobi-partitions.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "267ecd2a", - "metadata": {}, - "source": [ - "
\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "e0cee28b", - "metadata": {}, - "source": [ - "Which of the thee alternatives is more efficient? To answer this question we need to quantify how much data is processed and communicated in each case. The following analysis assumes that the grid is of $N$ by $N$ cells and that the number of processes is $P$." - ] - }, - { - "cell_type": "markdown", - "id": "f6ea16f5", - "metadata": {}, - "source": [ - "### 1D block partition\n", - "\n", - "The following figure shows the portion of vector `u_new` that is updated at each iteration by a particular process (CPU 3) left picture, and which entries of `u` are needed to update this data, right picture. We use analogous figures for the other partitions below.\n" - ] - }, - { - "attachments": { - "g26521.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "0cfeca62", - "metadata": {}, - "source": [ - "
\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "4600c94a", - "metadata": {}, - "source": [ - "- We update $N^2/P$ items per iteration\n", - "- We need data from 2 neighbors (2 messages per iteration)\n", - "- We communicate $N$ items per message\n", - "- Communication/computation ratio is $2N/(N^2/P) = 2P/N =O(P/N)$" - ] - }, - { - "cell_type": "markdown", - "id": "969c42ee", - "metadata": {}, - "source": [ - "### 2D block partition" - ] - }, - { - "attachments": { - "g26305.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "e5142fa1", - "metadata": {}, - "source": [ - "
\n", - "\n", - "
\n" - ] - }, - { - "cell_type": "markdown", - "id": "091b0310", - "metadata": {}, - "source": [ - "- We update $N^2/P$ items per iteration\n", - "- We need data from 4 neighbors (4 messages per iteration)\n", - "- We communicate $N/\\sqrt{P}$ items per message\n", - "- Communication/computation ratio is $ (4N/\\sqrt{P})/(N^2/P)= 4\\sqrt{P}/N =O(\\sqrt{P}/N)$" - ] - }, - { - "cell_type": "markdown", - "id": "a8fb49a3", - "metadata": {}, - "source": [ - "### 2D cyclic partition" - ] - }, - { - "attachments": { - "g26911.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "1bc30b74", - "metadata": {}, - "source": [ - "
\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "c45f4e44", - "metadata": {}, - "source": [ - "- We update $N^2/P$ items\n", - "- We need data from 4 neighbors (4 messages per iteration)\n", - "- We communicate $N^2/P$ items per message (the full data owned by the neighbor)\n", - "- Communication/computation ratio is $O(1)$" - ] - }, - { - "cell_type": "markdown", - "id": "3d0693a7", - "metadata": {}, - "source": [ - "### Summary\n", - "\n", - "|Partition | Messages
per iteration | Communication
per worker | Computation
per worker | Ratio communication/
computation |\n", - "|---|---|---|---|---|\n", - "| 1d block | 2 | O(N) | N²/P | O(P/N) |\n", - "| 2d block | 4 | O(N/√P) | N²/P | O(√P/N) |\n", - "| 2d cyclic | 4 |O(N²/P) | N²/P | O(1) |" - ] - }, - { - "cell_type": "markdown", - "id": "850b1848", - "metadata": {}, - "source": [ - "### Which partition is the best one?\n", - "\n", - "\n", - "\n", - "- Both 1d and 2d block partitions are potentially scalable if $P<