{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Parallel performance of a simple Python code\n", "Here is a summary of the results from running the `mpi.py´ program." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['figure.figsize'] = [12,6]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Lars\n", "nprocL = [256, 128, 64, 32, 16, 320]\n", "tsecL = [1.253, 1.566, 2.224, 3.567, 6.411, 1.071]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Ville\n", "nprocV = [400, 256, 128, 64, 32, 16, 8, 4, 2]\n", "tsecV = [0.972, 1.249, 1.569, 2.260, 3.633, 6.221, 11.036, 19.732, 47.045]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Isabel\n", "nprocI = [32, 64, 100, 100, 128, 200, 250, 256, 320, 320]\n", "tsecI = [4.001, 2.248, 1.590, 1.589, 1.606, 1.142, 1.211, 1.287, 1.083, 1.075]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Aleksi\n", "nprocA = [8, 16, 32, 64, 128, 256, 400]\n", "tsecA = [10.762, 6.265, 3.550, 2.229, 1.563, 1.266, 0.951]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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nHN49dVXAe/s3YUXXsh5553Heeedx/vvvw/AW2+9Rd++fRkzZgxdunQBYNiwYXTv3p1OnToxb968Uo+/uNgLFD5zOGHCBOLj44mPj+fkk0/m7rvv5sCBA/Tr14/zzjuPLl26HGmbb7/9drZu3Up8fDxTp049qp6cnByuvfZaunTpQrdu3XjzzTcBrz0fPnw4l1xyCWeffTa/+c1vQvkRllntm52j4Ju64JRKwTc1QPCXVESq3rRpP/5ZFsjO9srD9ac5a9YsvvzySxo1akRWVhYAKSkpJCYmMn/+fLKysujZsyf9+/cHYPXq1WzcuFHJskgN1KdPn+PKrrjiCiZOnEh2djY///nPj3t/3LhxjBs3jl27dh03ROCtt94Ked95eXn861//4pJLLmHz5s38/e9/57333qNBgwZMnDiRQCDA1VdfzcGDB+ncuTP33HMPAJ9//jmXXXYZI0eOZOXKlXz22Wd8+OGHOOcYMmQI77zzDi1btiQlJYX33nuPVq1asWfPHlq0aMGQIUOObFuUtLQ03n77bbZu3Urfvn35/PPPad26Nf/+97+JjIzks88+48orr2Tt2rUAfPjhh2zatOnIbBXz58+nRYsWHDp0iB49ejBixAhatmxZ5L6Ki/2iiy4qcv2nnnoKgPT0dAYNGsS4ceOIjIxkyZIlNGvWjF27dnH++eczZMgQZs2axaZNm0hNTT1yXAUef/xxAD766CO2bNnCwIED+d///gdAamoq69evp1GjRpx77rncdNNNnHHGGSH/TENR+5JoP76pRaRUGRllKw9FcReGFJTHxcWRlJTEsGHDGDZsGOA19suWLTsybjonJ4eMYBADBgxQAi0iITt06BDx8fGA1xN93XXXMW/ePNatW0ePHj2OrNO6dWvAG0M9YsSIIutauXIlK1eupFu3bgAcOHCAzz77jA0bNjBy5EhatWoFEHIbdcUVVxAREcHZZ5/NWWedxZYtWzjzzDO58cYbSU1NpV69ekcSToCePXseNd3bnDlzWLJkCQDbtm3js88+KzGJLir24pJo8NreUaNG8dhjjxETE0Nubi6/+93veOedd4iIiGD79u188803JR7ju+++y0033QRA+/btiYmJOXJM/fr148QTTwSgY8eOpKenK4kuVTi+qUWkwqKjvRNDRZWXV8uWLdm7d+9RZXv27DnyRbB8+XLeeecdli1bxu9//3s+/vhjnHMsXryYc88996jtPvjgAxo3blz+YETEVyX1HEdFRZX4fqtWrcrU81ygYEx0Yc45rrnmGu6///7j1o+MjKRevXpF1uWc44477uD6668/qnzOnDnlmkni2G3MjIcffphTTjmFDRs2cPjwYSIjI4+8X7j9e+utt3j99ddZvXo1UVFR9OnTp8Tp4IqLvSQ33HADw4cPP3ImMBAIsHPnTtatW0eDBg2IjY0tdQo651yx7zVq1OjI63r16hV5rUtF1b4x0cV9I1fkm1pEKiwlBaKiji6LivLKy6tJkya0adOGVatWAV4CvWLFCnr37s3hw4fZtm0bffv2Zfbs2WRlZXHgwAEGDRrE3LlzjzS+69evL38AIiLH6NevHy+99BLffvst4LVL6UX1IBxj0KBBzJ8/nwMHDgCwfft2vv32W/r168cLL7zA7t27j9QH0LRpU/bv319sfS+++CKHDx9m69atfPHFF5x77rns27ePNm3aEBERwXPPPVfsRYT79u3jpJNOIioqii1btrBmzZpyxV6cxx9/nP3793P77bcftc/WrVvToEED3nzzzSOfWUnHedFFFxEIXljzv//9j4yMjOM6SMKp9iXR4fimFpEKS0qCefMgJgbMvOd58yo+ymrhwoXce++9xMfHk5iYyIwZM2jXrh35+fmMHTv2yAUnt956K82bN2f69Onk5uYSFxdH586dmT59ekj7ufLKK7ngggv49NNPadu2LU8//XTFAheRWqljx47ce++9DBw4kLi4OAYMGMCOHTtK3W7gwIGMGTOGCy64gC5dujBy5Ej2799Pp06dmDZtGhdffDFdu3ZlypQpAIwePZo//OEPdOvW7bgLCwHOPfdcLr74Yi699FKefPJJIiMjmThxIs8++yznn38+//vf/4o9+3bJJZeQl5dHXFwc06dP5/zzzy9X7MV58MEH+eijj45cXPjkk0+SlJTE2rVrSUhIIBAI0L59e8A74/izn/2Mzp07M3Xq1KPqmThxIvn5+XTp0oVf/vKXLFiw4Kge6HCzkrrCq4uEhARXMPA9JIGANwY6I8PrgU5J0XhokTDYvHkzHTp08DuMaqOoz8PM1jnnEnwKyRdlbrNFykHtT/HGjRtX4kWH4qlom137xkSDlzAraRYRERGRMKmdSbSIiIhIHbVgwQK/Q6gTat+YaBERERGR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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Convert to NumPy arrays\n", "nprocL = np.array(nprocL)\n", "tsecL = np.array(tsecL)\n", "nprocV = np.array(nprocV)\n", "tsecV = np.array(tsecV)\n", "nprocI = np.array(nprocI)\n", "tsecI = np.array(tsecI)\n", "nprocA = np.array(nprocA)\n", "tsecA = np.array(tsecA)\n", "\n", "# Plot data\n", "f, (ax1, ax2) = plt.subplots(1, 2)\n", "ax1.plot(nprocL, tsecL, 'bo', label='User 1')\n", "ax1.plot(nprocV, tsecV, 'ro', label='User 2')\n", "ax1.plot(nprocI, tsecI, 'ko', label='User 3')\n", "ax1.plot(nprocA, tsecA, 'go', label='User 4')\n", "ax1.set_xlabel('Number of cores')\n", "ax1.set_ylabel('Calculation time [s]')\n", "ax1.set_title('Raw parallel performance')\n", "ax1.legend()\n", "\n", "# Find bounds for reference parallel performance line\n", "minx = min(nprocL.min(), nprocV.min(), nprocI.min(), nprocA.min())\n", "miny = min(tsecL.min(), tsecV.min(), tsecI.min(), tsecA.min())\n", "maxy = max(tsecL.max(), tsecV.max(), tsecI.max(), tsecA.max())\n", "maxx = minx + (maxy - miny)\n", "ax2.plot([np.log2(minx), np.log2(maxx)], [np.log2(maxy), np.log2(miny)], 'k--', label='Perfect parallelization')\n", "\n", "ax2.plot(np.log2(nprocL), np.log2(tsecL), 'bo', label='User 1')\n", "ax2.plot(np.log2(nprocV), np.log2(tsecV), 'ro', label='User 2')\n", "ax2.plot(np.log2(nprocI), np.log2(tsecI), 'ko', label='User 3')\n", "ax2.plot(np.log2(nprocA), np.log2(tsecA), 'go', label='User 4')\n", "\n", "ax2.axis('equal')\n", "ax2.set_xlabel('log$_{2}$(Number of cores)')\n", "ax2.set_ylabel('log$_{2}$(Calculation time) [s]')\n", "ax2.set_title('Log$_{2}$ parallel performance')\n", "ax2.legend()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }