mirror of
https://github.com/smyalygames/FiniteVolumeGPU.git
synced 2025-05-18 06:24:13 +02:00
199 lines
61 KiB
Plaintext
199 lines
61 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"import numpy as np\n",
|
|
"from matplotlib import pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nproc = range(1, 11)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def speedup(t_serial, t):\n",
|
|
" return t_serial/t"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def read_profiling_files():\n",
|
|
" return"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Weak scaling"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/martinls/.conda/envs/ShallowWaterGPU/lib/python3.7/site-packages/ipykernel_launcher.py:10: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
|
|
" # Remove the CWD from sys.path while we load stuff.\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 576x432 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"fig, ax = plt.subplots(figsize=(8,6))\n",
|
|
"\n",
|
|
"#ax.plot(nproc, speedup, label=\"Actual\")\n",
|
|
"\n",
|
|
"ax.plot(nproc, np.ones(len(nproc)), label=\"Ideal (constant)\", linestyle=\"dotted\")\n",
|
|
"\n",
|
|
"ax.set_xlabel(\"Number of cores\")\n",
|
|
"ax.set_ylabel(\"Efficiency\")\n",
|
|
"ax.legend(loc=\"upper left\")\n",
|
|
"fig.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Strong scaling"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def amdahls_speedup(parallel_share, nproc):\n",
|
|
" serial_share = 1.0 - parallel_share\n",
|
|
" return [1.0 / (serial_share + parallel_share / float(n)) for n in nproc]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def gustafsons_speedup(parallel_share, nproc):\n",
|
|
" serial_share = 1.0 - parallel_share\n",
|
|
" return [serial_share + parallel_share * float(n) for n in nproc]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/martinls/.conda/envs/ShallowWaterGPU/lib/python3.7/site-packages/ipykernel_launcher.py:18: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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BXU0owHNZCD2jF6Yk1p/qmN7091uyh59jMrXXsOU6iTjhReIGjsm3M3arc4xNtFFlZSUcN5555Gbm8vQoUMZPXo0H3zwwX7d65VXXmHr1q17fd6KFSsYNGgQgwcPbk5W0hEee+wx+vfvT79+/Xj00UebH6+srGT8+PH06tWL8ePHU1UVOpLwl19+YcCAAQwfPpzVq1cDUF1dzbHHHrvLo1WFEN1XoNpDyWPzcC8NHaZiL4jHFG8Lc6tCGmbPZu2pp1H56qvEnnM2uf/9b6cO2iCBe78ppTjttNMYN24ca9euZe7cubz99tts3rx5v+7X2sD94YcfcuqppzJ//nx69uy5X3XtqyVLlvD8888ze/ZsFi5cyCeffMKqVasAeOCBBzjqqKNYtWoVRx11VHMO73/84x+899573H///TzzzDMA3HvvvUyePLlDDyoQQoSfMcqCKd6O1olyZgfrG3Ddcw8bL7oYlCLz1VdJvfNOjFFR4W7aXkng3k/ffvstFouFP//5z82PZWVlcd111wGhQHzttdc2l5100kl8//33BINBJk2aRP/+/SksLOSRRx7h3XffZc6cOZx//vkMGjQIt9vNPffcw/Dhw+nfvz9XXHEFSik+++wzHn30UV544QWOOOIIGhoaOPHEExk4cCD9+/fnnXfeAeCbb75h8ODBFBYWcumll+L1egHIzs7mzjvvbE4XumLFCgB++OEHBg0a1NyTr6ura/G9Ll++nFGjRhEREYHJZOKwww5rHln46KOPuPjiiwG4+OKL+fDDDwEwm8243W4aGxsxm82sWbOGLVu2cNhhh7XDb0MI0dnojX6qP12L8utoJgOJk/phy+scq7Lrf/mFdaecQtWMt4m/+CJyP/qQyJEjwt2sVusWc9yu++/Hu3xFm97T2qc3zsmTd1u+dOnS5hSe+2LBggVs2bKFJUuWAKHh49jYWJ588kkefvhhhg0LHZRz7bXXNqfNvPDCC/nkk084+eST+fOf/0xUVBQ333wz7733HmlpaXz66adA6Ixzj8fDpEmT+Oabb8jPz+eiiy7imWee4f/+7/8ASExMZN68eTz99NM8/PDDvPDCCzz88MM89dRTjBkzhvr6emy2lkNY/fv3Z8qUKVRUVGC32/nss8+a21lSUkJqaioAqamplJaWAnD77bdzxRVXYLfbef3117n55pu599579/nnJYTomnyb66n/dSu2grhOE7CDtbWUPPggNe++hyUnh6w33yRiyOBwN2ufSY+7jVxzzTUMHDiQ4cOH7/F5ubm5rF27luuuu44vvvgCx25WLH733XeMHDmSwsJCvv32W5YuXbrTcwoLC/n666+59dZb+emnn4iJiaGoqIicnBzy8/OBUC/4xx9/bL7mjDPOAFqmBB0zZgw33ngjjz/+ONXV1ZhMLd/P9enTh1tvvZXx48dz3HHHMXDgwJ2e80eDBg1i5syZfPfdd6xdu5a0tDSUUpx99tlccMEFzWlKhRDdh9IVvi31QOis8dRbhneaoF33/fesPfkUat7/gIQ/XU7Ohx90yaAN3aTHvaeecXvp168f7733XvPXTz31FOXl5c09UZPJhK7rzeXb0nLGxcWxcOFC/ve///HUU0/x73//m5deeqnFvT0eD1dffTVz5swhIyODu+66q/n6HeXn5zN37lw+++wzbr/9do455pidsnn90ba0oEajsTm96G233caJJ57IZ599xqhRo/j66693Smxy2WWXcdlllwEwefJk0tPTAUhJSaG4uJjU1FSKi4tJTk5ucZ1SiunTp/POO+9w7bXXcvfdd7N+/Xoef/xx7rvvvj22VQjRtdT+bz31v24l5eZhmGKsGGOse7+onQWqqij529+o/e/HWHv1Iv3JJ7AXFoa7WQdEetz76cgjj8Tj8TQvvAJapLbMzs5mwYIF6LrOpk2bmD17NgDl5eXous6ECRO49957mTdvHgDR0dHNc8vbgnRiYiL19fW8++67u2zD1q1biYiI4IILLuDmm29m3rx59O7dm/Xr1zev5H799df3Oq+8Zs0aCgsLufXWWxk2bFjz3PeOtg2Bb9y4kffff59zzz0XgFNOOYVXX30VgFdffZVTTz21xXWvvvoqJ554InFxcTQ2NmIwGCQNqBDdjNJDO0WixqQRe0YvjA5LmFsUUvvll6w9+RRqP/ucxKuvJvu9d7t80IZu0uMOB03T+PDDD/nLX/7Cgw8+SFJSEpGRkfz9738HQsPPOTk5FBYW0r9//+b58C1btnDJJZc098b/9re/ATBp0iT+/Oc/Y7fb+e233/jTn/5EYWEh2dnZux1+X7x4MX/9618xGAyYzWaeeeYZbDYbL7/8MmeddRaBQIDhw4e3WEC3K48++ijfffcdRqORvn37cvzxx+/0nAkT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",
|
|
"text/plain": [
|
|
"<Figure size 576x432 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"fig, ax = plt.subplots(figsize=(8,6))\n",
|
|
"\n",
|
|
"#ax.plot(nproc, speedup, label=\"Actual\")\n",
|
|
"\n",
|
|
"ax.plot(nproc, amdahls_speedup(0.9, nproc), label=\"Amdahls 90%\", linestyle=\"dashed\")\n",
|
|
"ax.plot(nproc, amdahls_speedup(0.5, nproc), label=\"Amdahls 50%\", linestyle=\"dashed\")\n",
|
|
"ax.plot(nproc, amdahls_speedup(0.1, nproc), label=\"Amdahls 10%\", linestyle=\"dashed\")\n",
|
|
"\n",
|
|
"ax.plot(nproc, gustafsons_speedup(0.9, nproc), label=\"Gustafsons 90%\")\n",
|
|
"ax.plot(nproc, gustafsons_speedup(0.5, nproc), label=\"Gustafsons 50%\")\n",
|
|
"ax.plot(nproc, gustafsons_speedup(0.1, nproc), label=\"Gustafsons 10%\")\n",
|
|
"\n",
|
|
"ax.plot(nproc, nproc, label=\"Ideal (linear)\", linestyle=\"dotted\")\n",
|
|
"\n",
|
|
"ax.set_xlabel(\"Number of cores\")\n",
|
|
"ax.set_ylabel(\"Speedup\")\n",
|
|
"ax.legend(loc=\"upper left\")\n",
|
|
"fig.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"interpreter": {
|
|
"hash": "03b7d1ad70da1aa36a01b3a4151457300569898b0e94ac4fd185ad5685456ae1"
|
|
},
|
|
"kernelspec": {
|
|
"display_name": "Python 3.7.12 ('ShallowWaterGPU')",
|
|
"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.7.12"
|
|
},
|
|
"orig_nbformat": 4
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|