Changes in Jacobi

This commit is contained in:
Francesc Verdugo committed 2023-08-15 10:00:21 +02:00
1 parent e7417b1e46
commit b82b2d4bea
1 file changed
+318 -341
+318 -341
View File
@@ -33,6 +33,16 @@
"\n"
]
},
{
"cell_type": "markdown",
"id": "4b9d1d46",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-info\">\n",
"<b>Note:</b> Do not forget to run the next cell before starting studying this notebook. \n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
@@ -200,7 +210,7 @@
"id": "0dbc5358",
"metadata": {},
"source": [
"Note that the final solution is the same (up to machine precision)."
"Note that the final solution is nearly the same for a large enough number of iterations."
]
},
{
@@ -266,7 +276,7 @@
"source": [
"### Parallelization strategy\n",
"\n",
"We saw in the previous notebook that a sufficiently large grain size is needed to achieve performance in a distributed algorithm. For Jacobi, one could update each entry of vector `u_new` in a different worker, but this would not be efficient. Instead, we use a parallelization strategy with a larger grain size that is analogous to the algorithm 3 we studied for the matrix-matrix multiplication:\n",
"Remember that a sufficiently large grain size is needed to achieve performance in a distributed algorithm. For Jacobi, one could update each entry of vector `u_new` in a different worker, but this would not be efficient. Instead, we use a parallelization strategy with a larger grain size that is analogous to the algorithm 3 we studied for the matrix-matrix multiplication:\n",
"\n",
"- Each worker updates a consecutive section of the array `u_new` \n",
"\n",
@@ -297,362 +307,36 @@
"\n",
"Recall the Jacobi update:\n",
"\n",
"`u_new[i] = 0.5*(u[i-1]+u[i+1])`"
"`u_new[i] = 0.5*(u[i-1]+u[i+1])`\n",
"\n",
"Thus, in order to update the local entries in `u_new`, we also need remote entries of vector `u` located in neighboring processes. Figure below shows the entries of `u` needed to update the local entries of `u_new` in a particular process (CPU 2)."
]
},
{
"attachments": {
"fg10.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAADyCAYAAABAvOgkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAABjrSURBVHic7d19lF51YSfw70zeICEmICYEEEJEKIi8CJS3VSql0t3adRdcena1eFxpAG2xtp66Xd01Fql6bJXqHjE5nq2LL9tWe9puxW1REMQ3VkAKigoIoUCA8GIDITAkmWf/uHeYO5NnZp4kM3N/mfl8znkOv/s8d575Zp5nLs937u/e27d27dpOAAAAoGX9bQcAAACAREEFAACgEHNHLZ/T19e3vo0gAAAAzC6dTmdlkn8cWh5RUPv6+tavXr36rukOBQAAwOyzbt26dDrDp0UyxRcAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFgGF7J1mRZG7bQQBgNlJQAZiNLkpyc5J1SfqSXJLkziRbkmxI8l/bi0YB+pL82ySfSXJNkluTfDPJl5O8J8lx7UUDmNn8hRiA2WhFkhOTbE5VUi9Msi3Jw0n2TVVQmJ3mJ/lSqoLazXlJ3pTk2GlLBDCLKKgAzGYnJ3lNkg8kuSLJv6T6f+PyNkPRqotTldOBJO9L8vdJNiZZkuSQJOckOb61dAAznIIKwGy2MMmHk6xp3LctyUOtpKEEv1b/90+T/Enj/p8nWZ9qqi8AU8QxqADMZoOpiggMGfrj/ZZWUwDMUgoqALPZI0kebzsERbm1/u97klyaZFmLWQBmHQUVgNnsn9sOQHE+nOTeJIuT/FmqP2L8U5KPJTkrDo8CmFIKKgCz2UDbASjOE6kuI7MmyQ9TndH52CTvSnJtktuTnNFWOICZTkEFABhpc6ozO78yycFJfjPJF5I8n+SoVNdGPaS1dAAzmIIKADC2h5J8Psmbk7wqybOpzv78r9sMBTBTKagAAL35UZIf12N7UAGmgIIKADDsd5McOsZjh6ea4pskP5meOACzizPRAQAMe3eqa+Nel+SmJA8mmZ/kyCT/McneqfaifrmtgAAzmYIKwGz081SXEnm47SAU5/+lOr707PrW1EnylSSrUx2LCsAkU1ABmI3+rL7BaOcm2SvJLyZZmeSAVJea2ZDkW0nuay0ZwCygoAIAjPRckm/WNwCmkZMkAQAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAIc9sOAN1ceeWVB/X395/fdo7xfPazn3314OBgf5Lce++9dzz22GNPtp1plFcm2a8eP5Dk3hazdHNwkpfV481JbmkxSy+uTPJc2yHoyflJDmo7xDgOTbKyHm9Kclt7Ubp6UZITGss3JhlsKctYXp3hP7LfkaS07W/TrUluaDsEPTk0yblthxhHX5LXNJZvS7UNKclxSZbW4/uTrG8vyo5Wrlx56PLly1cmydKlSzede+65pW1/R3j44Yc/uWbNmm1t55huCipFmjNnzuGdTudjbecYz0033ZTBwRc+s72hzSwzxJvaDjCBq6Kg7ikuTXJG2yF2wgVtB5hA6du30vNdEQV1T3FUkqI/e4xS+nu/OOvXr8/69euTJKtWrUoK3/6uWLFibZJZV1BN8QUAAKAI9qCyp7i97QBdHDs0WLBgwSMDAwMb2wzTxdEZ/h1/NsndLWbpZmWqqYRJ0kk1Ta8keyU5ou0Q7LZH61tJXpZkUT3enuRHLWbp5sUZOUX6hylviu+xjXGJr/FhSRa3HYLdVtpnj75Uh+8M2ZDk8ZayjOUVSebU42eS/KzFLDtYsGDBqoGBgX2SpNPpDKbavpVkYZLD2w7RNgWVPcVJF1100da2QzT19/d3hsannnrqp2644YbL2szTxWNJ9q/HP0pycotZuvn7JK+vx8+lOm6lJCekOnaMPdunk6xpO8Qo1yc5sx4/k/Le++9I8j8ay2ckeaqlLGPpNMYlvsZXJ/k3bYdgt2xPeb+bC1NtM4Z8JMknWsoyln9JsqQe/yDV8eLFOOaYY6675ZZbXpskW7dufeaiiy4q6jVet27d6Z1O59tt52ibKb4AAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCArqzPH9JDfXt6N7/Jq/aXzN66YoFwAAQE/mth2ASXNikr56vKjHrzkmyeH1eL9JTwQAALAT7EEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCArq7Dav7QAAAABDFNSZY6AxXtDD+n1J9p+iLAAAADtNQZ05nmqMD+hh/aOTLJqiLAAAADtNQZ057mmMT+1h/bdOVRAAAIBdoaDOHDc1xm9KsnicdU9K8ttTGwcAAGDnKKgzxxca4wOSfDHJvqPW6UvyH5J8Lcn8jDxuFQAAoFVz2w7ApLklyZeTvLFefn2Se5Ncm2RjkiVJTk+ysn78j5L8pySHT2vKXdTX13fy2rVrt7edo+mSSy55YfzYY48dnOSU9tJ01fz9XpTy8jX/gNKf8vId0XYAJsVBKe+91ZzhMifl5Vs5avnEJFtayNGrEl/jpW0HYFKU9r4afRLMQ1NexjmN8T4pLN/TTz/9wva3r69vztq1a4vK1+l0jm47QwkU1JnlolQbq5Pr5aVJzhu1TifJx5OsSVVQ9widTufbbWcYz5133rk6yeq2c4zjqCTfazvEOBak7HzsuS6sb6ValPLf+9e1HWACpb/G7JnmpPzfzd+rb6U6PoX9DO+6664XxvPmzVuYwvJRUVBnlieTnJlqY/W2JIc1HhtM8vVU5fQf6vu+k2R9PX5keiICAAB0p6DOPM8muby+HZhkWZLnktxfP9b0lumNBgAAMDYFdWbbUN/2OBs2bLhx1apV+7SdYzznnXfewm3btvUlyR133PHcPffcU9QxsqmmzQ79jm9N8nyLWbqZm+Hjaban+kNKyZ5pOwA9Ozsjj4MqzbxUJ6pLynzv9yfZu7Fc4nt/YaoT/yXVz6+07W/T1rYD0LOvpTpusmTNa9g/m2qGXEn2yvD29/kU9v4//vjj5x122GHzk2Tx4sXb995779K2vyNccMEFJR//P2UUVIq0Zs2awZT5oahJPihT0R849hBPtx1gArZvTIXtKf+9Jd9uuO2223Lbbbe9sHzVVVe1mIaxuMwMAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUQUEFAACgCAoqAAAARVBQAQAAKIKCCgAAQBEUVAAAAIqgoAIAAFAEBRUAAIAiKKgAAAAUYW7bAQCgIC9JsjjJ5iQb6/tOSnJ0ff/VSda3kozJ9uIkxyV5aZJFSR5P8kCSm5NsbTEXwKymoALAsI8meUuSq5J8KMkXkryq8fjmKKh7unmpXudLkszv8vjm+rHPT2coACoKKgDsaHmS65Lsm+Rvk2xIcmCSgTZDMSk+nuQdSbYn+UqSW5M8m+SAJEcmOSvJQa2lA5jlFFQA2NE5Se5OckaS+1rOwuRZmORt9fitST7XZZ0XJ9l/2hIBMIKCCgDdXRDldKZZlmSvenz1GOs8Ud8AaIGz+ALAju5L8r22QzDpNiTZVo/fHp+DAIpjwwwAO/pZ2wGYEs8n+fN6fFmq1/lTSc5Psl9boQAYpqACwI4eaTsAU+adST6W6oRXK1OdsfcvU11W6PokZ7YVDAAFFQC6GWw7AFPm2SS/n+qat+cn+XSqE2LNSVVOv5GqxALQAgUVAJiNnk7ypVR7UI9Icmyq4477Uk3/ndNeNIDZS0EFAEjuSPI79XhxksNazAIwaymoAMBssSTJ3uM8/qLGeMsUZwGgCwUVAJgtXpXqUjOfTPLqDJ+5d78kb0jymXr5xno9AKbZ3LYDAABMo6VJfru+dfPTJBdMXxwAmhRUABj21VSXmLm17SBMiW+l2nP62iQnJzkwyb5Jtib5SZKrk3wuyXNtBQSY7RRUABj2V/WNmWlrqpL6rbaDANCdY1ABAAAogoIKAABAERRUAAAAiqCgAgAAUAQFFQAAgCIoqAAAABRBQQUAAKAICioAAABFUFABAAAowty2A0A369atO77T6Xyq7Rzjufzyy18xODjYlyRPPvnk/Vu2bHm67UyjrEyyTz1+PMkj7UXpav8kB9Tj55Lc02KWXvxqkqfaDkFPrkxyXNshxrGsviXJliT3tpilm0VJDmss/yhJp6UsY3lFkr56fH+S0ra/TX+R5BNth6AnpyT5eNshxtGX6r0/5L4kz7SUZSyHpdqGJMljSR5tMcsOlixZsmzx4sXLkmTFihVbLrzwwtK2vyMMDAy89tJLLx1oO8d0U1Ap1ZIkp7UdYjwPPvhgBgcHhxaPaTNLDxZn5AfO0ixO8pK2Q0xgXtsB6NkrU/j2o2FxkuVth5jAqW0HmEDp29+b2g5Az/bNnrPtSJJj2w4wgcVJVrUdomnTpk3ZtGlTkmT+/PnFb38XLFgwLine truncated
"fig22.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "210e80e7",
"id": "6dfedc09",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fg10.png\" align=\"left\" width=\"450\"/>\n",
"<img src=\"attachment:fig22.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "c4e2d000",
"id": "cc412ea0",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> In order to update the entries u_new[r:s], which data from other process will be needed by the process that owns the entries u[r:s]? Note: r and s are integers indicating the first and last index owned by this process (see picture above). \n",
"</div>\n",
"\n",
" b) Data at positions r-1 and s+1 "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3c437326",
"metadata": {},
"outputs": [],
"source": [
"# TODO"
]
},
{
"cell_type": "markdown",
"id": "1b3c8c05",
"metadata": {},
"source": [
"### Ghost (aka halo) cells\n",
"\n",
"A usual way of implementing the Jacobi method and related algorithms is using so-called ghost cells. Ghost cells represent the missing data dependencies in the data owned by each process. After importing the appropriate values from the neighbor processes one can perform the usual sequential Jacobi update locally in the processes."
]
},
{
"attachments": {
"fig13.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "98e0eb71",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig13.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "0148f9b3",
"metadata": {},
"source": [
"Thus, the algorithm is usually implemented following two main phases at each iteration Jacobi:\n",
"\n",
"1. Fill the ghost entries with communications\n",
"2. Do the Jacobi update sequentially at each process"
]
},
{
"attachments": {
"fig15.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAFACAYAAACxyVHuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFT19f/x12cmIQFkE1wANxBFrTu4b1itimQC2mKrtfrtRtXazbbWrmJba+1m7S5fv9Wqrbb5VWBugFatpe4buGvdFVcU2cISSOZ+fn+cO2QyTCAsmXszeT8fj/vIvXPv3Dm5M3PnnvvZ3DXXXOMRERERERERiVkq7gBEREREREREQAmqiIiIiIiIJERV0fLJzrlX4whEREREREREehbv/W7AP/PL7RJU59yrU6ZMeb7cQYmIiIiIiEjPM23aNLxv6xZJVXxFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBJBCaqIiIiIiIgkghJUERERERERSQQlqCIiIiIiIpIISlBFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBKhKu4ARDbGe+8aGxsvizuODbnuuusOWLhw4SCAhQsXvvbiiy++EndMRXYBRkbzy4H5McZSSn/g4ILlu4FcTLGUdPjhhx+dTqerAE455ZSnDjzwwEVxx9QR59yDdXV1s8rxWtls9nPOueHleK3NMXv27BFPPPHErgArV65c8thjjz0ed0xFBgEHFCzPjSmODRlXMP84sCSmODpyAHYcARYAL8cYy3pGjBixy7Bhw0YCbLvttsunTJmStPNvO+l0+vJTTz11TVe/ThAEewFndfXrbK7m5ub0L3/5y2Pyy88+++z8xYsXL48zphIOxn4/wT73C2KMpZQRwK7R/FLgsRhjWc/gwYMH7rXXXgfmly+55JK5MYazUWEY3jBx4sQX446jHJSgSuJddtllbsyYMd+NO44NeeGFF3jyySfzi8dsaNuEmBB3ABuRuGP4wAMPrJsfN25c4uIr5L3/LVCWBBX4DDC2TK+1yd577z3uvffewofq44qlkxL92SL58SXOK6+8wiuv2D3LUaNGQcLPv9XV1T8HujxB9d6Pds4l+re96NyR9M9+0uMDyMQdQKH333+/3XschuExqVRyK5em0+l7gR6RoCb3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 truncated
}
},
"cell_type": "markdown",
"id": "baccd833",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig15.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "8b436c73",
"metadata": {},
"source": [
"## Efficiency"
]
},
{
"cell_type": "markdown",
"id": "5c397005",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> Which is the communication and computation complexity in each process? N is the length of the vector and P the number of processes. \n",
"</div>\n",
"\n",
" a) Communication: O(P), computation: O(N/P)\n",
" b) Communication: O(1), computation: O(N)\n",
" c) Communication: O(P), computation: O(N)\n",
" d) Communication: O(1), computation: O(N/P)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3a03fc4c",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d\n",
"jacobi_1_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "8ed4129c",
"metadata": {},
"source": [
"## Implementation\n",
"\n",
"We consider the implementation using MPI. The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed, but it requires some extra effort to setup remote channels right for the communication between neighbor processes.\n",
"\n",
"Take a look at the implementation below and try to understand it. Note that we have used MPIClustermanagers and Distributed just to run the MPI code on the notebook. When running it on a cluster, MPIClustermanagers and Distributed are not needed.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e15082fb",
"metadata": {},
"outputs": [],
"source": [
"] add MPI MPIClusterManagers"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a66cbf9a",
"metadata": {},
"outputs": [],
"source": [
"using MPIClusterManagers \n",
"using Distributed"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0d63c6b",
"metadata": {},
"outputs": [],
"source": [
"if procs() == workers()\n",
" nw = 3\n",
" manager = MPIWorkerManager(nw)\n",
" addprocs(manager)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0923606",
"metadata": {},
"outputs": [],
"source": [
"# Test cell, remove me\n",
"u = [-1, 0, 0, 0, 0, 1]\n",
"view(u, 6:6)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "68851107",
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"@mpi_do manager begin\n",
" using MPI\n",
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
" nw = MPI.Comm_size(comm)\n",
" iw = MPI.Comm_rank(comm)+1\n",
" function jacobi_mpi(n,niters)\n",
" if mod(n,nw) != 0\n",
" println(\"n must be a multiple of nw\")\n",
" MPI.Abort(comm,1)\n",
" end\n",
" n_own = div(n,nw)\n",
" u = zeros(n_own+2)\n",
" u[1] = -1\n",
" u[end] = 1\n",
" u_new = copy(u)\n",
" for t in 1:niters\n",
" reqs = MPI.Request[]\n",
" # Exchange cell values with neighbors\n",
" if iw != 1\n",
" neig_rank = (iw-1)-1\n",
" req = MPI.Isend(view(u,2:2),comm,dest=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" req = MPI.Irecv!(view(u,1:1),comm,source=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" end\n",
" if iw != nw\n",
" neig_rank = (iw+1)-1\n",
" s = n_own+1\n",
" r = n_own+2\n",
" req = MPI.Isend(view(u,s:s),comm,dest=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" req = MPI.Irecv!(view(u,r:r),comm,source=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" end\n",
" MPI.Waitall(reqs)\n",
" for i in 2:(n_own+1)\n",
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
" end\n",
" u, u_new = u_new, u\n",
" end\n",
" u\n",
" @show u\n",
" # Gather results in root process\n",
" results = zeros(n+2)\n",
" results[1] = -1\n",
" results[n+2] = 1\n",
" MPI.Gather!(view(u,2:n_own+1), view(results, 2:n+1), root=0, comm)\n",
" if iw == 1\n",
" @show results\n",
" end \n",
" end\n",
" niters = 100\n",
" load = 4\n",
" n = load*nw\n",
" jacobi_mpi(n,niters)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "eff25246",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> How many messages per iteration are sent from a process away from the boundary?\n",
"</div>\n",
"\n",
" a) 1\n",
" b) 2\n",
" c) 3\n",
" d) 4\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "98bd9b5e",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d\n",
"jacobi_2_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "075dd6d8",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> After the end of the for-loop (line 43), ...\n",
"</div>\n",
"\n",
" a) each worker holds the complete solution.\n",
" b) the root process holds the solution. \n",
" c) the ghost cells contain redundant values. \n",
" d) all ghost cells contain the initial values -1 and 1. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3b58002",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d\n",
"jacobi_3_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "4537661d",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> In line 35 of the code, we wait for all receive and send requests. Is it possible to instead wait for just the receive requests?\n",
"</div>\n",
"\n",
" \n",
" a) No, because the send buffer might be overwritten if we don't wait for send requests.\n",
" b) No, because MPI does not allow an asynchronous send without a Wait().\n",
" c) Yes, because each send has a matching receive, so all requests are done when the receive requests return. \n",
" d) Yes, because there are no writes to the send buffer in this iteration."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e16ea5eb",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d.\n",
"jacobi_4_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "c9aa2901",
"metadata": {},
"source": [
"### Latency hiding\n",
"\n",
"Can our implementation above be improved? Note that we only need communications to update the values at the boundary of the portion owned by each process. The other values (the one in green in the figure below) can be updated without communications. This provides the opportunity of overlapping the computation of the interior values (green cells in the figure) with the communication of the ghost values. This technique is called latency hiding, since we are hiding communication latency by overlapping it with communications that we need to do anyway.\n",
"\n",
"The modification of the implementation above to include latency hiding is leaved as an exercise (see below).\n"
]
},
{
"attachments": {
"fig16.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "7d66b1a2",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig16.png\" align=\"left\" width=\"450\"/>\n",
"</div>\n"
"### Efficiency\n",
"- We update $N/P$ entries in each process at each iteration, where $N$ is the total length of the vector and $P$ the number of processes\n",
"- We need to get remote entries from 2 neighbors (2 messages per iteration)\n",
"- We need to communicate 1 entry per message\n",
"- Communication/computation ration is $O(P/N)$ (potentially scalable if $P<<N$)\n"
]
},
{
@@ -923,6 +607,299 @@
"\n"
]
},
{
"cell_type": "markdown",
"id": "6838b947",
"metadata": {},
"source": [
"## Implementation\n",
"\n",
"We consider the implementation using MPI. The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed, but it requires some extra effort to setup remote channels right for the communication between neighbor processes."
]
},
{
"cell_type": "markdown",
"id": "1b3c8c05",
"metadata": {},
"source": [
"### Ghost (aka halo) cells\n",
"\n",
"A usual way of implementing the Jacobi method and related algorithms is using so-called ghost cells. Ghost cells represent the missing data dependencies in the data owned by each process. After importing the appropriate values from the neighbor processes one can perform the usual sequential Jacobi update locally in the processes."
]
},
{
"attachments": {
"fig13.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "98e0eb71",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig13.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "0148f9b3",
"metadata": {},
"source": [
"Thus, the algorithm is usually implemented following two main phases at each iteration Jacobi:\n",
"\n",
"1. Fill the ghost entries with communications\n",
"2. Do the Jacobi update sequentially at each process"
]
},
{
"attachments": {
"fig15.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAFACAYAAACxyVHuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFT19f/x12cmIQFkE1wANxBFrTu4b1itimQC2mKrtfrtRtXazbbWrmJba+1m7S5fv9Wqrbb5VWBugFatpe4buGvdFVcU2cISSOZ+fn+cO2QyTCAsmXszeT8fj/vIvXPv3Dm5M3PnnvvZ3DXXXOMRERERERERiVkq7gBEREREREREQAmqiIiIiIiIJERV0fLJzrlX4whEREREREREehbv/W7AP/PL7RJU59yrU6ZMeb7cQYmIiIiIiEjPM23aNLxv6xZJVXxFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBJBCaqIiIiIiIgkghJUERERERERSQQlqCIiIiIiIpIISlBFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBKhKu4ARDbGe+8aGxsvizuODbnuuusOWLhw4SCAhQsXvvbiiy++EndMRXYBRkbzy4H5McZSSn/g4ILlu4FcTLGUdPjhhx+dTqerAE455ZSnDjzwwEVxx9QR59yDdXV1s8rxWtls9nPOueHleK3NMXv27BFPPPHErgArV65c8thjjz0ed0xFBgEHFCzPjSmODRlXMP84sCSmODpyAHYcARYAL8cYy3pGjBixy7Bhw0YCbLvttsunTJmStPNvO+l0+vJTTz11TVe/ThAEewFndfXrbK7m5ub0L3/5y2Pyy88+++z8xYsXL48zphIOxn4/wT73C2KMpZQRwK7R/FLgsRhjWc/gwYMH7rXXXgfmly+55JK5MYazUWEY3jBx4sQX446jHJSgSuJddtllbsyYMd+NO44NeeGFF3jyySfzi8dsaNuEmBB3ABuRuGP4wAMPrJsfN25c4uIr5L3/LVCWBBX4DDC2TK+1yd577z3uvffewofq44qlkxL92SL58SXOK6+8wiuv2D3LUaNGQcLPv9XV1T8HujxB9d6Pds4l+re96NyR9M9+0uMDyMQdQKH333+/3XschuExqVRyK5em0+l7gR6RoCb3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 truncated
}
},
"cell_type": "markdown",
"id": "baccd833",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig15.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "8ed4129c",
"metadata": {},
"source": [
"### Code\n",
"\n",
"\n",
"Take a look at the implementation below and try to understand it. Note that we have used MPIClustermanagers and Distributed just to run the MPI code on the notebook. When running it on a cluster, MPIClustermanagers and Distributed are not needed.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e15082fb",
"metadata": {},
"outputs": [],
"source": [
"] add MPI MPIClusterManagers"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a66cbf9a",
"metadata": {},
"outputs": [],
"source": [
"using MPIClusterManagers \n",
"using Distributed"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0d63c6b",
"metadata": {},
"outputs": [],
"source": [
"if procs() == workers()\n",
" nw = 3\n",
" manager = MPIWorkerManager(nw)\n",
" addprocs(manager)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0923606",
"metadata": {},
"outputs": [],
"source": [
"# Test cell, remove me\n",
"u = [-1, 0, 0, 0, 0, 1]\n",
"view(u, 6:6)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "68851107",
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"@mpi_do manager begin\n",
" using MPI\n",
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
" nw = MPI.Comm_size(comm)\n",
" iw = MPI.Comm_rank(comm)+1\n",
" function jacobi_mpi(n,niters)\n",
" if mod(n,nw) != 0\n",
" println(\"n must be a multiple of nw\")\n",
" MPI.Abort(comm,1)\n",
" end\n",
" n_own = div(n,nw)\n",
" u = zeros(n_own+2)\n",
" u[1] = -1\n",
" u[end] = 1\n",
" u_new = copy(u)\n",
" for t in 1:niters\n",
" reqs = MPI.Request[]\n",
" # Exchange cell values with neighbors\n",
" if iw != 1\n",
" neig_rank = (iw-1)-1\n",
" req = MPI.Isend(view(u,2:2),comm,dest=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" req = MPI.Irecv!(view(u,1:1),comm,source=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" end\n",
" if iw != nw\n",
" neig_rank = (iw+1)-1\n",
" s = n_own+1\n",
" r = n_own+2\n",
" req = MPI.Isend(view(u,s:s),comm,dest=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" req = MPI.Irecv!(view(u,r:r),comm,source=neig_rank,tag=0)\n",
" push!(reqs,req)\n",
" end\n",
" MPI.Waitall(reqs)\n",
" for i in 2:(n_own+1)\n",
" u_new[i] = 0.5*(u[i-1]+u[i+1])\n",
" end\n",
" u, u_new = u_new, u\n",
" end\n",
" u\n",
" @show u\n",
" # Gather results in root process\n",
" results = zeros(n+2)\n",
" results[1] = -1\n",
" results[n+2] = 1\n",
" MPI.Gather!(view(u,2:n_own+1), view(results, 2:n+1), root=0, comm)\n",
" if iw == 1\n",
" @show results\n",
" end \n",
" end\n",
" niters = 100\n",
" load = 4\n",
" n = load*nw\n",
" jacobi_mpi(n,niters)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "eff25246",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> How many messages per iteration are sent from a process away from the boundary?\n",
"</div>\n",
"\n",
" a) 1\n",
" b) 2\n",
" c) 3\n",
" d) 4\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "98bd9b5e",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d\n",
"jacobi_2_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "075dd6d8",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> After the end of the for-loop (line 43), ...\n",
"</div>\n",
"\n",
" a) each worker holds the complete solution.\n",
" b) the root process holds the solution. \n",
" c) the ghost cells contain redundant values. \n",
" d) all ghost cells contain the initial values -1 and 1. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3b58002",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d\n",
"jacobi_3_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "4537661d",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-success\">\n",
"<b>Question:</b> In line 35 of the code, we wait for all receive and send requests. Is it possible to instead wait for just the receive requests?\n",
"</div>\n",
"\n",
" \n",
" a) No, because the send buffer might be overwritten if we don't wait for send requests.\n",
" b) No, because MPI does not allow an asynchronous send without a Wait().\n",
" c) Yes, because each send has a matching receive, so all requests are done when the receive requests return. \n",
" d) Yes, because there are no writes to the send buffer in this iteration."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e16ea5eb",
"metadata": {},
"outputs": [],
"source": [
"answer = \"x\" # replace x with a, b, c or d.\n",
"jacobi_4_check(answer)"
]
},
{
"cell_type": "markdown",
"id": "c9aa2901",
"metadata": {},
"source": [
"### Latency hiding\n",
"\n",
"Can our implementation above be improved? Note that we only need communications to update the values at the boundary of the portion owned by each process. The other values (the one in green in the figure below) can be updated without communications. This provides the opportunity of overlapping the computation of the interior values (green cells in the figure) with the communication of the ghost values. This technique is called latency hiding, since we are hiding communication latency by overlapping it with communications that we need to do anyway.\n",
"\n",
"The modification of the implementation above to include latency hiding is leaved as an exercise (see below).\n"
]
},
{
"attachments": {
"fig16.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "7d66b1a2",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:fig16.png\" align=\"left\" width=\"450\"/>\n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"id": "47643bf6",