diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json
index 760f83c..18cf9fe 100644
--- a/dev/.documenter-siteinfo.json
+++ b/dev/.documenter-siteinfo.json
@@ -1 +1 @@
-{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-16T20:06:15","documenter_version":"1.7.0"}}
\ No newline at end of file
+{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-19T08:50:08","documenter_version":"1.7.0"}}
\ No newline at end of file
diff --git a/dev/LEQ.ipynb b/dev/LEQ.ipynb
index c376ec0..b406795 100644
--- a/dev/LEQ.ipynb
+++ b/dev/LEQ.ipynb
@@ -22,7 +22,7 @@
"In this notebook, we will learn\n",
"\n",
"- How to parallelize Gaussian elimination\n",
- "- How to fix static load imbalance"
+ "- What is load imbalance, and how to fix it in this algorithm"
]
},
{
@@ -45,24 +45,69 @@
"using Printf\n",
"function answer_checker(answer,solution)\n",
" if answer == solution\n",
- " \"🥳 Well done! \"\n",
+ " \"🥳 Well done!\"\n",
" else\n",
" \"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\n",
+ "println(\"🥳 Well done!\")"
]
},
{
"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",
+ "\\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].\n",
+ "$$\n",
+ "\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. $A$ and $b$ are given, and $x$ is unknown. 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",
@@ -87,51 +132,97 @@
"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 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",
+ "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. For this reason, we will study here the triangulation step only."
+ ]
+ },
+ {
+ "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]$. The augmented matrix in the example above is\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]\\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",
+ "\\right].\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]$. These are $A^*$ and $U^*$ in our example:\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",
+ "0 & 1 & 2 & 8\\\\\n",
+ "0 & 0 & 1 & 4\\\\\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",
- "\\end{matrix}\n",
- "\\right]\n",
+ "\\right].\n",
"$$\n",
"\n"
]
@@ -142,9 +233,13 @@
"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. The result is given by overwriting `B`, avoiding the allocation of an additional matrix.\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 subtracts 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."
]
},
{
@@ -172,13 +267,28 @@
"end"
]
},
+ {
+ "attachments": {
+ "g27851.png": {
+ "image/png": "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"
+ }
+ },
+ "cell_type": "markdown",
+ "id": "cc6ce65e",
+ "metadata": {},
+ "source": [
+ "
\n",
- "Note: This algorithm is not correct for all matrices: if any diagonal element B[k,k] 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 pivoting. \n",
+ "Note: This algorithm is not correct for all nonsingular matrices: if any diagonal element B[k,k] 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 pivoting. We are not going to consider pivoting here for simplicity. \n",
"
"
]
},
@@ -203,6 +313,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",
@@ -220,17 +340,15 @@
"\n",
"```julia\n",
"n,m = size(B)\n",
- "for k in 1:n\n",
- " for t in (k+1):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",
- " B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
- " end\n",
- " B[i,k] = 0\n",
+ "for t in (k+1):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",
+ " B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
" end\n",
+ " B[i,k] = 0\n",
"end\n",
"```"
]
@@ -262,72 +380,50 @@
]
},
{
- "cell_type": "markdown",
- "id": "14d57c52",
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1169c86e",
"metadata": {},
+ "outputs": [],
"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 in 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": "iVBORw0KGgoAAAANSUhEUgAABL4AAAI0CAYAAAATGeCIAAAACXBIWXMAAB7CAAAewgFu0HU+AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAIABJREFUeJzs3XmcXFWZ//HvU1XdnU5nIyEhCYRVGBYBWRwQERFk2JRVUBxEXAYXXEcUB3QE11FREcF12BQFQWRRGJBNVFBQdhAwkIXsezq9d1Xd5/fHrfzsVN1Oeq17cvN5v155Kae2p+69ffv09557jrm7AGy+zOxsSVdXNX/N3S+oYw3Nkjqrmue4+y71qmFzYmbtklr6NLW5+4S06gEAAEA2mdmnJX2jqvk8d/9WGvUAaSikXQC2XGZ2uqRJfZpud/elI/Teh2tgx3e7pF5JayV1S+p097UjUQMAAACyzcxOkbR1n6Y73X3hCL33oZLGDOCpHZJ6FPdnexT3Z9eMRA3YcpnZREn/lfDQbe7+53rXAwwHwRdSYWY5SVdpw1Evz0kakeBL0i3aMFQbMDNbJ+kFSX+X9Lyk+yQ97gyPBAAAwIZ+KGlqn/8+RtKIBF+SfiFp1lBeaGZtkl7UP/uz90v6K/1ZDMJ4SecntC+URPCFzQrBF9JyqDYMvUIyQdK/Vv6tt8DMbpf0fXf/ezplAQAAIBRmtr82DL1CMl7SgZV/6y02s99I+oG7P5VOWQBQf7m0C8CWx8yaJH0t7ToGaZakcyU9Y2a/NLM90y4IAAAA6TCzBtXOmxS6mZI+IOkJM7vFzPZNuyAAqAeCL9SVmc2U9FtJh6RdyxDlJJ0u6XEz+5SZWdoFAQAAoH7MbKqkX0s6Mu1ahsgknSTpb2Z2oZnl0y4IAEYTtzpi1JjZBMWTfU6TtI+kNyn+JTuQSTpHw/skJQ3rbpHUKGmypB0k7SLp1ZIOUv8/I02SLpH0ejM7w917Rr5cAAAApMnMxkuaImkbxf3DwyWdrPSm7PiokudXGqu4f7qV/tmf3UvSwZIa+nmvgqQvSzrUzE519+oVurFl65D044T25+pdCDBcBF8YFWY2W9Kr0q6jyovu/thAn1xZyeTNkj6k/q/onSzpDjN7q7t3jUCNAAAACICZPSHpNWnXUWX2IPuz4xX3Y89RPPF+0t0Kx0j6nZkd6+5tI1MmNneVlUE/kHYdwEjgVkeMls3+2HL3Vne/2d3fLOm1ild3THKkpCu57REAACBTstCfbXP3W939OEn7Sbqzn6e+XtJ1lZXXASBTOLEBA+Duf5N0lKSPSColPOUMSZ+oa1EAAADAALn7U+5+vOLpP5Km6ThB0oX1rQoARh+3OmK03KB4fq/+nKR47q/Nhru7pCvMbK7iCU2bqp7yZTO71d3n1r+6gTOzaZK2U7yyT0HSMknz3H1JqoX1ozLh6s6Kj5epklzSCklLFdcd1bGOrSv/xkhaK2k5twQAAJBZN0v6y0YeP17StnWqZcS4+1WV/uxvFc8N1tfnzOxX7v58CqVtkpmNUdwXmyqpLGm1pBVZnG/XzJr1z75nJr+rmTXqn98xr39+R+abw4gi+MKocPeNXi0ys320mQVf67n7nWb2QUlXVz00VtK3JJ1S/6o2rhJ2fVjxyLTd+nnO3yT9QtIP3L27juUl1VJQHI6erHjeicn9PHWZmd2hOIi8sxJOjmQdhyju1B6t+PaAmlGyZjZPcaf4Pkm3uPuqkaxhE/Vto3ikYfVttt2SvkGnAQCAoXP3L27scTO7R5th8CVJ7v6AmZ0t6ZfasB/RKOm7kv4tjbqqVYKuExTXc7Tii7fVSmb2tOJJ/++QdK+7FxPe61TF05f09aK7V/fph1Ln8ZLeUNX8F3e/dRDv0awNv2vSsVXs811/K+n+pO86UszsI6rd5l9z99Yhvl9e8Xc7VvH3TPq7JDKz5yU9Iun/FPfx6dNiWAi+gCFw92vM7C2STq166EQz+xd3fzGNuqqZ2ThJn5J0nqRxm3j6gZV/55jZe909acWgUWdmR0u6XANbHGEbSe+t/HvSzD7g7o+OQA2vl/QVSW8cwNN3rPx7h6QfmNndkr7r7vcMt46NMbOtJd2reIWpvroknUQHAQAAbIy731QJbN5d9dBRZra/uz+eRl2SZGYNivt3n1Ny2NVXQdL+lX/nSlptZtcp7o/N6fO8LknnV722s3LHxpph1JqTdJniOxT66m9xrOrXNyq+/fRCbTpIbZB0QOXfRyStMrOfSbpslO46ebfivw/6ulzSoIKvylzIp0r6oqQ9NvH0nOIVSfdSfAx0mNmvJF3q7k8O5nOB9ZjjCxi6/5RUfYUlJ+ljKdRSw8wOlvS0pIu06dCrr90l3W9mR4xGXRtjZp9RfGVnKCuCvkbSn8zsXcP4/LyZXSrpTxpY6FWtoHiE2O/M7KKh1rEpZraVpHuUHHqd6O6/G63PBgAAmXK+4v5DtY/Xu5D1zGxbxaPpf6hNh15JJivuj//DzPbt036XpJernjtW0tlD+Iy+jlFt6PWcpAc29UIzm6V4ZNP3NbTRg1MUj/6fbWbV/cIgmNkExaPTbtKmQ68kLYoDuCfM7OSRrA1bDoIvYIjc/RXFt9hVOymAFR5PlvRHSTsN8fVjJN1mZnVbwtvMviHp60peZluK5zZYqnhOsv5uaWyQdK2ZDXqhgcpy37dr5Dp6LSP0Phsws4mS7lbt8uqdkk4Y7ZFmAAAgO9x9meKpLqq9tTL1RF2Z2f6SHlU8emu48pKa1/9HZV7YHyY874PD7Lufm9B2+aam4DCzAxWHXiPR384r7r8Hxcx2kPSQpONG6C0HczEf+P8IvoDh+XlC20yNzC/r4dhdtbcyr5V0naTPSnqXpLMq//9+xaFStXGSflKPZa3N7CxJn054qFvSpZJeJ6nR3We4+3TFAdfhkn6i2lU2TdK3zOyoQXx+QdKvlPxLuaz4CtW/S9pT8VXEqZL2lnS64rnelg/0s4ajcuvqnaqdn2J96HVvPeoAAACZktSf3UrS6+tZhJntJul3ivvS1ZZL+rbieaF2kjRB8WiwgxQHT3creaXKalepdoTbbpLePMSad1Y84quvtZJ+tonX7a74u85IeHiZ4nmDj1I8ncb673qwpI9WXhf8BPdmNkXJdyhIUrukHyue02w3xd9xhuJbON+jeGGJ9vpUii0Bc3wBw/N7xbc7NlS1HyzpsbpXk+yvkr6qeGLI3oTHv14ZBn6dan8xHSjp/Yp/MY0KM9tJ0vcSHnpa0inuXj0kXe5elvSgpAfN7PuSbpW0Q5+n5CRdY2b7DHCy+c8peRLXRyS9392fTXhspaRnJd1UmYfi3xUHif8ygM8bNDMbq3iY+CFVD3VKequ73z8anwsAADLvIUkdqh2tfrDi/taoq8xz9UvFt+5Vu0zSfydMqN4maZHiEWLfryz685+SPiRpfNLnuPtqM7te8dxRfX1YcUgzWB9S7WCSq9y9o78XmFmTpBsVh4vVLpX0BXdfV9W+/rs+IulyM5uueB7fDyrcUVBXSto1of1Xkj7u7our2tsU393xuOJ+/HjF++U/tZkuioZwMOILGAZ3b5OUNJH9nvWuJcFixZOc/6u739pP6CVJcvenJB0hKWlSzNGe4+Griq/y9PWCpCOTQq9qlUkuD5e0pOqhmYonCd0oM3uVpAsSHvqdpCP6Cb2qayi6+zWK9/snlTxXxpBVVjS6TbXzjnVIeguhFwAAGKpKH/GZhIfq2Z/9mJJv+fuku398IKsIuvsydz9f8XxbN27kqVcktL2lMt/WgFVWYXxPVXOkeL6ujfmk4jsH+nJJH3P3TyaEXjXcfam7f1rSLopHRwXFzE6UdGLCQ5dLOj0h9Krh7m3u/nXFI/y+q3jbAkNC8AUM3+yEtqSleevpAUmvdvfbBvoCd1+h+KpVtT0r8y2MuMrkpdUrY0aKR1mtHOj7uPs8JS8q8N7K1aKN+ZxqR+wtlPT2wa6M6O6Ru18qaT/FV+SGrXIF9GbVDsHvkHS8u29y4lQAAIBNSOrPJo3WGXGVAOmzCQ9dU+lXDYq7r3T3t0t6u6Sakf+V1SqrVy8vSDpnkB/1DtWOULtzYxduzaxF0mcSHrrS3ZPugNgod1/u7m+T9E5JQ16ZchRcnND2R8UjvTY691k1d+9090+o/4v0wCYRfAHDtyyhbVLdq9jQX4ayLLO7363kWzTfNvySEp2j2tDpN+7+0GDfyN1/pfi2zr4mKp7PLJGZTVLcKar2CXdfO9ga+tTyYqWeYancQvlL1c491i7pOHevy+0HAAAg85L6s0m34o2GU1UbIK1VvFrhkLn7je6eFOhJyaOy3l+54DhQH05o21R4dZpqt+tqxbctDpm7Xz+QOyXqobKy/L5VzesvbA951Ja7P+jufxpWcdhiEXwBw5c08eKmRhmFLGmlygNG6bOS5tW6bhjvl/TajU1yf7hqV8BZovi2wlSZWV7StZJOqnqoQ/FE9n+of1UAACCjkuakqld/9tiEtp8P5PbGYbhRtWHfdEmnDOTFlXDnwKrmf2jT84QlfdefDeT2xs1I9WT/knSPu/+j7pUAFQRfwPAlrYi4OS8ckbQy4Egss7yByrxV+1U1u+JVeYbqjoS2QzayRHX1nFmS9Et3r14psq4qK2leI+mMqofaJB3D7Y0AAGCEJfV96tWfPSyh7YbR/MDKvGZXJjyUNO1HkqTnXTaA2/jq/l1TkPQdr697FUAfBF/A8FWvgCNJm/NVmxcS2qZVliQeSa+R1FTVNreyYMBQzVEcDvU1TfGkmEkOTWh7dBifP2yVkO4nks6seqhN0rEM8QYAAKMglf5sZXXv7aqaS4pX9httP1LtBezDzKx6lfMNmNlUSadXNa+T9NNNvG5XxaPK+uqV9MSmS908VKbpODjhoerpSIC6IvgChi9p/oPRHJo9qipDrVckPDTS8zzMTGhLCt0GrHKVLWmVzW37eUl1R0uSnhpODcNRCb2uUO0S2+sUj/Qa9NxnAAAAA5BWfzapL/aPwS4wNBTu/oqk3yQ8lDR3V1/vVe1UGdcM4OJt0nd9wd17NvG6zckUSc1Vbd0aZh8fGC6CL2D4dk5oe6nuVYyspI7OhBH+jNHqYCVNSt9faDc5oa1m9Z86+rZqh863Kw69Hk6hHgAAsGXYJaGtv4nhR1LSHQUDXtl7BFyR0PYuM0vs91amo/hAVbMrebL8aml/13pI+o6rhzOpPTASCL6AYaj88tsj4aFn613LCKvHhP1JYdRwbnPc2HvUfJaZjZOUtHJPKqP1zOx/lLx6UbNqh8UDAACMpD0T2p6rw+cm9QfrOWXIfaodjTROtVNOrHe8aqfQuMvdk+44qJb2d62HLeE7YjNE8AUMz2skTUpof6TehYywfEJb1wh/Rn8Tzg9X0qSiSZ/V3/lvU5OSjobxks7v57G8pOvN7Ig61gMAALYQZrabkqegqEd/NqmPVre+WGWajB8kPNTfJPfnJrRdPsCPS/W71klS/zpr3xGbIYIvYHhOSmhbqpQnSB8BExPaRnoo9pqEtpEYVZY0ND3ps9okFQf4+nqrnuuhSdKtZvbaNIoBAACZltSfXSvpwTp89uqEtqR+6Gi6VrV3O7zazDZYnbAyOf2/VT1vtqS7Bvg5IXzX0ZY0ZUjWviM2QwRfwBBVVi15T8JDt2TgPvakYcojPfdVUhiVNHpusJLeo+azKlf4kjogI7165WC44tsdT1S8yk9f4yXdaWZJtyIAAAAMWmXajvcnPPQbd0+6QDjSkvpiSXOwjhp3b5V0XcJD1ZPcf0i1o7auGES/P/XvWgdJ33GrynEGpIYDEBi6D6t2dRbXwIc7B8nMZql25NU6jfz9+UsT2pLmSxuwyi/Vf0l4aEk/L0kaxbbvcGoYhrKk/3D377r73ZLeLam6I7W1pLvNbIe6VwcAALLoPZJ2TWi/rE6fn9QX+xczq141cbQlTU5/splNlyQzGyvp7KrH2yVdM4jPSFo1fQ8zS5pzdnO1WrX912YlH2NA3RB8AUNgZrtIujjhod+6+9/rXc8I2y+h7fHKCKmR9LhqbzXcwcz6W4FxIHZRbWi3Sv2vsvlMQlsatxNGks509yvXN7j7DZI+nvDc7ST9zsym1as4AACQPWa2naSvJTz0gLv/rU5lzJbUXdXWoHge3bpx92ck/aGquVH/HA33TtXeEfHTymixgfqHakf0N0naZxDvETR371H8PasxXQdSRfAFDFIlmLlZtfer90r6TP0rGnEnJLTdO9If4u5dkp6oajbFq+UM1VsS2v68kdDu4YS201IYjt1RCbo24O6XS/piwvN3k3SXmTFnAgAAGDQzGy/pV5KmVj1UlvSpetVRuZ3yrwkPvb1eNfRxRULbOWZWUO2k9oO+y6MSCiUFiml819GU1L/O2nfEZobgCxgEM9tW8bLHSbfDfcPdq5dD3qxUOkGnVzW7pF+P0kfel9B21jDeL+m1GwvtfqPalWa21/DCtxHl7l9Q8mpD+0m63cya61wSAADYjJnZNpJ+J+mghIe/5+7VFyZH220Jbe+q9Evr6RZJi6vaZikeFVc9Au1ed39+CJ+R9F3PMrOWIbxXqJK+47FmtlPdKwEqCL6AAbDY2yU9qeRbAf+o5JE5m5uvqPZWwbuH+It9IH6k+MpiX0eZ2VGDfSMze6dqOyXtilfqSeTu85Qcvl06nA6Ime1kZqcO9fUJPiLpxoT2wyTdWFloAQAAoF+V/uxJivuzByc85a+S/qu+VUmKJ5avvgVwipJvwxwwMzuxshLjgFRGn/044aHzEtq+N8SyrpLUUdU2TXEffMjM7JTKVCwh+D/Vzq+bV/I8agNmZgeb2aHDeQ9suQi+gI0ws4ZKB+EJSTconly82lxJp9Vp5ZtRY2anqXYYtyR9e7Q+093nK/mq0A/XTyY6EGa2s5LrvNbd127i5V9PaNtZ0k8HO9momeXN7BzFx0tSh3JIKqsFvUvJo9feIukqVssBAABJKv2T4yU9onhUU1Ifa5GkU929er6tUefuy5Q8SfyHzCxpBfWNMrOtzewnkm7V4Ffr/olq56CtNkfSHYOtS5LcfaXiC7/VPmpm7xrs+5nZVDO7UvE0LMOZJ3fEVP4mSuqXH2NmXxrs+5lZi5l9WfFAA0aNYUj4QwmoMLOcmc0ys8PN7Bwzu1Hx6iu3qP+V/l6QdFjlF3ZIjjazYwYShphZo5l9VtL1qj0n3KFRmN+ryoWSOqvadpZ030Cu0pnZvpIekLRN1UMrJH15U69393uVHL6dIunOgVw9qxw7b5H0mOLOzIjPveXuvZJOVvI8GGdKunSkPxMAAGxeKqO6tjWzw8zsfWZ2vaTlkn6r/icYn6u4P7ugboXW+oLiBYn6ykm60sy+VFlVcaPMbKKZfVrxhPnv39Tzk7j7YsV9/435fuWi5FBdImlNVVtO0jVmdtFAprGofNfzFX/X9w6jltFyuaQXE9o/Z2ZXmtkmA0kzazKz9yn+e+tCSYURrhFbEA4ejAoze4ekCRt5SnVIIUknmNleG3nNjQMYvbMxN5pZ0lWsFsWrtkxSPLn6QN0h6ezKlZvQ7K94mPErZnaLpN9Lek7xktEdiq9+7SDp3xTPi5UU7iyX9L5RWM1xA+7+gpmdp9rhz3tKetrMrpB0vbs/tv6BSqB3kOJRUP+h5HPZ+9196QDLOEfSAYpXTOzrSEl/N7MbFHcYn1I8dNsVTwb7aklvVBySjfoVKHdvN7PjFF/x2r3q4Y+a2Wp3v2i06wAAYEtgZm+TNHkjT9k2oe1YM9thI6+5xd1XDKOsq82sK6F9rOIVAgfbn71P0rvcvfrWtLpy96Vm9n7FI5f6Xog1SZ+TdLaZ/VzSXZJeVtxPHat4btZ9JR2reBT8uBEo5wrVznm7Xofi2xWHzN2XVO4QuFEb7quc4gDwvVXfdYXiv1dmKZ7W41jF89GOxHcdFe7ebWb/rnilzOrQ8r2STjaz6xT/vfK84v3ZIGmG4v35ZkknKfluG2DQbJT/psUWysxeVjxqZyTtOdC5psxsjeJf/KNhmaSLJf1wtEOhgTCzsyVdPcJv2y7pLe7+4ABraFbtqK057j6guQbMzBRP4P6BjTytW/G2N8XBadNGnvtVd79wIJ/dp4a9FI9uG/Atlptwibt/up/PalfcgVmvzd03FhRXv357SQ+pNqiTpI+5+1DnnQAAABVm9pSkfUb4bf/V3ZNGbyd9/iuKw47RsFLSVyV9d5ijl0aUmX1I8Wihkboz6XXu/pch1PG0pL0THvqRu39w+GVJZvZRSd/V4ILKjXmtu9esGlkZBfeNqubz3P1bm3pDM/urpAOrmme5+8KBFFS5xfZXksYM5PkDcJa7/2yE3gtbEG51BAZuieLlnXd29x+EEHqNklWSjhxo6DUSPPZBbfzWxDGKR6ltr/5Dr0jSBYMNvSo1PCfpECUvMz0UwxmduFHu/oqko1V7S4AUT8x/5mh9NgAA2KytkHSB4v7sd0IKvSTJ3X8g6TSNTD+qV7UTyQ/UFf20Xz7E96tRuVD5dkmtI/B2Paq9CJ06d79D8eitkbiNNtLIbCtsgQi+gP4VFd8e+E1Jb1B8dePb7h7cL5UE1yi+FXOw4dxvJB3g7o+OeEUD4O6fV3zb4FB+OT4v6Qh3H/IKQO4+V3H49UHF810MVrfiudIOdvdhrc6zKe7+d8VD+qs7dDnFk92/dTQ/HwAAbBZKiudI+o6kN0ma4e5fc/e2dMvqn7v/WtJeiucvHUq/e4ni1dZ3dPdnhljGvIS2B9z92SG+XyJ3v0nxd71MUtItrJuyWPGdKDtW+obBcfeHFI+eS5rHbSDWKt4+/+Lut49kbdhycKsjRoWZfUUjf0/2RQOdf8DMvqPa+8mTdCq+QtKquGOwVtJCxRNFznP30hBrrRsze52ks6uaL3P358zs1ZLerXhS9P5uO+yQdKeka9z9ziHW0KDaK2ArhzLyqvJ+jZLOkHSipKPU/xwGayTdrXg+iFvcvTyUz+unhoLiuQWOVDyP1x79PHWBpL8oDhpvdfdNXokys8u04ai1bnf/+BDrfLPiK6PVuiR9PuSOLQAAITOz/1byPF7D8TV3nzfAz/8fDWylvvX92XXasD/7kqS5m/PK42Y2VdI7FPfFDlM8x2q1kqRnJT2suE/44HD7hGZ2h6TjqppPcfdNTXw/nM+cpg2/a9LfUuu/658Uf9c/bGrUnpn9m6RTq5p/5e73DKCmCxTfcdHXZ929enL+ATGzcYpHuR2u+Hsm3crriifG/4vihQbudveeoXwesB7BF7CFMLNtFE8YP0XSeMVD3RdJesHdh3KFqS7MrEnSbpKmKZ5/yxVfyVsu6cV6hZNmNkbxtpuiOLRqVRzura7H5wMAAGzpzGyC4kBoiqSypNWSlrp70gJWQ/2MPRTf9dF37q35knYZyYusA6hjguKgb7LiwGuNRvi7ps3MWhTvy60l5fXP/TnUW1SBRARfAAAAAABIMrOfSHp/VfP57l49QTyAzQTBFwAAAABgi1e5tXK+pOY+zV2K5/odyvxUAALA5PYAAAAAAEjnasPQS5J+TugFbN4Y8QUAAAAA2KJV5pWdp3hO2b5e4+5P1b8iACOFEV8AAAAAgC3dWaoNvf5A6AVs/gi+AAAAAABbLDMzSZ9IeOh79a4FwMjjVkcAAAAAwBbLzI6VdGdV82JJO7p7MYWSAIwgRnwBAAAAALZk/5nQdgWhF5ANjPgCAAAAAGyRzOzVkp6WZH2aeyRt7+7L06kKwEgqpF0AAAAAAAApKUl6e1XbSkIvIDsY8QUAAAAAAIBMYo4vAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJhfX/x0wflrR9irX0NVGEcgAAhOYJd/0w7SIAM71L0l5p11ExXn361AAAIAgvu+sbkmTuLkky08OSXpdmVQAAIGi/dtepaRcBmOnXkk5Ouw4AABCsh931ekkqmOkd0oOzzHY6wD2UAV8AACA0lnv2WLP8h6Q9FrvrtrTrwZbHTCdJL063XPkYj/ZMuxwAABAos/kHms37tPTGBSZVhnwBAAAMzDJ3TU+7CGx5zLRM0rS06wAAAJuPmvkImlqkxjFplLJx7avnadzkHdMuo18daxd687iplis0pV1Kou725crlG9XYPCntUhKVip3q7VzrYyfOtLRr6U/4x+AiH9My2fINzWmXkqinY6WknDe1TA5yH0flXnW1LVPLpFlpl9Kv9jXzNW7SLMnCnAKxs3WxNzZPtEJjS9qlJOrtWqOoXPIx46YGeQzKXe1rXtG4yTukXUmNnk6ptyvtKoBajc1S09i0q6jVvnq+xm21vWRhnm46Wxd5Y/NWVmgMcONJ6ulcLXf3MS1TgtyAHpXU2bpYLVuFe7dM+5r5apm4nSyXT7uURJ2tS7xxzHgrNI1Lu5REvV2tKpd6vHn8tCCPQalyngmwz7Bex5oF3jxhuuXyDWmXkqirbakKDWPVMGZC2qUkKvW0q7en3cdOmB7wMRjm38e9XXHfta+aEV8HnSjtfXgdqxqgn1042d/1ldXB7vQbv7Jb8Yizrm/YetYBaZeS6P6fvkNTttsv2veI84P8i3nB83fq8bsuLp34yUeCnRz2pxds5Wd9ZbWF2om9+Zv7FF934ncaZu52ZNqlJHr45o8oX2gqHXTit4Lcx6uXPK37rj6tfNoFL4bZQ5T0889vE512wYu5UAPs2y49uLjvEZ9p2HGfU9IuJdHjd1+stlVzim9857VB9sBKxS7dcPGs6MwvrwzuPP3IbdIzv9+giRFfSEX1iK+93yQddEKKBfXjus9tHb3jCwtyhUAvRt3yrf03V+wPAAAgAElEQVR7Dzz2S42z9jw+7VISPfqbz6jU01485G3fD/J83b5mvn57+eHROz4/N7jz9Xq/+MLM8snnPZ5vHh/mqfo333tDac/Xf6iwy/7vTLuURM/cf4mWL3i0eOS7bwzyGFQU6br/nuZnfnllmH+YSLrhSzuWjvnAXYVJ03ZPu5REd//vW6NZux+T2/PQc9MuJdFLj/1csx+9unjsh+4N8xhUuBnNMw9Ij9y+YVuwJ2sAAAAAAABgOAi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZFKhumH+s7dHna0PRmkUszFRuVh45LZPldKuoz+l3o7Cs3+4tNw8bpqnXUuS1Yueyne2LrbutuVBbsO21fOsY+3CfMj7WB4VHrn9vGDr6+1cW3j+4R9FC56/M7ifX0laNvfhvOVywe7jzral6u5YGfR5JvJy4bH/++9SLt+QdimJutYtLcz+60+jZXMfCvIYXD7vz7ne7nXB7mOPyvIoCrK+JS+dmJMO42IZgrPkpQejR267PbhzjkdR4W+//WzJcjVd7SD0dKxsePEvV0WLZ98f3LaTpKVz/piLSr1Bng8lqdjTpt6uNcHWJ0lRVCo8cfcXS/mG5rRLSdSxdmH+pcd+Ea1c8FiQx+CKBX/LdbUtC3ofl4pdQddXLnbnn77v6+WmsZOD/Pu4denz+XKxy9tWzSmnXUuStcteyLWueCnofRzqeXrFK4fnpLdu0G+t+W3sUTlXLvUE17mNSkUvl3rC7D1IKvV2RMWe9nzjmIlpl5KoVOpSsact2G1YKnaqVOoKtj5JKpd6gq6v1NsRFXvbgvz5leJ9bFKw2zAqFeXyYOuTJC+XvFTsKuQ9yD6iSsXOqLd7XcDHYJeKPe1RqPvYo7KiqBTkMeheTLsEING05Qty+7b9Mbhzzj+62/zVTz9UKAR6c8XCtlXRti8/mdtpwYIgC+zpmq/uqOj7dv4xuPOhJLVHPZrX3en7PhlmfZL0Umer7/bMw4Vxuca0S0m0pG1FtE3XM7ndFy8P8hh8qmuRVpTbo5D38exiUSHXt6CzzXd/4bH8hNyYtEtJtLx9uW/d0W37LF8X5DZ8qWeFOntXBn2emV3sDbK+v/fsoKVVbTVF7rjPydr78JPrVNLAvfz4L3TIqZenXUa/Fr7wu/J+R30ut/WsA9IuJVF3x0pN2W4/3/eI8y3tWpIseP5O9XSsLh9y6uXB/eCs99JjP9chp3xPsiA3oZbM+UN5n8PPy83c7ci0S0n08M0fUb7QVD7oxG8FuY9XL3laqxc/FR1y6uX5tGvpz9wnb/KDTvimNTZPSruURCsW/K281xs+kttxn1PSLiXR43dfrLZVc8qHnHp5kJ3sUrFLc5+6yQ859fLgTjKP3CatWpR2FUCtQ8burM9OPS7tMmrc0facf27qMTbGgvyVpye6FpbO3urgxje17Jp2KYm+vvIedZR7SxdNOy7IIc6LSq36a9crftG044I7X6/3u/YXovO3fnN+amFc2qUkerFnWXTGpANzJ4zfO+1SEv1kzcN6qmtx+aJpxwXZZ4gUn2dCPgYf6JhdPnfyYYVdGrdOu5REi4utfljLq+zMSa9Nu5REt7c9o5tanwz2PChJv2l7VhdNC+938P+u2V2Pd23YFuQPMgAAAAAAADBcBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmVSoblgy+wF59Nc0atmocm+Xnr7/G2mX0a/ertX5F//yv1o8+760S0m0ZvGz6m5fbiZLu5REq5c+p/Y18/Mh7+NyqUdPP/DNtMvoV2/H6vycJ2/UyoWPpV1KohXzH1W+oTkX6j7uaF2k3q61wdYnSeVyrz33x8uUL4xJu5REHWsX5uY88UutW/lS2qUkWvLSg+puXx7seSaKSiqXixZifSsWvEnSa9MuA6jxdM8i/XjNQ2mXUaPbi3bVmodVsHzapSRaUWrP/2bdM5rduzztUhI91rVAnVFvPsR9K0lry11qLXdZqPVJUmfUm/vZ2kc1Lt+UdimJFhfX5R5on62lpXVpl5Lozx1ztaLcngt5H/dExSDPf+t1R8XcTeue0OT82LRLSTSnuNJKHZE6vTftUhI93bVY83pXBXselKRiVAryGHy0c2ZNW03w1b52UXnlgseiulQ0GLlcw8oFjxXTLqM/lisU1q18udzTuTq8bSep2NOWt468hboNO9ctyXlUzoVanyTlcoWgj8GoXCy0rphd7u1aG+Qx2Nm2JF9obAn2GOzuWKlyqSfofWxmDasWPlnM5RvSLiWZe6GjdWEkqZx2KUm625fnS72dwR6D7mWZWZDHYNe6PfNilDgCtLbhlWjeuPuCO+c0tnrD/HG/L+bDvN6ofIcX1ox9Jpo39tngtp0kdfR6vuyyeeOWB3c+lKT2kqQ2b5g37r4g65OkxnXesKDlj6XmgnnatSTpbfPCijGtUfO4MI/B5b3Kd5rnQj0GJclXh30MWpsKC5v/XFrXqDCPwQ4vtI9Z7fPGvVxKu5Yka+S5qKxcyPtYa8I8BteU9s+pQxtceaoJvnZ97Zn5vQ8/M7jLUz+7cLIf8e5fBvrXnnTjV3YrvvYtX2vYetYBwW07Sbr/p+/QlO32i/Y94vwgt+GC5+/U43ddXAp5H//0gq38iLNuaJCF2Yu9+Zv7FPc76sKGmbsdGeQx+PDNH1G+0FQ66MRvBbmPVy95WvddfVo55GPw55/fJjrsjKsaGpsnpV1KotsuPbi49+Gfathxn1OCDEgev/tita2aU3zjO68Nch+Xil264eJZUYjH4CO3Sc/8Pu0qgFonzPLcN17rwZ1zpv5C0U8P84bmIH8jSwfcpt7P7K3G42eFt+0k6fy/SW1FFb//Og/ufChJ89ulN/2fohsOD7M+Sdr2BpV/9HoVpjcHmTnosDtU+uAeXnjnzmFeVLnkWenRFSqGuo8jSdv8Qh5qfZK0000qffsgFXafmHYlyU64R9HR2yl37h5hbsOfvyxd/VK4x6AkTQn0GLzk2UhPVd3EGOSJBgAAAAAAABgugi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCpUN0TlkkqlUhq1bFKp1J12CRvhisq9wdboUaQoKgZbX1Qqyj0Ktr71SuWetEvoX+SKyuHuY4/K8ijcfRyVeiV5sPWtF5V6Aq4x7PNgFJXkUTnc+krx+SXE+iIvKKHLAKSu5FJ3Oe0qkvWUJUu7iH64ZL0Bb7tSFPa+7Y0kV7j1rdcThVujSyoGXF/RpUjh1ueV/w21vvV6A97HkcI+zxRdKivc+tYLsb5SVNtmknvfhrG5C3xM7rJ61TRgbeVuG58f45t+Zjp6o5LlLed5C3MQXUe5RwXLW1OuEOQ2LHpZPVHRxgW8jzvKPdaSbwq2vm6PrCB5IdBjsL3co4LlbEyuIchtWPJInVGvTQj4GOyOSjYm0J9hSeqOipa3nBosH2SN3VFRLrfmXGOQ9UlSV1S05gB/Rjqjr1p39LG+TcvcNT2terDlMtMySdPW//fYpkvUMubTwf3MdHTLWprkoSZf3T2yfF7eEGie3dktyWRjmxTcvpUkj6TWTtmkcWHWJ0ldPbIxjXIL9Bjs7JYVClJjIcxt2NEVB8TjmsOsT5LWtMu2CvgY7O2VFQryXJh/mqitU2pskDU1hLkNe4pSb1E2fmyY9UlSa4dsYkt49XX2nKeO7m9ucPar+XX38SmH2/u2aqxfVQN0wMvf8Ed3Pi/QU7f05nnfK146/W0Nrx4zI+1SEn18ya+0V9PM6JzJhwR56vl9x2x9b9WDpZu3f3+gXTBp/5e+7o/sfF6o/QcdP/8HxQunHtNwyNid0i4l0UXL71STFUr/NfXfgtzHL/Qs00eX3FS+Z8eP5NOupT8HvXxJdM+OH8lNyI1Ju5REb3vlyuJ/TD6k4ehxewT5Y3LZqge1sHdN8RszTmpIu5Yk3V7SG+Z8J3p05/OCO09/bcWBunJN2lUAtT58rPTNs8OLl7Z+l6L5/6tcc3hdaknS/p9S75fOUOPxB6ZdSbLPXCu1d6n4/Q8qyPP1/BXS4RcqmvvjcKeNmfkelR//tvLTt0q7kmRvuEClDx2jwjsPC+/nV5IuuVV69B8q3viZMI/BKJKmvVu+/Nowt58k7XiOSnf9twq7b5d2Jcne+mVFx+wvO/e4MLfhzx+Urr5PxXu/GOYxKEmTzwzzGLzkVunT12zYFuzJGgAAAAAAABgOgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCaZ5N63YUL+81FL7ntRWgX1p73cUxiXbyqlXUd/uqLeQpMVopzlgtt2ktQR9eSbVFAhly+nXUuSopet6OX82FxjsPs49GOwM+rNN1uDm1mQx+C6cle+2RrVEOgxWFLZusulfND7uNxTGJtvLEvmm352/XWWe/NNuYLnAz0PdkfFnEnWlGsI8hiUZB1RT74lF94xuK78lVxHdG7fi2XL3DU9tYKwxTLTMknT1v/3tInfjrbd+tPBnXNeWhwVdpmeK1tOQZ6v5y+PCpPHWTR+bJh9hiWrPB+5a9utc0Ger3uL0stLo8Ies3LBna/Xm7M0Kmy/tZULhTD7DPOXRfmJLaZJ4yzIfbx8ree7etx22Cbcffzc/Kiw1w7h1jdvWVSYvpWVxzSGeQzOXer5CWOlKRPCPAbXtHludbvndpkR7j5+fkGY58Fla8/LLV719Q0GeRWqn/TOiQfkTpt4VnAjwU6e/xO/bruzauoNxdkLrytfOPXo/K5NU4PbdpL05eV36VWNU/0dkw4Ichs+2jVf1655pHzFzNODrE8K/xj8j4W/KH14ymGF/Zq3C/IY/M7K+9Wcayp/cPLrg9yGL/eu1JeW3xVds92ZQdYnSae/cpX/aOYZ+ZZcY9qlJPrY4ptKp0/cv3Boyy5BHoM/XfOolpTWlc6f+uYg93Gvl3XGgquDPM/8cPUeuqk17SqAWuN2eltuxiH7BnfOee6qU3ybo67P5wtNaZeS6OVffrA0YZ8zC9N3OTS4bSdJqx/6gUo97eUZR3w6uPOhJHW2LdOcWz4RzTj6+iDrk6S/X/v2aOrh38+PaZmSdimJ5t38ifL4PY/Nz9jj6CC3Yefjv1Bx2QulGUd/Mcj6JNezV53qM47+daD1SS/87N/LU1//5fy4yTulXUqihb/9rI/d7gCb8ZrTgtyG5RfuUevz/1eecfS3g6xPkp658iSfcfStwdXX9eT2Wvzwhm01RW6VH6sdGibXq6YBM7Mg61ovbxZNL0zIh1rj2Fyjtsq3+A4Nky3tWpLM7V2lJit4qNtvve0bJivIDSipIZf3aYXxwf6cTMqPDXofd0VFFSwXbH0Vvl3DJJuQG5N2HYkarOBbF8YFewxOzDerrdwd7D7u9pJMFuR5OtRjDmjZanvN3HX7tMuokcs3+IxXvckKDc1pl5KooXl8NHX7AzVz1yPTLiXRwhfuVqmnPZq565H5tGtJ0r5mvvKNLcFuP0nK5xt9xi6HqXl8mINzG1sm+ZTtXhPsNly14An1drd5qPUpipTPNwS7/SQp3zDGp+10qCZN2z3tUhKNGT/dJ8/Y20Ldhp3rlmrVwr8Fex6UFOwxuGphbVuQV3kAAAAAAACA4SL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMikQnXD9Wsfj/7Y8TNPo5iN6fZi7uyFPyunXUd/VpY6Cp9f/ttoYm5McNtOkp7vWZZ7snuRPdz5cpDbcFWp0xaU1uRD3sc9KuXeE3B9y4tthUtW3htNCPQY/EfvilyTFXIv9iwLchu2Rz1aUWoP+jzT46XcuYt/Wc4Hes1ibu/KwndWPuDXr/1blHYtSeYVV1tX1BvseSaSq9dLQR6Dc4uzctIhlnYdQLXlcx/2J+6+J7hzjrvnn7r3K+VcriHtUhL1dK5pePnx633lgjDP18vmPpwrl3oKT9x9cXDnQ0nq6Wq1YndrLtT6JCmKyrmnH/hW1Ng0Lsh+YWfrkvy8p3/t61bMDvIYXDr34Vxn66Jgj0FJKhe78yHXFxW788//6fvRmJYpQR6DbStm5xa6vKdjZZDH4KrFz1jbqrlBH4NRuRTkMbh07iEmHbXBH0w1wdeeY6blDh27V/2qGqAnuxfpuPF75dOuoz9ziquiN7a8KjezMDHtUhKti3o0szBRh7XsEuQ2/EfvCnW093jI+/ip7sXBH4P/2rxjbufGKWmXkqij9QmNyzfp2HF7BpnaLCq2alGpNehj8O89S/2ocXvkx1jNqTsIi0ut0cFjd8zt2TQ9yG14f8dsrS51RKHu46JHeq5naZDnmTvbpmhRMe0qgFoTFs+27VffEtzPzLNdrb7dn2/PFyzIX3l6qX1pNOnvf8zNang2uG0nSau7F6rHS759a3j7VpI6vEezu9p8+4fDrE+SnutY49v+9Y5cc64x7VISzelY4uM7um37uS8FuQ07epaqt9wR9D5+ttijkOt7uXOdz3zinty4XFPapSSa37HQx7aute0XLghyG5Z7V2lt76qgj8HneruCPAZ7eidokY7aoK3mr6d9x2yn0yfuX7eiBurrK+/10yfuH+zV5h+veaj85pbdc68eMyPtUhI91DlHezXNjE6fuH+QPbDfd8zWE10LyqdP3D/Mv+gl/c+Ke/y0iftbqAfhtWsfKR/W8qrcIWN3SruURH/vWaomKwS7j1/oWaY725+LTp+4f3An7/W+tfJ+P2nCPjYhNybtUhLd2PpE+XVjd8odPW6PtEtJtLTUpoW2phzqebDbS7p01QNBnqdf7p2mP3WmXQVQ640tu+qzU09Ku4wav++Y7V+bfoKFeqHixPk/Ln1g8qGNb2rZNe1SEn195T3qKPeWvrjN8UEOmVtUatVz3df4N6efFGq3UA91zom+MO24/NTCuLRLSXTGgqvLZ0w6sHDC+L3TLiXRT9Y8rKe6Fpe+Of2kII/BSPF5JuRj8I1zv1s+b+sjC7s0bp12KYnOWXS9H9byKjtz0mvTLiXR7W3P6KbWJ4M9BiXp/o5/BHkM/u+avfRs94ZtwXWuAQAAAAAAgJFA8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSQRfAAAAAAAAyCSCLwAAAAAAAGQSwRcAAAAAAAAyieALAAAAAAAAmUTwBQAAAAAAgEwi+AIAAAAAAEAmEXwBAAAAAAAgkwi+AAAAAAAAkEkEXwAAAAAAAMgkgi8AAAAAAABkEsEXAAAAAAAAMongCwAAAAAAAJlE8AUAAAAAAIBMIvgCAAAAAABAJhF8AQAAAAAAIJMIvgAAAAAAAJBJBF8AAAAAAADIJIIvAAAAAAAAZBLBFwAAAAAAADKJ4AsAAAAAAACZRPAFAAAAAACATCL4AgAAAAAAQCYRfAEAAAAAACCTCL4AAAAAAACQSYXqhie6Fup6eyyNWjaqx0u6fm14da3XVu7O/bb9WT3TvTjtUhLN6V2l9qjHxq9tSruURM/3LNXS0rrc/2vn3qP1Kus7gX/3eznJyYUkXIPiFbVgNVXjjY4glHakxcuIrQupbWVcq2PV0VUR7Kpr7HjprKkG25mldqTt8o6o1UorqVZFsBWQa8QoUYEQLoaQkJCc5OSc8172/OFkLTBvqh1nsZ/Zfj7/Za/3j+96nt/7nL2/74aS93iQUS4pON+e0Xznin3fz5aFnU1HmeiW+XuzuOoXu8dbR3uydzxflZovSYb1uPrs7g1ZXPWbjjLRfcOZzuX7vp+dw9mmo0y0Ye6u7Bju65a6x8OMMqxHRc7gpvlfajoCTLRpfluR94fz9bD6zO4b00u36SgT3T/a1/3q3k25d7Cn6SgTbZzbmn3jhWLP612jfZkZzRU5ewfsHy9Un9uzIYd1ppuOMtF9w72dq2c3Z99ooekoE92w/86in03qlP98PDcedtbPfCdHdpc1HWWiLYOd1VWzm9Mt9F2gG+fuyt2DXcWeg0kyqEdFzuBN+x990LWDiq87uptG1dRl44cl0b9Bp1P3r5q6bNB0jkPp9Ovept7Vo3umUtzaJcnuTt2re8lVU7cVuYY7xuksdOpuyXvc7ZY9g4Nueht73xxvncqo6SyT3JO6u6RbVVdNbS5yDR9YSOaqsve46qV/7dQ/DXpV00kmG/Xr3ubehvHs1LeKnMGtc+nuT12VusfjOukUes7c0zmtG2+JU6B7OrePr5q6rLgzp9et+1f3vzjoFnpe1/26d1v/xvHuqZuKW7sk2datu6NOqqumfljceZgkc8NkVPizSa9f92/sXz6c6qZuOsskezvp/aC7c7x3akORM3jb/nTnqrpT8h6Py79v7W3oXzla0ivz+Xhvt+79sLejvmpq07DpLJNsHaYz1y17BlPoOXjH/JM7yUN/eTqo+Hr1k8bd855SF/fz1BEXp77s1+oyX3NI8gufzeDPn1v31x5R5k97Z1+RPOPwjC9YU+Yarr87ecdNGZa8x4d/IvUXfq3uF3oPmzV/l8Gfrk3/9GPLfDh9/TXJ4m49XPesFLnHN+9KXn55RiXP4OpPZvypU9NfOdV0kslO+ocMzl+T/lmPqYucwbdvSDbPZPDhk8vc4/2j5NGfyrjEGTz/ujoXbmw6BRzsZY+tO+9+VnlnzlEXZ/x3p9f96SLvCpO1l2bhbU/L1JmPKg36SeEAABmgSURBVG/tkuQt1yczgww+cFJ552GSbNmbnPaPZZ7XBzzykow+9vy6t7rMF75yymUZvubE9M55fJkzuG5jcu32DD59Wpl7PE5yTOHPx4/7TIZ/+cvpnbCizOfjF3854xccl87rTixzDT9xW/KhWzMoeY9L7WjWbRznguseeq3IgwYAAAAAflaKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJWqpK4ffGFJ78314u6FTeU5pH3DVEt7qX/yJ5sxHKeqqtTdqukkk80OU/U6yVSnzDUcjpOFcaolBe/x3CjV4m65+UZ1qiTpVmVm3DtIprqpSp3B0TjZP0q1rF9mviQZjFP1OqkLPWayME7VSdIrdI/nR0mdsr/HC+MyvyOzw3XV3Oi8B1/aVtdZ3VQefn5VVbYlOfrAvxf312XJovOL+87MD1MtKvieZmGYqttJugWeN0kyN0iqqtw1HNfJ7HyqZYvLzJckg9H/uWco9KZhfpCq2y33nmF2IelUqRYXfF84M5dqecEzOBqlqjqpO4XO4OxCqn436Rd6XzgYJcNRqumpMvMlyb75VEsXlZdvbvDmzM6/5yGT1/vxD7396anOe8rDF+qndcTFqXeck0K/NskvfDaDi09Nf+0RTSeZ7OwrkmccnvEFa8p8y2/93ck7bsrwmhcdPJOlOPwTqbefk1LvH7Lm7zL48+emf/qxZX5PXn9Nsrib4bpnlbnHN+9KXn55Rptelm7TWQ5l9Scz3vSydFZONZ1kspP+IYPz16R/1mPKnMG3b0g2z2Tw4ZPTbzrLJPtHyaM/lfH2c8o7p8+/LrlwY9Mp4GCvPzN5z6vKO3OO/J2M7/qbdKYLPa+fcV4W3vmKTJ35zPLWLkku+Eiyd38GH3hNmef1lu3JqW/NePNF5Z3XBzzi3IxufG+6q1c1nWSyk/84wz84I71zTilzBtd9Prn2+xl8+oIyZ3A8To7+vdQ7Plbm+iXJY38/wy++Lb0Tjms6yWQvelfGZzwjndf9Rplr+Ikrkw99NYOvvKPMGUySw1+Z+v6Pl7d+6z6fnP/hh14r9rAGAAAAgJ+F4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGilKqnrB184YtH5o5VT68ZNBTqUHfPpH7kog6ZzHMquhfSW9VL3Oxk1nWWSXQvpLeokS3oZNp1lkrlxOnPDdFdOlbvH98+nf0ThM7i0l3qq0BncPpfe0n6ypFvsDFb7BumVvMc759NftSjDKql/8qcffrsW0lvSS72o0BmcGaSbKtXyQs/BOql2zpc5gzvmL+zuXnjTg38s21bXWd1YIH5uVVW2JTn6wL+XTP/leOnSPynuzNkzO+gvX9Iv9rzeu3+ht2hqqu53yzyvZ+cG3VTdasmiTpHn9biuq72zg95hS6eKO68PmJkd9JdO94edqtwZnOpP1VO9Mmdw/8KwOx5X1dLF3SJnMEl275vvr1i6qOgZXLK4P+p2Uly3kCQzs/O9qf6iLOqXeV+4MBh1FoZ1Z9l0r8h8SbJ730J/RYHn4Oz+13f27Xtb98HXej/+od97Yt393Sek++PXm3bq+tSfPT39pnMcyllfzehP16Z74soy36L7o+uSE1amftUTy1zDb2xL/nJTxh9/fpn5kvJn8OyvZfSmp6T77KPKnMF3bEiW9zL6w6eUuYabHkj+6PqMS97jf//F1B89Jb1lhSZ81dcz+t0npPsrjyhzBv/XpuSefRm9c22Ze7wwSn79n8o8Z967sc5Hb206BRzskU/5zc5TT/13xZ056z/wK/Xzfnd9r9OdajrKRF/72G+PTnzeH3RXP+55xa1dkmy88i8yHOwbPe1X31rceZgks3vuzT9f8h/rk89dX2S+JPnHD75g/NyzL+4tWnJE01Em+udLXj1+3NN+q3PcCWcUOYM/uO4j2bl14+g5L35PoXtc57L3n1affO5XCs2X/NNfvWj0zLPe11226jHFdQtJcvXn3lAf8/jnVY9/2suLXMO7blmfO7596ejkl3+wyHxJ8oX3Pb/IGfzBdUfl21c89NpBxdex08maVQ9Ton+Dqioz1wHdKuMnHJZuqRkPm0pWL069ZlWqprNMcve+ZEk34zWrynxgPuCpq1LmAibpVRk/bnm5M7h6OlncTV1qviSZ6pSdL0n95JWpVpb5HJVFnYwfvazcGTxmOpkdZrxmVXk/7iTJ/h/95l3kOX3U4qYTwGSLlx2Vwx9xVNMxJqlXrv7FqtefbjrHRJ1ef7R81WO6hz9iTdNRJlq87MgM5xePD3/EmiLP66npFam6/frwR6wp7rw+oEpVrzzmxEwvL/Pl3E5/8XjpyuM6pc7gkuXHZu8DdxU7gxmPU1WdlLp+SZJOVR921BOz8ugTmk4yUW/x8nrJYcdWpa7hzq3fztSipeXOYJKqqoqcwSWHHXyt6JIBAAAAAP5vKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtFLvxy985NbkG/c1EeVft3eQnHV50ykObetsen/4zeTIxU0nmeya+5Lrd6S6ZkfTSSb74Wzy3QfSLXmP9w2TlxWcb8u+9P74huSRS5pOMtkNO5I66d4+03SSyXbNJ3fuS6fkGdwzSHXO15PFhf5ksWlPuu/6VvLx25pOMtnGXcmehfRK3eNRncyNUpWYb+OuphPAZDvuuiEbr/znpmMcpK7rzi3/8v5UnYNutYswmNvd37Lx77N7+w+ajjLRjrtuyGg439t45V80HWWihdldGc7PdErNlyR1Pe5suvqv0l+0vOkoE83t3d69e9OXsn+mwAfPJPdu/pfs3XVHsTOY1BkNF6py8yXj4UL3B9d9NNPLjm46ykR777+j2nrblRmPBk1HmWjH3Tdm7wN3FzyDyXg8KnIG7719bZKTH3LtoL/GT3hSctpTH65IP73LL0512q81neLQbrw0ee5JyaOObDrJZHdenhx3ZKrT1jSdZLJb7k7uuzEpeY+v+GTZM/itf0ie88zkicc2nWSy+69O+t3ktGc3nWSyrTuT711e9gx+4zOpTj0tmZ5qOslk31mfau2TkzWPbTrJZPM3JffPJKed0nSSyYajH+1xiTO4+5vJrd9uOgUcbNGdN2fFtouajnGQev/uevnlf111qzJ/qaj33ZPejV/IiqnySsMk6cxtzbAeZcWOnU1HmWh2vJDx7AP1iq9eVDWd5VDGe+/P0q9/NNOdftNRJtu3JZ3dD2TFpuuaTjLR9vntqUezWfHV8s6XA6qFsvP1Zndl+VWfztJumTeu1eyWVDu3ZsVtG5uOMtGehV2pB7uK3uPOfJkzuGvh3PzE4ut5T07e8MKHK9JP779ekvoNL0yxf1zetz7Ds09Of+3xTSeZ7KpNydOPz/gNLyzzP29df0Ny4+0ZveGFB89kKf7kk6n/85mpqkKn8K+/nOF/eE76pxdabn7/h8mifrl7fPMdyeeuyfgNL0y36SyH8qd/m/F/ekE6K5c2nWSyi7+e4W+sTf+sk5pOMtmuvcnt2zJ8wwtT5FPA/oXkv/1tmef0nduTrym+KNCvLv2F/NFRL286xkGeddt76r849jerxVWRf/Lyki0XDd545KlTpy19YtNRJvqzHV/OvtHC8B3HnFnkeX3PcHfOuevD9fuPfXmhd4XJL9/+3vGfHfOS7lG9ZU1HmegVd31o9IqVz+y9eHmBb1wk+atdV+Vb+384fN+xv1nkDI6TPOe29xQ9g8/f/D9G/+XoM3rHT5X5Zsjv3/PJ+pSlT6heufJZTUeZ6O9nvp3P7N4wfP+xLy9yBpNk7W3vLnIG/3rXL+W/b3/oteJurgEAAADg/wXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBW6v34hQ2bk0/9SxNR/nULgzJzHTCzP53Lrk9u3dp0kslu35YMRqlKXcPrb03u3ZVOqfmSZDBMPv2NplMc2p7ZdK7YmOzY03SSyW65O1kyVe4e33Ffsneu3O9IkgxHyeeuSZYuajrJZNt3p/rat5PBqOkkk920Obl3Z7kzuDBMhuMyZ/B79zSdACa7fWFHLpv5TtMxDrJQD6svznw3/arbdJSJHhjNdq6avT2z44Wmo0z0/bn7MptBp8S9TZL7R/uydzRf5OwdMFcPqi/t25RVnemmo0y0Yzjb2bD/7nQLfQ9j49zWbBvuLnYG6yQL9bDoGVwYD6uv77s1m+a3NR1lonsGu6sb5+7KqpklTUeZ6LrZO7N1uLtb8h4P63GRM3jL/PEHXauSun7whcevPn/0qCPXjR+2VD+la7+f/rOflEHTOQ7lO3em95ijMl42neLWLkluuSu95dPJcUdm2HSWSXbNpLNle7pPe3y5e3zDremvfUK5+TZuSe+4I1OvXJoia4fv3pne9KLkcceUOYN79qf6wT3plbzH39qc/i8+JsNeJ/VP/vTD77t3pnf0itRHrihzBrfcl+78INWTHlnmDNZ1qg2b03t6gefgbVsv7N59/5se/HSyra6zurFA/NyqqmxLcvSBfx+39MLx8cvPL+7Muen+uv9Lh1fDTlXoef1A3Vs9nfrwRVVxa5ckt8/U3VGd6omHVUWe13OjVN/eVfeedWRV3Hl9wM076/4JK6rhVLfMGbx5Z91bvaTK0YvL/Jt8+0y686O6OnFlmTOYJNdsr/vPParcGdy4K/3jl2c03Svz+fi7D9S9VVPJsUvK3ONt+9O9b67uPHVVuXt87Y66/+wCz8G79p3fuX3mzx7yy9NBb3y99tfr7nkvSXE/Tx3+ytRXvCv9pnMcypNem8EHX5v+2uPLW7skOXtd8vTjM37LS8tcw/U3JG//VIYl7/Gq3079tXemX1VNJ5lszRszuPDc9E9fU+ZPZ6+/KFnUz/DCc8vc45vvSH7r3RmVPIPHvCrjL7w1vZVLm04y2XMvyOCCl6Z/1kllzuDbL0lu35bBR95Y5h7vX0ge9eqMS5zBN3+ozoWXNp0CDnb24+rOu59VF3fmHHVxxl98Qd2bLvKuMFl7aRbe8YxMnfmo8tYuSd5yfTIzyOADJ9XFnYdJsmVvcto/Zvy1Xy8zX5I88pKMPnt63Vtd5gtfOeWyDF9zYt075/Hl/c1LknUbk2u3Z/Dp08rc43GSYy5OXfIMPu4zGX74lPROWFHm8/GLv5zxC45L53UnlrmGn7gt+dCtGXzlBWXmS5IjCp3BdRvHueC6h14r8o8dAAAAAPysFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArVUldP/jC9KI314v7FzaV55DmFlItnkr9kz/ZjPE4VVWlrqqmk0w2t5Cq30u6nTLXcDRKhuNUi/pl5kuSwTBVv1duvvE4VaqkU5WZcXY+meql6nXLzDcaJwvDVNMFnzOjcapSv8NJMhil6nbKncGFYVKl7O/xcFTmd2T//LpqbnDegy9tq+usbioPP7+qKtuSHH3g34v76zI9dX5x35nBKFW/wO/yAcNxqk7B9wzzw6RTlbuGdZ3MDVNNF3zfOqpTdQvd3+RH91y9brkzuH8h6XZTTRU6g0kyu5BqScH3rXWdKlXqQh+PMzdINdUrdwaH4x/d+y8q+L51bpBqcYHn4Nzgzdm/8J6HjF7vxz/0znNSnfeShy/UT+vwV6be+fGU+r3Jk16bwSfPS3/t8U0nmezsdcnTj8/4LS8t8y2/9Tckb/9Uht9898EzWYpVv536/o+lKrXcXPPGDP781emfvqbM78nrL0oW9TO88Nwy9/jmO5LfendG3/tAuk1nOZRjXpXx996fzsqlTSeZ7LkXZHDBS9M/66QyZ/DtlyS3b8vgI29Mv+ksk+xfSB716ox3fKy8c/rNH0ouvLTpFHCw15+ZvOdV5Z05R/5Oxnf9TTrTU00nmewZ52Xhna/I1JnPLG/tkuSCjyR792fwgdeUeV5v2Z6c+taMN19U3nl9wCPOzejG96a7elXTSSY7+Y8z/IMz0jvnlDJncN3nk2u/n8GnLyhzBsfj5OjfS73jY2WuX5I89vcz/OLb0jvhuKaTTPaid2V8xjPSed1vlLmGn7gy+dBXM/jKO8qcwaTcjmbd55PzP/zQa8Ue1gAAAADws1B8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAKym+AAAAAGglxRcAAAAAraT4AgAAAKCVFF8AAAAAtJLiCwAAAIBWUnwBAAAA0EqKLwAAAABaSfEFAAAAQCspvgAAAABoJcUXAAAAAK2k+AIAAACglRRfAAAAALSS4gsAAACAVlJ8AQAAANBKii8AAAAAWknxBQAAAEArKb4AAAAAaCXFFwAAAACtpPgCAAAAoJUUXwAAAAC0kuILAAAAgFZSfAEAAADQSoovAAAAAFpJ8QUAAABAK/V+/MKVG5/fRI6faG6QXHhp0ykObdfeqvPxK+pcsbHpJJN9755kZi5Vr9Cq85a7k607q86Fl9ZNRzmk+f8zg1XVdJLJtu+uOp/5Rp0Nm5tOMtmGzUmnU+4eb92Z7NpbVaXmS5LZ+VTvW59MTzWdZLKtO6vO319bZ/N9TSeZ7KpNyc6ZcmdwMEz2L6Qq8W/d9bc+s+kIMNH1tz4z7730TU3HOMjcQqr/+YWk3206yWT3PVB1P//NOt+7p+kkk11/azK/UHXeW+h5vWtfsmc21XsLPK8P2DdXVR/8Up3l000nmeye+6vO+hvq3Lur6SSTff07yZ3by53Buk7mFpKSZ3DPbNX58OV1jl7RdJLJbtuW6vKbf/SMV6Ibb0u2FDyDyY86mhJn8OvfOeWga9WPvjYAAD+1bXWd1U2H4OdPVWVbkqObzgEA/P+jl+TqZPeyquo+pa6XFfouCwDQtKraVdf14puS6R82nYWfW9cl+4+tqrmn1/Uq960AwERVtbeu6+F3kpUzVV3XqapqWfLA1cmKpzQdDgAo1bYrktVn1HU933QSfn5VVbUo2fqlZHWZ/38OAKAAuzcmK3+5ruuZXpLUdb23qjLTdCwAoGTH7FR60bS6ruerKjubzgEAlGzF3rquZ5LkfwMsr/V0M+ypbQAAAABJRU5ErkJggg=="
+ "g31767.png": {
+ "image/png": "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"
}
},
"cell_type": "markdown",
- "id": "c518f863",
+ "id": "7460b0af",
"metadata": {},
"source": [
"
\n",
- "\n",
+ "\n",
"
"
]
},
{
"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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m+ybdSiJnvrPpbSPmVicucm+uUxsxo6fSnvH+OLMTfbN5Y8eAIbP2Ggv68hpYtM+bpW+aTO2ye0x+OzDV9HXvbwvr8fgogWP0NY+zmdusm/uEpvXmPlaG+5hYydU6lqarfaxk/qmzti6kNdj8MXHb6RQaO/L63mmp2sJmOXyGJz7QNYRNCaa2fCJ6DXiuTMXmJt1HFnL5Y+MiIiIiMhwpORaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERSouRaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERSouRaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERSouRaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERSouRaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERSouRaRERERCQlSq5FRERERFKi5FpEREREJCVKrkVEREREUqLkWkREREQkJUquRURERERS0p51AHHPP3YD/7r8yqzDGKCvewV3XvEFsHxejyxf9ELbgzefxXOPXJN1KIlefOImDGv7V6Et61ASdS58juWLny/86/ITsw6lot7u5XbXlSdRaB+bdSiJVix+of3RO37Ji0/enHUoiZ5/5Fow2vL6GXctfYmu5a9YXuMD6OtdYf++6qsUOsZlHUqipa883fbff/6UBc/ckXUoiV549Dq6li9sz+tnXOztptjblctjcN6TbwN2yzoMkZrkLrme/uLTxS0XXduXdRxxTxaLHVvc/Y8eyzqQCuZ1dbVv+OSDxTWfeTZ3+w6gc/m8tjYr2JZ3XduTdSxJXulbbgu6u9vzGh/A073Fjs3vubGnPacXeM8vW9K+3mP3Ftd++qlcHoNLlj/T1m4F23JpPj/jV3s7eb5rRUeej8G53T0dm9x7Q+9Ya/esY0myYMXy9lnPPFpc98WXcnkM9q14rm1FsSe358FeLzK3pyeXx+CKzu3bXtLddhkmcpdc7zFxduGE6W/N3Rfor0se8K+sfkBHW04Tm7s75/a8d8pOHbtNmJ3LAL8876+ML7T3nrj6mzuyjiXJ/Ste4LGu+X2nrvHWXMYHcNWSB4snrb5/x4TCmKxDSfSfFc91HzVlhzF7T9wkl8fgN1+6mhV9PT2nrHFgLj/jp7pf5sHnni/m+Ri8esnDxS9Mf3P7lLbxWYeSaM7cF3sOX/X1HW+ZtHkuj8EzXv4H83oWd5+6xltz+SVeVuzm2qUP5/IYPHX+LB7pyjoKkdrk8gQkIiIiIjIcKbkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUKLkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUKLkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUKLkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUKLkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUKLkWEREREUmJkmsRERERkZQouRYRERERSYmSaxERERGRlCi5FhERERFJiZJrEREREZGUtGcdQFyX97GouCLrMAZwYHFxBQXL5/VIEWdZsSuX+w6gy3uwIrmNb6l3UaSY2/ggHINLil30UMw6lERFitZZ7MntPuwq9tCd0/MLwBLvoojnNj4Ax1lSXIGZZR1Kol6KLM/zebDYRxe9ltf4OovdQD7P0130Zh2CSM3M3bMNwJgPrN7/fkLh+z6pcHK2QSVYXFxRWKUwLp9ZDbC82F3osDbvsLbc7TuApcUuM7CJhbG53Ie9XrQlxRU2tW1CLuMDWFLsKkwqjHHDcvkZLy92F9qtzcfk9Bhc1Ndp7VbI7THYRx+L+7oKeT4GlxW7CxMKHbk9BpcVuwod1uZjrD2v8ZmDTcrpMei4LSt25zK+JcVvW2fxQ6VXdXPdWT+zgEQGkbuW63dP2cFOmH587ppFXv/46X7TBp8stOW05fqtT/+45wur79+x24TZudt3AF+e91fGF9p7T1z9zbk75gDuX/ECn37x0r6rZh3XlnUslez4+LeL1876eGFCYUwuP+OD5/6k+/9W22vM3hM3yWV833zpalb09fScsuaBHVnHkuSp7pf5wHMXFq/b4BP5PMkAOz/+3eKV63+0MKVt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"
- }
- },
- "cell_type": "markdown",
- "id": "a67e0aad",
- "metadata": {},
- "source": [
- "
\n",
- "\n",
- "
"
- ]
- },
- {
- "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 +443,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 $\n",
- "Question: What are the data dependencies in the block-wise partitioning?\n",
+ "
\n",
+ "Definition: *Load imbalance*: is the problem when work is not equally distributed over all processes and consequently some processes do more work than others.\n",
"
\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 waist 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 +460,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 previous row block partition."
]
},
{
@@ -404,58 +484,121 @@
},
{
"cell_type": "markdown",
- "id": "866824c6",
+ "id": "1c9e4c8a",
"metadata": {},
"source": [
- "## Conclusion\n",
- "Cyclic partitioning tends to work well in problems with predictable load imbalance. It is a form of **static load balancing** which means using a pre-defined load schedule based on prior information about the algorithm (as opposed to **dynamic load balancing** which can schedule loads flexibly during runtime). The data dependencies are the same as for the 1d block partitioning.\n",
+ "### Static vs dynamic load balancing\n",
"\n",
- "At the same time, cyclic partitioning is not suitable for all communication patterns. For example, it can lead to a large communication overhead in the parallel Jacobi method, since the computation of each value depends on its neighbouring elements."
+ "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",
+ "
\n",
+ "Question: Using a cyclic partition for Gaussian elimination, is a form of static or dynamic load balancing?\n",
+ "
\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a6741a25",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ge_lb_answer()"
]
},
{
"cell_type": "markdown",
- "id": "20982b04",
+ "id": "e151fb8d",
"metadata": {},
"source": [
- "## Exercise\n",
- "The actual implementation of the parallel algorithm is left as an exercise. Implement both 1d block and 1d cyclic partitioning and compare their performance. The implementation is closely related to that of Floyd's algorithm. To test your algorithms, generate input matrices with the function below (a random matrix is not enough, we need a non singular matrix that does not require pivoting). "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a65cf8e6",
- "metadata": {},
- "outputs": [],
- "source": [
- "function tridiagonal_matrix(n)\n",
- " C = zeros(n,n)\n",
- " stencil = [(-1,2,-1),(-1,0,1)]\n",
- " for i in 1:n\n",
- " for (coeff,o) in zip((-1,2,-1),(-1,0,1))\n",
- " j = i+o\n",
- " if j in 1:n\n",
- " C[i,j] = coeff\n",
- " end\n",
- " end\n",
+ "### 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 this algorithm in parallel efficiently.\n",
+ "\n",
+ "Look again to the algorithm\n",
+ "\n",
+ "```julia\n",
+ "n,m = size(B)\n",
+ "for t in (k+1):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",
+ " B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
" end\n",
- " C\n",
- "end"
+ " B[i,k] = 0\n",
+ "end\n",
+ "```\n",
+ "\n",
+ "Note that all updates on the loop over i and j we do the following: \n",
+ "\n",
+ "```julia\n",
+ "B[i,j] = B[i,j] - B[i,k]*B[k,j]\n",
+ "```\n",
+ "\n",
+ "As we are using 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+1):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 has to send them to the other processors. This is very similar to the communication pattern 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"
]
},
{
- "cell_type": "code",
- "execution_count": null,
- "id": "31d8586a",
+ "attachments": {
+ "g27851.png": {
+ "image/png": "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"
+ }
+ },
+ "cell_type": "markdown",
+ "id": "0050b6c4",
"metadata": {},
- "outputs": [],
"source": [
- "n = 12\n",
- "C = tridiagonal_matrix(n)\n",
- "b = ones(n)\n",
- "B = [C b]\n",
- "gaussian_elimination!(B)"
+ "
\n",
+ "\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cf189776",
+ "metadata": {},
+ "source": [
+ "### Parallel implementation\n",
+ "\n",
+ "\n",
+ "At iteration $k$,\n",
+ "\n",
+ "1. The CPU owning row $k$ does the loop over $t$ to update row $k$.\n",
+ "2. The CPU owning row $k$ sets $B_{kk} = 1$.\n",
+ "2. This CPU sends the red cells in figure above to the other processors.\n",
+ "3. All processors receive the updated values in row $k$ and do the loop over i and j locally (blue cells).\n",
+ "\n",
+ "\n",
+ "As you probably see, the parallel implementation of this method is closely related to Floyd's algorithm. But there are some differences. \n",
+ "\n",
+ "1. The process that owns row $k$ updates its values before sending them.\n",
+ "2. We do not send the full row $k$, only the entries beyond column $k$.\n",
+ "3. We need a cyclic partition to balance the load properly.\n",
+ "\n",
+ "A key similarity between the two algorithms, however, is that they both suffer from synchronization problems. We need to make sure that the rows arrive in the right order. The strategies discussed for Floyd's algorithm also apply in this current case.\n",
+ "\n",
+ "The actual implementation of the parallel algorithm is left as an open exercise."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "866824c6",
+ "metadata": {},
+ "source": [
+ "## Conclusion\n",
+ "\n",
+ "\n",
+ "We studied the parallelization of an algorithm that leads to load imbalance. We fixed the problem using a cyclic partition. This is a form of static load balancing since we were able to distribute the load in advance without using runtime values. This is opposed to dynamic load balancing which can schedule loads flexibly during runtime. Note however that cyclic partitioning is not suitable for all communication patterns. For example, it can lead to a large communication overhead in the parallel Jacobi method, since the computation of each value depends on its neighboring elements.\n"
]
},
{
@@ -469,14 +612,6 @@
"\n",
"This notebook is part of the course [Programming Large Scale Parallel Systems](https://www.francescverdugo.com/XM_40017) at Vrije Universiteit Amsterdam and may be used under a [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) license."
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8ab22f67",
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
diff --git a/dev/LEQ/index.html b/dev/LEQ/index.html
index 65f7096..2700cd8 100644
--- a/dev/LEQ/index.html
+++ b/dev/LEQ/index.html
@@ -1,5 +1,5 @@
-- · XM_40017
What is load imbalance, and how to fix it in this algorithm
@@ -7562,26 +7562,66 @@ a.anchor-link {
usingPrintffunctionanswer_checker(answer,solution)ifanswer==solution
-"🥳 Well done! "
+"🥳 Well done!"else"It's not correct. Keep trying! 💪"end|>printlnend
+functionge_par_why()
+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."
+println(msg)
+endge_par_check(answer)=answer_checker(answer,"a")ge_dep_check(answer)=answer_checker(answer,"b")
+functionge_lb_answer()
+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"
+println(msg)
+end
+println("🥳 Well done!")
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.
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. $A$ and $b$ are given, and $x$ is unknown. The goal of Gaussian elimination is to transform the system $Ax=b$, into a new system $Ux=c$ such that
+
+
both system have the same solution vector $x$,
+
the matrix $U$ of the new system is upper triangular with unit diagonal, namely $U_{ii} = 1$ and $U_{ij} = 0$ for $i>j$.
+
+
For the particular system shown above, the transformed one is the following:
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.
+
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. For this reason, we will study here the triangulation step only.
In practice, vector $b$ is added as an additional column to A forming the so-called augmented matrix $A^* = [A b]$. The augmented matrix in the example above is
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]$. These are $A^*$ and $U^*$ in our example:
The following algorithm computes the Gaussian elimination on a given augmented matrix B, representing a system of linear equations. The result is given by overwriting B, avoiding the allocation of an additional matrix.
-
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.
-
The second inner loop beginning in line 8 substracts the rows from one another such that all entries below the diagonal become zero.
+
The outer loop is a loop over rows.
+
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.
+
The second inner loop beginning in line 8 subtracts 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.
@@ -7696,6 +7781,19 @@ $$
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -7703,7 +7801,7 @@ $$
-Note: This algorithm is not correct for all matrices: if any diagonal element B[k,k] 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 pivoting.
+Note: This algorithm is not correct for all nonsingular matrices: if any diagonal element B[k,k] 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 pivoting. We are not going to consider pivoting here for simplicity.
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.
Let start considering a row-wise block partition, as we did in previous algorithms.
+
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.
-
-
-
-
-
-
-
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.
-
-
Block-wise partitioning: Each processor gets a block of subsequent rows.
-
Cyclic partitioning: The rows are alternately assigned to different processors.
To evaluate the efficiency of both partitioning schemes, consider how much work the processors do in the following example.
-In any iteration k, which part of the matrix is updated in the inner loops?
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$.
@@ -7893,36 +7974,17 @@ In any iteration k, which part of the matrix is updated in the inner loops?
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.
-Question: What are the data dependencies in the block-wise partitioning?
-
-
a) CPUs with rows >k need all rows <=k
-b) CPUs with rows >k need part of row k
-c) All CPUs need row k
-d) CPUs with row k needs all rows >k
-
-
-
-
-
-
-
-
-
In [ ]:
-
-
-
answer="x"# replace x with a, b, c, or d
-ge_dep_check(answer)
-
+
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.
+
+Definition: *Load imbalance*: is the problem when work is not equally distributed over all processes and consequently some processes do more work than others.
+
Having processors waiting for others is a waist 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.
@@ -7933,7 +7995,8 @@ d) CPUs with row k needs all rows >k
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.
+
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 previous row block partition.
@@ -7951,69 +8014,112 @@ d) CPUs with row k needs all rows >k
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.
+
+
Static load balancing the work distribution strategy is based on prior information of the algorithm and it does not depend on runtime values.
+
Dynamic load balancing the work distribution strategy is based on runtime values.
+
+
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.
+
+Question: Using a cyclic partition for Gaussian elimination, is a form of static or dynamic load balancing?
+
Using a cyclic partition, we managed to distribute the work uniformly. But we still need to study the data dependencies in order to implement this algorithm in parallel efficiently.
Note that all updates on the loop over i and j we do the following:
+
B[i,j]=B[i,j]-B[i,k]*B[k,j]
+
+
As we are using 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+1):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 has to send them to the other processors. This is very similar to the communication pattern 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).
The CPU owning row $k$ does the loop over $t$ to update row $k$.
+
The CPU owning row $k$ sets $B_{kk} = 1$.
+
This CPU sends the red cells in figure above to the other processors.
+
All processors receive the updated values in row $k$ and do the loop over i and j locally (blue cells).
+
+
As you probably see, the parallel implementation of this method is closely related to Floyd's algorithm. But there are some differences.
+
+
The process that owns row $k$ updates its values before sending them.
+
We do not send the full row $k$, only the entries beyond column $k$.
+
We need a cyclic partition to balance the load properly.
+
+
A key similarity between the two algorithms, however, is that they both suffer from synchronization problems. We need to make sure that the rows arrive in the right order. The strategies discussed for Floyd's algorithm also apply in this current case.
+
The actual implementation of the parallel algorithm is left as an open exercise.
Cyclic partitioning tends to work well in problems with predictable load imbalance. It is a form of static load balancing which means using a pre-defined load schedule based on prior information about the algorithm (as opposed to dynamic load balancing which can schedule loads flexibly during runtime). The data dependencies are the same as for the 1d block partitioning.
-
At the same time, cyclic partitioning is not suitable for all communication patterns. For example, it can lead to a large communication overhead in the parallel Jacobi method, since the computation of each value depends on its neighbouring elements.
The actual implementation of the parallel algorithm is left as an exercise. Implement both 1d block and 1d cyclic partitioning and compare their performance. The implementation is closely related to that of Floyd's algorithm. To test your algorithms, generate input matrices with the function below (a random matrix is not enough, we need a non singular matrix that does not require pivoting).
We studied the parallelization of an algorithm that leads to load imbalance. We fixed the problem using a cyclic partition. This is a form of static load balancing since we were able to distribute the load in advance without using runtime values. This is opposed to dynamic load balancing which can schedule loads flexibly during runtime. Note however that cyclic partitioning is not suitable for all communication patterns. For example, it can lead to a large communication overhead in the parallel Jacobi method, since the computation of each value depends on its neighboring elements.
@@ -8028,20 +8134,6 @@ d) CPUs with row k needs all rows >k