mirror of
https://github.com/smyalygames/FiniteVolumeGPU.git
synced 2025-05-18 06:24:13 +02:00
521 lines
108 KiB
Plaintext
521 lines
108 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"import json\n",
|
||
"import pandas as pd\n",
|
||
"from matplotlib import pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"nproc = range(1, 17)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def speedup(t_serial, t):\n",
|
||
" return t_serial/t"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" dt n_cuda_devices n_processes n_time_steps nx ny \\\n",
|
||
"11 0.00001 1 1 202.0 4096.0 4096.0 \n",
|
||
"7 0.00001 2 2 202.0 4096.0 4096.0 \n",
|
||
"14 0.00001 3 3 202.0 4096.0 4096.0 \n",
|
||
"0 0.00001 4 4 202.0 4096.0 4096.0 \n",
|
||
"5 0.00001 5 5 202.0 4096.0 4096.0 \n",
|
||
"8 0.00001 6 6 202.0 4096.0 4096.0 \n",
|
||
"2 0.00001 7 7 202.0 4096.0 4096.0 \n",
|
||
"1 0.00001 8 8 202.0 4096.0 4096.0 \n",
|
||
"15 0.00001 9 9 202.0 4096.0 4096.0 \n",
|
||
"9 0.00001 10 10 202.0 4096.0 4096.0 \n",
|
||
"6 0.00001 11 11 202.0 4096.0 4096.0 \n",
|
||
"12 0.00001 12 12 202.0 4096.0 4096.0 \n",
|
||
"3 0.00001 13 13 202.0 4096.0 4096.0 \n",
|
||
"4 0.00001 14 14 202.0 4096.0 4096.0 \n",
|
||
"10 0.00001 15 15 202.0 4096.0 4096.0 \n",
|
||
"13 0.00001 16 16 202.0 4096.0 4096.0 \n",
|
||
"\n",
|
||
" outfile slurm_job_id t_init \\\n",
|
||
"11 /work/martinls/220879/ShallowWaterGPU/mpi_out_... 220879.0 5.507971 \n",
|
||
"7 /work/martinls/220880/ShallowWaterGPU/mpi_out_... 220880.0 5.721808 \n",
|
||
"14 /work/martinls/220881/ShallowWaterGPU/mpi_out_... 220881.0 5.717571 \n",
|
||
"0 /work/martinls/220882/ShallowWaterGPU/mpi_out_... 220882.0 6.074582 \n",
|
||
"5 /work/martinls/220883/ShallowWaterGPU/mpi_out_... 220883.0 6.108083 \n",
|
||
"8 /work/martinls/220884/ShallowWaterGPU/mpi_out_... 220884.0 5.634954 \n",
|
||
"2 /work/martinls/220885/ShallowWaterGPU/mpi_out_... 220885.0 5.070476 \n",
|
||
"1 /work/martinls/220886/ShallowWaterGPU/mpi_out_... 220886.0 4.180240 \n",
|
||
"15 /work/martinls/220887/ShallowWaterGPU/mpi_out_... 220887.0 4.341784 \n",
|
||
"9 /work/martinls/220888/ShallowWaterGPU/mpi_out_... 220888.0 5.299585 \n",
|
||
"6 /work/martinls/220889/ShallowWaterGPU/mpi_out_... 220889.0 6.026560 \n",
|
||
"12 /work/martinls/220890/ShallowWaterGPU/mpi_out_... 220890.0 6.275554 \n",
|
||
"3 /work/martinls/220891/ShallowWaterGPU/mpi_out_... 220891.0 7.103848 \n",
|
||
"4 /work/martinls/220892/ShallowWaterGPU/mpi_out_... 220892.0 8.413395 \n",
|
||
"10 /work/martinls/220893/ShallowWaterGPU/mpi_out_... 220893.0 9.477692 \n",
|
||
"13 /work/martinls/220894/ShallowWaterGPU/mpi_out_... 220894.0 9.881657 \n",
|
||
"\n",
|
||
" t_nc_write t_sim_init t_sim_mpi_init t_step t_step_mpi \\\n",
|
||
"11 3.687433 41.936742 0.002744 1.654766 1.635376 \n",
|
||
"7 3.692994 22.107036 0.002273 23.791452 1.607910 \n",
|
||
"14 3.710237 37.115577 0.002727 10.057041 1.693726 \n",
|
||
"0 3.825206 45.152544 0.002787 1.858922 1.732544 \n",
|
||
"5 3.833911 45.100539 0.002747 1.893753 1.798096 \n",
|
||
"8 3.779569 21.815326 0.003427 20.156193 1.755737 \n",
|
||
"2 3.902169 41.552375 0.003021 1.923522 1.733032 \n",
|
||
"1 3.880948 25.252051 0.003020 1.858470 1.778198 \n",
|
||
"15 3.870645 25.595168 0.002387 1.857388 1.771851 \n",
|
||
"9 3.858673 25.574244 0.003054 1.863774 1.784302 \n",
|
||
"6 3.944965 26.100656 0.002582 1.899902 1.745728 \n",
|
||
"12 3.932847 29.110549 0.003453 4.618246 1.801758 \n",
|
||
"3 3.973085 33.206754 0.003094 1.944592 1.778198 \n",
|
||
"4 3.987867 28.638798 0.003963 2.088098 1.781616 \n",
|
||
"10 3.998516 28.688051 0.002921 1.876371 1.801880 \n",
|
||
"13 3.955760 30.579091 0.002603 1.924463 1.780518 \n",
|
||
"\n",
|
||
" t_step_mpi_halo_exchange t_step_mpi_halo_exchange_download \\\n",
|
||
"11 0.0 0.038208 \n",
|
||
"7 0.0 0.040833 \n",
|
||
"14 0.0 0.039368 \n",
|
||
"0 0.0 0.038696 \n",
|
||
"5 0.0 0.037964 \n",
|
||
"8 0.0 0.038269 \n",
|
||
"2 0.0 0.038757 \n",
|
||
"1 0.0 0.038025 \n",
|
||
"15 0.0 0.037292 \n",
|
||
"9 0.0 0.037842 \n",
|
||
"6 0.0 0.038269 \n",
|
||
"12 0.0 0.037842 \n",
|
||
"3 0.0 0.037415 \n",
|
||
"4 0.0 0.038818 \n",
|
||
"10 0.0 0.038269 \n",
|
||
"13 0.0 0.038330 \n",
|
||
"\n",
|
||
" t_step_mpi_halo_exchange_sendreceive t_step_mpi_halo_exchange_upload \\\n",
|
||
"11 0.016968 0.039429 \n",
|
||
"7 0.159668 0.046143 \n",
|
||
"14 0.139648 0.041931 \n",
|
||
"0 0.083252 0.044800 \n",
|
||
"5 0.036621 0.040771 \n",
|
||
"8 0.090393 0.043579 \n",
|
||
"2 0.100586 0.042480 \n",
|
||
"1 0.054260 0.041016 \n",
|
||
"15 0.061646 0.039795 \n",
|
||
"9 0.066345 0.039734 \n",
|
||
"6 0.152771 0.040283 \n",
|
||
"12 0.051697 0.040100 \n",
|
||
"3 0.163818 0.039673 \n",
|
||
"4 0.111450 0.041382 \n",
|
||
"10 0.072327 0.040405 \n",
|
||
"13 0.062927 0.041321 \n",
|
||
"\n",
|
||
" t_total \n",
|
||
"11 53.170382 \n",
|
||
"7 55.784859 \n",
|
||
"14 57.047498 \n",
|
||
"0 57.329107 \n",
|
||
"5 57.349928 \n",
|
||
"8 51.902805 \n",
|
||
"2 52.942312 \n",
|
||
"1 35.602447 \n",
|
||
"15 36.094733 \n",
|
||
"9 36.997667 \n",
|
||
"6 38.400811 \n",
|
||
"12 44.374620 \n",
|
||
"3 46.639225 \n",
|
||
"4 43.558686 \n",
|
||
"10 44.496923 \n",
|
||
"13 46.773383 \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def read_profiling_files(profile_dir_path=\".\"):\n",
|
||
" profiling_data = pd.DataFrame()\n",
|
||
"\n",
|
||
" json_filenames = [file for file in os.listdir(profile_dir_path) if file.endswith(\"_profiling.json\")]\n",
|
||
"\n",
|
||
" for json_filename in json_filenames:\n",
|
||
" with open(os.path.join(profile_dir_path, json_filename)) as json_file:\n",
|
||
" profiling_data = profiling_data.append(json.load(json_file), ignore_index=True)\n",
|
||
"\n",
|
||
" profiling_data.n_processes = profiling_data.n_processes.astype(int)\n",
|
||
" profiling_data = profiling_data.sort_values(by=[\"n_processes\"])\n",
|
||
"\n",
|
||
" return profiling_data\n",
|
||
"\n",
|
||
"profiling_data = read_profiling_files(\"output_dgx-2/2022-04-26T155207/\")\n",
|
||
"print(profiling_data)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Weak scaling"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.083251953125\n",
|
||
"11 0.016968\n",
|
||
"7 0.159668\n",
|
||
"14 0.139648\n",
|
||
"0 0.083252\n",
|
||
"5 0.036621\n",
|
||
"8 0.090393\n",
|
||
"2 0.100586\n",
|
||
"1 0.054260\n",
|
||
"15 0.061646\n",
|
||
"9 0.066345\n",
|
||
"6 0.152771\n",
|
||
"12 0.051697\n",
|
||
"3 0.163818\n",
|
||
"4 0.111450\n",
|
||
"10 0.072327\n",
|
||
"13 0.062927\n",
|
||
"Name: t_step_mpi_halo_exchange_sendreceive, dtype: float64\n",
|
||
"11 4.906475\n",
|
||
"7 0.521407\n",
|
||
"14 0.596154\n",
|
||
"0 1.000000\n",
|
||
"5 2.273333\n",
|
||
"8 0.920999\n",
|
||
"2 0.827670\n",
|
||
"1 1.534308\n",
|
||
"15 1.350495\n",
|
||
"9 1.254830\n",
|
||
"6 0.544946\n",
|
||
"12 1.610390\n",
|
||
"3 0.508197\n",
|
||
"4 0.746988\n",
|
||
"10 1.151055\n",
|
||
"13 1.322987\n",
|
||
"Name: t_step_mpi_halo_exchange_sendreceive, dtype: float64\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"<ipython-input-39-a38b1f547255>:23: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
|
||
" fig.show()\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAegAAAFzCAYAAAD18ZqMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABvPElEQVR4nO3dd3iUxfbA8e+k94SQSiihk0BIqGIDRERQRLEBKorYsPfuvf6uV71YUSzYUVGxoChYsNBBpQQCBALSAoSaBNJ7dn5/zCYESEjd7CY5n+fJs+3d9z2bbPbszDtzRmmtEUIIIYRjcbJ3AEIIIYQ4lSRoIYQQwgFJghZCCCEckCRoIYQQwgFJghZCCCEckCRoIYQQwgG52DuAioKCgnRkZKS9wxBCCCEaRXx8fJrWOriyxxwqQUdGRrJ27Vp7hyGEEEI0CqXUnqoeky5uIYQQwgFJghZCCCEckCRoIYQQwgHZ9By0UioZyAZKgRKtdf/a7qO4uJiUlBQKCgoaOjzRSDw8PGjbti2urq72DkUIIZqMxhgkdp7WOq2uT05JScHX15fIyEiUUg0Zl2gEWmvS09NJSUmhY8eO9g5HCCGaDIfv4i4oKKB169aSnJsopRStW7eWHhAhhKglWydoDfymlIpXSt1a151Icm7a5O8nhBC1Z+sEfY7Wui8wCrhTKTX45A2UUrcqpdYqpdampqbaOJzaSU9PJy4ujri4OMLCwoiIiCi/XVRUdMK2r732Gnl5edXuc+jQoTLXWwghRLVsmqC11vutl0eAucDASrZ5T2vdX2vdPzi40mIqdtO6dWsSEhJISEhgypQp3H///eW33dzcTti2pglaCCGEqAmbJWillLdSyrfsOjACSLTV8RrLwoUL6dOnDzExMUyePJnCwkKmT5/OgQMHOO+88zjvvPMAuP322+nfvz89e/bk6aeftnPUQgghmhpbjuIOBeZazz+6AF9orRfUZ4f/mb+ZLQeyGiK2ctFt/Hj6kp412ragoIBJkyaxcOFCunXrxvXXX8+MGTO47777ePXVV1m8eDFBQUEAPPfccwQGBlJaWsr555/Pxo0b6d27d4PGLoQQovmyWQtaa71Lax1r/emptX7OVseqPIBS0JYG3WVpaSkdO3akW7duANxwww0sW7as0m2//vpr+vbtS58+fdi8eTNbtmxp0FiEEEI0bw61WEZ1atrSBeBQIrj7QqsOtguoCrt37+bll19mzZo1tGrVikmTJsk0IyGEELXi8POg68zZFSzFDbtLZ2eSk5PZsWMHALNmzWLIkCEA+Pr6kp2dDUBWVhbe3t74+/tz+PBhfvnllwaNQwghRPPXpFrQteLkCqWFDbpLDw8PZs6cyVVXXUVJSQkDBgxgypQpANx6662MHDmSNm3asHjxYvr06UOPHj1o164dZ599doPGIYQQovlTWmt7x1Cuf//++uQ5wklJSURFRdV+Zxn7IP8YhMvALEdQ57+jEEI0Y0qp+KrWqWjeXdy6FCwNO1BMCCGEaAzNN0E7WXvvG/g8tBBCCNEYmm+CdrZW+iqVBC2EEKLpacYJWlrQQgghmq7mm6CdXM1laYl94xBCCCHqoBknaBdASQtaCCFEk9R8E7RSJkk3wDlopRTXXXdd+e2SkhKCg4MZPXo0AB9//DHBwcHExcURHR3N+++/X37/XXfdVe/j10RycjK9evU64b5+/fpRWNiwc8GFEEI0juaboMFMtWqABO3t7U1iYiL5+fkA/P7770RERJywzbhx40hISGDJkiU88cQTHD58uN7HrY/du3cTERGBu7v7CfeXlpbaKSIhhBC10fwTdAN1cV900UX89NNPAMyePZsJEyZUul1ISAidO3dmz549Ve5r6dKlxMXFERcXR58+fcpLhL700ksMGDCA3r17ly9RmZycTFRUFLfccgs9e/ZkxIgR5V8U4uPjiY2NJTY2lrfeeuuEYyxYsICRI0cC4OPjw4MPPkhsbCx//fUXn332GQMHDiQuLo7bbrutPGkvWLCAvn37Ehsby/nnn4/FYiEyMpKMjIzy/Xbt2tXuXz6EEKIlaFqlPn95DA5tqvn2JQVgKQE3n6q3CYuBUVOr3dX48eN55plnGD16NBs3bmTy5MksX778lO127drFrl276NKlS5UrWL388su89dZbnH322eTk5ODh4cFvv/3G9u3bWb16NVprxowZw7Jly2jfvj3bt29n9uzZvP/++1x99dV8++23XHfdddx44428+eabDB48mIcffviEYyxYsIBp06YBkJubyxlnnMErr7xCUlISL7zwAitXrsTV1ZU77riDzz//nFGjRnHLLbewbNkyOnbsyNGjR3FycuLSSy9l7ty53HjjjaxatYoOHToQGhpa7e9LCCFE/TTvFrRyArT1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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",
|
||
"# FIXME! Sort AND give new indices\n",
|
||
"print(profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"][0])\n",
|
||
"print(profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"])\n",
|
||
"print(speedup(profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"][0], profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"]))\n",
|
||
"\n",
|
||
"ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_total\"][0], profiling_data[\"t_total\"]), label=\"Total\")\n",
|
||
"\n",
|
||
"ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"][0], profiling_data[\"t_step_mpi_halo_exchange_sendreceive\"]), label=\"MPI send/recv\")\n",
|
||
"\n",
|
||
"ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_step\"][0], profiling_data[\"t_step\"]), label=\"Simulate\")\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/GPUs\")\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": 6,
|
||
"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": 7,
|
||
"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": [
|
||
"<ipython-input-21-765ec13cd331>:25: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
|
||
" fig.show()\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(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_total\"][0], profiling_data[\"t_total\"]), label=\"Total\")\n",
|
||
"\n",
|
||
"ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_step_mpi_halo_exchange\"][0], profiling_data[\"t_step_mpi_halo_exchange\"]), label=\"MPI\")\n",
|
||
"\n",
|
||
"ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(profiling_data[\"t_step_mpi\"][0], profiling_data[\"t_step_mpi\"]), label=\"Simulate\")\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/GPUs\")\n",
|
||
"ax.set_ylabel(\"Speedup\")\n",
|
||
"ax.legend(loc=\"upper left\")\n",
|
||
"fig.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"bar_width = 0.8\n",
|
||
"\n",
|
||
"share_init = (profiling_data[\"t_init\"]+profiling_data[\"t_sim_init\"])/profiling_data[\"t_total\"]\n",
|
||
"share_mpi = profiling_data[\"t_step_mpi_halo_exchange\"]/profiling_data[\"t_total\"]\n",
|
||
"share_simulate = profiling_data[\"t_step_mpi\"]/profiling_data[\"t_total\"]\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_init, color='red', edgecolor='white', width=bar_width, label=\"Init\")\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_mpi, bottom=share_init, color='orange', edgecolor='white', width=bar_width, label=\"MPI\")\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_simulate, bottom=share_init+share_mpi , color='green', edgecolor='white', width=bar_width, label=\"Simulate\")\n",
|
||
"\n",
|
||
"plt.xlabel(\"Number of cores/GPUs\")\n",
|
||
"plt.ylabel(\"Share of normalized runtime\")\n",
|
||
"plt.legend(loc=\"upper left\")\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"bar_width = 0.8\n",
|
||
"\n",
|
||
"share_init = (profiling_data[\"t_init\"]+profiling_data[\"t_sim_init\"])\n",
|
||
"share_mpi = profiling_data[\"t_step_mpi_halo_exchange\"]\n",
|
||
"share_simulate = profiling_data[\"t_step_mpi\"]\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_init, color='red', edgecolor='white', width=bar_width, label=\"Init\")\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_mpi, bottom=share_init, color='orange', edgecolor='white', width=bar_width, label=\"MPI\")\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_simulate, bottom=share_init+share_mpi , color='green', edgecolor='white', width=bar_width, label=\"Simulate\")\n",
|
||
"\n",
|
||
"plt.xlabel(\"Number of cores/GPUs\")\n",
|
||
"plt.ylabel(\"Runtime (s)\")\n",
|
||
"plt.legend(loc=\"upper right\")\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"bar_width = 0.8\n",
|
||
"\n",
|
||
"share_init = (profiling_data[\"t_init\"]+profiling_data[\"t_sim_init\"])\n",
|
||
"share_mpi = profiling_data[\"t_step_mpi_halo_exchange\"]\n",
|
||
"share_simulate = profiling_data[\"t_step\"]\n",
|
||
"\n",
|
||
"\n",
|
||
"plt.bar(profiling_data[\"n_processes\"], \n",
|
||
" share_simulate, color='green', edgecolor='white', width=bar_width, label=\"Simulate\")\n",
|
||
"\n",
|
||
"plt.xlabel(\"Number of cores/GPUs\")\n",
|
||
"plt.ylabel(\"Runtime (s)\")\n",
|
||
"plt.legend(loc=\"upper right\")\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. ~~Sjekk opp behandling av randvilkår. Fungerer ikke som det skal. Offset-problematikk. Få periodiske render til å funke med 1 (først hele domenet, så indre og yttre domene) og 2 subdomener.~~\n",
|
||
"2. Sjekk overføringer east-west. Kan vi droppe? – Ja, men se punkt 1.\n",
|
||
"3. ~~Sjekk IC-bug? Bare to felter i K-H?!~~\n",
|
||
"4. ~~Kjør lenger kjøring~~\n",
|
||
"5. Sjekk på OsloMet-boks!\n",
|
||
"6. Sjekk reproduserbarhet av løsning\n",
|
||
"7. Ny profilering og sjekk av parallelkjøring"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"interpreter": {
|
||
"hash": "d80e56d67bdb125526bdf12740b058f9c8b2e6eb30981cd0c9aaae49693d1172"
|
||
},
|
||
"kernelspec": {
|
||
"display_name": "ShallowWaterGPU_HPC",
|
||
"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.8.8"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|