More work in GE notebook

This commit is contained in:
Francesc Verdugo committed 2024-09-18 18:09:17 +02:00
1 parent ab95b334eb
commit d7b9ff635a
4 files changed
+6200 -146

No files matched your search

+450 -118
View File
@@ -37,10 +37,21 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 18,
"id": "7e93809a",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"ge_lb_answer (generic function with 1 method)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using Printf\n",
"function answer_checker(answer,solution)\n",
@@ -50,19 +61,27 @@
" \"It's not correct. Keep trying! 💪\"\n",
" end |> println\n",
"end\n",
"function ge_par_why()\n",
" msg = \"The outer loop of the algorithm is not parallelizable, since the iterations depend on the results of the previous iterations. However, we can extract parallelism from the inner loops.\"\n",
" println(msg)\n",
"end\n",
"ge_par_check(answer) = answer_checker(answer, \"a\")\n",
"ge_dep_check(answer) = answer_checker(answer, \"b\")"
"ge_dep_check(answer) = answer_checker(answer, \"b\")\n",
"function ge_lb_answer()\n",
" msg = \"It is a form of static load balancing. We know in advance the load distribution and the partition strategy does not depend on the actual values of the input matrix\"\n",
" println(msg)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "8dcee319",
"id": "8ad95aa5",
"metadata": {},
"source": [
"## Gaussian elimination\n",
"\n",
"\n",
"[Gaussian elimination](https://en.wikipedia.org/wiki/Gaussian_elimination) is a method to solve systems of linear equations, e.g.\n",
"[Gaussian elimination](https://en.wikipedia.org/wiki/Gaussian_elimination) is a method to solve systems of linear equations, like this one:\n",
"\n",
"$$\n",
"\\left[\n",
@@ -89,47 +108,129 @@
"\\right]\n",
"$$\n",
"\n",
"The steps of the Gaussian elimination will transform the system into an upper triangular matrix. The system of linear equations can now easily be solved by backward substitution. \n",
"This is just a small example with three unknowns, but practical applications need to solve linear equations with large number of unknowns. Parallel processing is needed in these cases.\n",
"\n",
"### Problem statement\n",
"\n",
"Let us consider a system of linear equations written in matrix form $Ax=b$, where A is a nonsingular square matrix, and x and b are vectors. The goal of Gaussian elimination is to transform the system $Ax=b$, into a new system $Ux=c$ such that\n",
"- both system have the same solution vector $x$,\n",
"- the matrix $U$ of the new system is *upper triangular* with unit diagonal, namely $U_{ii} = 1$ and $U_{ij} = 0$ for $i>j$.\n",
"\n",
"\n",
"For the particular system shown above, the transformed one is the following:\n",
"\n",
"$$\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"1 & 3 & 1 \\\\\n",
"1 & 2 & -1 \\\\\n",
"3 & 11 & 5 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\left[\n",
"\\begin{matrix}\n",
"x \\\\\n",
"y \\\\\n",
"z \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"=\n",
"\\left[\n",
"\\begin{matrix}\n",
"9 \\\\\n",
"1 \\\\\n",
"35 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\longrightarrow\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 \\\\\n",
"0 & 1 & 2 \\\\\n",
"0 & 0 & 1 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\left[\n",
"\\begin{matrix}\n",
"x \\\\\n",
"y \\\\\n",
"z \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"=\n",
"\\left[\n",
"\\begin{matrix}\n",
"9 \\\\\n",
"8 \\\\\n",
"4 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"$$\n",
"\n",
"The most challenging part of solving a system of linear equations is to transform it to upper triangular form. Afterwards, the solution vector can be obtained easily with a backward substitution."
]
},
{
"cell_type": "markdown",
"id": "980cb36f",
"metadata": {},
"source": [
"\n",
"\n",
"### Augmented system matrix\n",
"\n",
"In practice, vector $b$ is added as an additional column to A forming the so-called *augmented* matrix $A^* = [A | b]$.\n",
"\n",
"$$\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 \\\\\n",
"1 & 2 & -1 \\\\\n",
"3 & 11 & 5 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\left[\n",
"\\begin{matrix}\n",
"x \\\\\n",
"y \\\\\n",
"z \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"=\n",
"\\left[\n",
"\\begin{matrix}\n",
"9 \\\\\n",
"1 \\\\\n",
"35 \\\\\n",
"\\end{matrix}\n",
"\\right]\\longrightarrow\n",
"A^*=\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"1 & 2 & -1 & 1 \\\\\n",
"3 & 11 & 5 & 35 \\\\\n",
"3 & 11 & 5 & 35\\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\rightarrow\n",
"$$\n",
"\n",
"With this new notation, the goal of Gaussian elimination is to find the augmented matrix containing $U$ and $c$, namely $U^*= [U | c]$, given the augmented matrix $A^* = [A | b]$.\n",
"\n",
"$$\n",
"A^*=\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"1 & 2 & -1 & 1 \\\\\n",
"3 & 11 & 5 & 35\\\\\n",
"\\end{matrix}\n",
"\\right]\\longrightarrow\n",
"U^*=\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"0 & -1 & -2 & -8 \\\\\n",
"0 & 2 & 2 & 8 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\rightarrow\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"0 & 1 & 2 & 8 \\\\\n",
"0 & 2 & 2 & 8 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\rightarrow\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"0 & 1 & 2 & 8 \\\\\n",
"0 & 0 & -2 & -8 \\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"\\rightarrow\n",
"\\left[\n",
"\\begin{matrix}\n",
"1 & 3 & 1 & 9 \\\\\n",
"0 & 1 & 2 & 8 \\\\\n",
"0 & 0 & 1 & 4 \\\\\n",
"0 & 1 & 2 & 8\\\\\n",
"0 & 0 & 1 & 4\\\\\n",
"\\end{matrix}\n",
"\\right]\n",
"$$\n",
@@ -142,43 +243,71 @@
"metadata": {},
"source": [
"### Serial implementation\n",
"The following algorithm computes the Gaussian elimination on a matrix which represents a system of linear equations.\n",
"- The first inner loop in line 4 divides the current row by the value of the diagonal entry, thus transforming the diagonal to contain only ones. \n",
"- The second inner loop beginning in line 8 substracts the rows from one another such that all entries below the diagonal become zero. "
"\n",
"\n",
"The following algorithm computes the Gaussian elimination on a given augmented matrix `B`, representing a system of linear equations.\n",
"\n",
"- The outer loop is a loop over rows.\n",
"- The first inner loop in line 4 divides the current row by the value of the diagonal entry, thus transforming the diagonal to contain only ones. Note that we skip the first entries in the row, as we know that these values are zero at this point. The cells updated in this loop at iteration $k$ are depicted in red in the figure below.\n",
"- The second inner loop beginning in line 8 substracts the rows from one another such that all entries below the diagonal become zero. The entries updated in this loop are depicted in blue in the figure below."
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 13,
"id": "e4070214",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"gaussian_elimination! (generic function with 1 method)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function gaussian_elimination!(B)\n",
" n,m = size(B)\n",
" @inbounds for k in 1:n\n",
" for t in (k+1):m\n",
" for t in k:m\n",
" B[k,t] = B[k,t]/B[k,k]\n",
" end\n",
" B[k,k] = 1\n",
" for i in (k+1):n \n",
" for j in (k+1):m\n",
" for j in k:m\n",
" B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
" end\n",
" B[i,k] = 0\n",
" end\n",
" end\n",
" B\n",
"end"
]
},
{
"attachments": {
"g30822.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "ffb84b53",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g30822.png\" align=\"left\" width=\"300\"/>\n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"id": "3763b000",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-info\">\n",
"<b>Note:</b> This algorithm is not correct for all matrices: if any diagonal element <code>B[k,k]</code> is zero, the computation in the first inner loop fails. To get around this problem, another step can be added to the algorithm that swaps the rows until the diagonal entry of the current row is not zero. This process of finding a nonzero value is called <b>pivoting</b>. \n",
"<b>Note:</b> This algorithm is not correct for all matrices: if any diagonal element <code>B[k,k]</code> is zero, the computation in the first inner loop fails. To get around this problem, another step can be added to the algorithm that swaps the rows until the diagonal entry of the current row is not zero. This process of finding a nonzero value is called <b>pivoting</b>. We are not going to consider pivoting here for simplicity. \n",
"</div>"
]
},
@@ -192,10 +321,24 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 12,
"id": "eb30df0d",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"3×4 Matrix{Float64}:\n",
" 1.0 3.0 1.0 9.0\n",
" 0.0 1.0 -1.0 1.0\n",
" 0.0 0.0 1.0 35.0"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = Float64[1 3 1; 1 2 -1; 3 11 5]\n",
"b = Float64[9,1,35]\n",
@@ -203,6 +346,16 @@
"gaussian_elimination!(B)"
]
},
{
"cell_type": "markdown",
"id": "a7d6f90a",
"metadata": {},
"source": [
"### Complexity of the algorithm\n",
"\n",
"The number of operations of the algorithm is $O(N^3)$, where $N$ is the number of unknowns in the system. Intuitively, this makes sense as there are three nested loops. However, the length of the loops is not equal to $N$. In any case, it can be proven that the total number of operations is still $O(N^3)$. The actual proof is a bit challenging and it is not discussed here."
]
},
{
"cell_type": "markdown",
"id": "39f2e8ef",
@@ -221,15 +374,13 @@
"```julia\n",
"n,m = size(B)\n",
"for k in 1:n\n",
" for t in (k+1):m\n",
" for t in k:m\n",
" B[k,t] = B[k,t]/B[k,k]\n",
" end\n",
" B[k,k] = 1\n",
" for i in (k+1):n \n",
" for j in (k+1):m\n",
" for j in k:m\n",
" B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
" end\n",
" B[i,k] = 0\n",
" end\n",
"end\n",
"```"
@@ -252,82 +403,76 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 7,
"id": "078e974e",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"🥳 Well done! \n"
]
}
],
"source": [
"answer = \"x\" # replace x with a, b, c, or d \n",
"answer = \"a\" # replace x with a, b, c, or d \n",
"ge_par_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "14d57c52",
"cell_type": "code",
"execution_count": 15,
"id": "1169c86e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The outer loop of the algorithm is not parallelizable, since the iterations depend on the results of the previous iterations. However, we can extract parallelism from the inner loops.\n"
]
}
],
"source": [
"### Two possible data partitions"
"ge_par_why()"
]
},
{
"cell_type": "markdown",
"id": "6b17aee4",
"id": "74491f64",
"metadata": {},
"source": [
"The outer loop of the algorithm is not parallelizable, since the iterations depend on the results of the previous iterations. However, we can extract parallelism from the inner loops. Let's have a look at two different parallelization schemes. \n",
"### Data partition\n",
"\n",
"1. **Block-wise partitioning**: Each processor gets a block of subsequent rows. \n",
"2. **Cyclic partitioning**: The rows are alternately assigned to different processors. "
"Let start considering a row-wise block partition, as we did for the previous algorithms.\n",
"\n",
"In the figure below, we use different colors to illustrate which entries are assigned to a CPU. All entries with the same color are assigned to the same CPU."
]
},
{
"attachments": {
"fig-asp-1d-partition.png": {
"image/png": "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 truncated
"g31767.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "c518f863",
"id": "7460b0af",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig-asp-1d-partition.png\" align=\"left\" width=\"400\"/>\n",
"<img src=\"attachment:g31767.png\" align=\"left\" width=\"250\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "102d6fa2",
"id": "3ebddda1",
"metadata": {},
"source": [
"## What is the work per process at iteration k?\n",
"To evaluate the efficiency of both partitioning schemes, consider how much work the processors do in the following example. \n",
"In any iteration k, which part of the matrix is updated in the inner loops? \n",
"### Load imbalance\n",
"\n",
"### Block-wise partition"
]
},
{
"attachments": {
"fig-asp-data-updated.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "a67e0aad",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig-asp-data-updated.png\" align=\"left\" width=\"250\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "d9d29899",
"metadata": {},
"source": [
"It is clear from the code that at any given iteration `k`, the matrix is updated from row `k` to `n` and from column `k` to `m`. If we look at how that reflects the distribution of work over the processes, we can see that CPU 1 does not have any work, whereas CPU 2 does a little work and CPU 3 and 4 do a lot of work. "
"Each CPU will be on charge of updating the entries stored locally. However, this algorithm is a bit different than the previous ones. At iteration $k$ only a subset of the entries in the matrix `B` are updated, i.e. only the entries in the bottom right block `B[k:end,k:end]` are updated. This block is illustrated in a darker color in the next figure for $k=6$. "
]
},
{
@@ -347,34 +492,16 @@
},
{
"cell_type": "markdown",
"id": "6409890d",
"id": "e341fda6",
"metadata": {},
"source": [
"### Load imbalance\n",
"In this particular example CPU 1 will not have any work to do at iteration $k=6$ and it will be waiting, while other CPUs are computing. In general, CPUs containing rows previous to row $k$ will have less work to do than CPUs containing rows after row $k$. This will worsen as the value of $k$ increases. At some point, only the last CPU will have work to do and the others will idle. \n",
"\n",
"The block-wise partitioning scheme leads to load imbalance across the processes: CPUs with rows $<k$ are idle during any iteration $k$. The bad load balance leads to bad speedups, as some CPUs are waiting instead of doing useful work. \n",
" \n",
"### Data dependencies\n",
" \n",
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> What are the data dependencies in the block-wise partitioning?\n",
"<div class=\"alert alert-block alert-info\">\n",
"<b>Definition:</b> *Load imbalance*: is the problem when work is not equally distributed over all processes and consequently some processes do more work than others.\n",
"</div>\n",
"\n",
" a) CPUs with rows >k need all rows <=k\n",
" b) CPUs with rows >k need part of row k\n",
" c) All CPUs need row k \n",
" d) CPUs with row k needs all rows >k \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0565e92",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c, or d \n",
"ge_dep_check(answer)"
"Having processors waiting for others is a wast of computational resources and affects negatively parallel speedups. The optimal speedup (speedup equal to the number of processors) assumes that the work is perfectly parallel and that it is evenly distributed. If there is load imbalance, the last assumption is not true anymore and the speedup will be suboptimal.\n"
]
},
{
@@ -382,9 +509,11 @@
"id": "51498a44",
"metadata": {},
"source": [
"### Cyclic partition\n",
"### Fixing load imbalance\n",
"\n",
"In contrast, if we look at how the work is balanced for the same example and cyclic partitioning, we find that the processes have similar work load. "
"In this application is relatively easy to fix the load imbalance problem. We know in advance which data is going to be processes at each CPU and we can design a more clever data partition.\n",
"\n",
"We can consider row-wise cyclic partition to fix the problem. See figure below. In this case, the CPUs will have less work as the value of $k$ increases, but amount of work will be better distributed than with the block partition."
]
},
{
@@ -402,6 +531,209 @@
"</div>"
]
},
{
"cell_type": "markdown",
"id": "1c9e4c8a",
"metadata": {},
"source": [
"### Static vs dynamic load balancing\n",
"\n",
"Load balancing is the process of distributing work to processors uniformly with the aim to efficiently exploit a parallel system. There are two key forms of load balancing: Static and dynamic load balancing.\n",
"\n",
"- **Static load balancing** the work distribution strategy is based on prior information of the algorithm and it does not depend on runtime values.\n",
"- **Dynamic load balancing** the work distribution strategy is based on runtime values.\n",
"\n",
"Static load balancing is often used in algorithms for which the load distribution is known in advance and it does not depend on runtime values. On the other hand, dynamic load balancing is often needed in problems in which the work distribution cannot be predicted in advance and depends on runtime values.\n",
"\n",
"\n",
"\n",
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> Using a cyclic partition for Gaussian elimination, is a form of static or dynamic load balancing?\n",
"</div>\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "a6741a25",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"It is a form of static load balancing. We know in advance the load distribution and the partition strategy does not depend on the actual values of the input matrix\n"
]
}
],
"source": [
"ge_lb_answer()"
]
},
{
"cell_type": "markdown",
"id": "e151fb8d",
"metadata": {},
"source": [
"### Data dependencies\n",
"\n",
"Using a cyclic partition, we managed to distribute the work uniformly. But we still need to study the data dependencies in order to implement it efficiently.\n",
"\n",
"Look again to the algorithm\n",
"\n",
"```julia\n",
"n,m = size(B)\n",
"for k in 1:n\n",
" for t in k:m\n",
" B[k,t] = B[k,t]/B[k,k]\n",
" end\n",
" for i in (k+1):n \n",
" for j in k:m\n",
" B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
" end\n",
" end\n",
"end\n",
"```\n",
"\n",
"Note that all updates on the loop over i and j we do the following update \n",
"\n",
"```julia\n",
"B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
"```\n",
"\n",
"As we are using a row-wise partitions, the CPU that updates `B[i,j]` will also have entry `B[i,k]` in memory (both are in the same row). However, `B[k,j]` is in another row and it might be located on another processor. We might need to communicate `B[k,j]` for `j=k:m`. This corresponds to the cells marked in red in the figure below. These red entries are the data dependencies of this algorithm. The owner of these entries will send them to the other processors. This is very similar to the communications seen in previous notebook for Floyd's algorithm. There is a key difference however, in the current case we do not need to send the full row, only the entries beyond column $k$ (the red cells in the figure).\n"
]
},
{
"attachments": {
"g30822.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "44639340",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g30822.png\" align=\"left\" width=\"300\"/>\n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"id": "cf189776",
"metadata": {},
"source": [
"### Implementation\n",
"\n",
"The parallel implementation of this method is closely related to the Floyd's algorithm. But there are some differences.\n",
"\n",
"At iteration $k$,\n",
"\n",
"1. The CPU owning row $k$ does the loop over $t$ to update row $k$\n",
"2. This CPU sends the "
]
},
{
"cell_type": "markdown",
"id": "9c553ada",
"metadata": {},
"source": [
"The computation of the complexity of computation and communication is left as an exercise.\n"
]
},
{
"cell_type": "markdown",
"id": "6b17aee4",
"metadata": {},
"source": [
"1. **Block-wise row partitioning**: Each processor gets a block of subsequent rows. \n",
"2. **Cyclic row partitioning**: The rows are alternately assigned to different processors."
]
},
{
"attachments": {
"fig-asp-1d-partition.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "c518f863",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig-asp-1d-partition.png\" align=\"left\" width=\"400\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "746e37f6",
"metadata": {},
"source": [
"### Block-wise partition"
]
},
{
"cell_type": "markdown",
"id": "102d6fa2",
"metadata": {},
"source": [
"To evaluate the efficiency of both partitioning schemes, consider how much work the processors do in the following example. \n",
"In any iteration k, which part of the matrix is updated in the inner loops? \n",
"\n",
"### Block-wise partition"
]
},
{
"cell_type": "markdown",
"id": "d9d29899",
"metadata": {},
"source": [
"It is clear from the code that at any given iteration `k`, the matrix is updated from row `k` to `n` and from column `k` to `m`. If we look at how that reflects the distribution of work over the processes, we can see that CPU 1 does not have any work, whereas CPU 2 does a little work and CPU 3 and 4 do a lot of work. "
]
},
{
"cell_type": "markdown",
"id": "6409890d",
"metadata": {},
"source": [
"### Load imbalance\n",
"\n",
"The block-wise partitioning scheme leads to load imbalance across the processes: CPUs with rows $<k$ are idle during any iteration $k$. The bad load balance leads to bad speedups, as some CPUs are waiting instead of doing useful work. \n",
" \n",
"### Data dependencies\n",
" \n",
"\n"
]
},
{
"attachments": {
"fig-asp-data-updated.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "a67e0aad",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig-asp-data-updated.png\" align=\"left\" width=\"250\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0565e92",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c, or d \n",
"ge_dep_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "866824c6",
+66 -15
View File
@@ -682,7 +682,7 @@
},
{
"cell_type": "markdown",
"id": "bfede7cc",
"id": "4c2e0010",
"metadata": {},
"source": [
"We are going to implement the method in a function with the following signature\n",
@@ -697,15 +697,36 @@
"\n",
"- On output, only the value of C will be correct on rank 0. It will not be efficient to try to write the result on all ranks.\n",
"\n",
"- The parallel function takes an MPI communicator object. This allows the user to decide which communicator to use. For instance, `MPI.COMM_WORLD` directly or a duplicate of this one (which is the recommended approach).\n",
"\n",
"- The parallel function takes an MPI communicator object. This allows the user to decide which communicator to use. For instance, `MPI.COMM_WORLD` directly or a duplicate of this one (which is the recommended approach)."
]
},
{
"attachments": {
"g3642.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "99554811",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g3642.png\" align=\"left\" width=\"300\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "075ee09d",
"metadata": {},
"source": [
"The implementation of the parallel function is given in the following code snipped:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "544466a6",
"id": "37863d46",
"metadata": {},
"outputs": [],
"source": [
@@ -720,7 +741,7 @@
},
{
"cell_type": "markdown",
"id": "ce656413",
"id": "c6cdae12",
"metadata": {},
"source": [
"In the following cells, we discuss the implementation of the helper functions `distribute_input`, `floyd_iterations!`, and `collect_result!`."
@@ -728,7 +749,7 @@
},
{
"cell_type": "markdown",
"id": "7beadf8e",
"id": "627378c3",
"metadata": {},
"source": [
"### Distributing the input matrix\n",
@@ -737,10 +758,25 @@
"send the pieces to all other ranks. This is done in the function below. We start by communicating the problem size N to all ranks (at the start only rank 0 knows the problem size). This is trivially done with an `MPI.Bcast!`. Once all ranks know the problem size, they can allocate space for their local part of `C` , called `myC` in the code. After this, rank 0 sends the pieces to all other ranks. We do it here with `MPI.Send` and `MPI.Recv!`. This can also be done with `MPI.Scatter!`, but it is more challenging since we are using a row partition and Julia stores the matrices in column major order. Note that this algorithm can also be implemented using a column-wise matrix partition. In this case, using `MPI.Scatter!` would provably be the best option.\n"
]
},
{
"attachments": {
"g5958.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "d1ddc881",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g5958.png\" align=\"left\" width=\"300\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d7ca1516",
"id": "7efe441c",
"metadata": {},
"outputs": [],
"source": [
@@ -784,7 +820,7 @@
},
{
"cell_type": "markdown",
"id": "661b5b3e",
"id": "72d82138",
"metadata": {},
"source": [
"### Running Floyd's updates in parallel\n",
@@ -799,7 +835,7 @@
}
},
"cell_type": "markdown",
"id": "18a9f60f",
"id": "6abd8c34",
"metadata": {},
"source": [
"<div>\n",
@@ -810,7 +846,7 @@
{
"cell_type": "code",
"execution_count": null,
"id": "138c77eb",
"id": "52961b52",
"metadata": {},
"outputs": [],
"source": [
@@ -853,7 +889,7 @@
},
{
"cell_type": "markdown",
"id": "ad1c3fca",
"id": "54081b85",
"metadata": {},
"source": [
"### Collecting back the results\n",
@@ -861,10 +897,25 @@
"At this point, we have solved the ASP problem, but the solution is cut in different pieces, each one stored on a different MPI rank. It is often useful to gather the solution into a single matrix, e.g., to compare it against the sequential algorithm.The following function collects all pieces and stores them in $C$ on rank 0. Again, we implement this with `MPI.Send` and `MPI.Recv!` as it is easier as we are working with a row-partition. However, we could do it also with `MPI.Gather!`."
]
},
{
"attachments": {
"g7043.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "a0fb6974",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g7043.png\" align=\"left\" width=\"300\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c12fd15d",
"id": "8c725aa9",
"metadata": {},
"outputs": [],
"source": [
@@ -893,7 +944,7 @@
},
{
"cell_type": "markdown",
"id": "cbca58aa",
"id": "d573108e",
"metadata": {},
"source": [
"### Running and testing the code\n",
@@ -904,7 +955,7 @@
{
"cell_type": "code",
"execution_count": null,
"id": "2daef9be",
"id": "c8e9cea7",
"metadata": {},
"outputs": [],
"source": [
@@ -1042,7 +1093,7 @@
},
{
"cell_type": "markdown",
"id": "7c8a16e4",
"id": "fb21edc4",
"metadata": {},
"source": [
"## Summary\n",
File diff suppressed because it is too large. Load diff

Before

Width:  |  Height:  |  Size: 6.6 MiB

After

Width:  |  Height:  |  Size: 6.7 MiB

File diff suppressed because it is too large. Load diff

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 445 KiB