mirror of
https://github.com/smyalygames/FiniteVolumeGPU.git
synced 2025-05-18 06:24:13 +02:00
672 lines
127 KiB
Plaintext
672 lines
127 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"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": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"nproc = range(1, 17)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def speedup(t_serial, t):\n",
|
||
" return t_serial/t"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"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",
|
||
" profiling_data = profiling_data.sort_values(by=[\"n_processes\"], 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\"], ignore_index=True)\n",
|
||
"\n",
|
||
" return profiling_data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Weak scaling"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" t_init t_total outfile \\\n",
|
||
"0 14.511714 181.754037 /work/martinls/232557/ShallowWaterGPU/mpi_out_... \n",
|
||
"1 15.153404 188.838794 /work/martinls/232558/ShallowWaterGPU/mpi_out_... \n",
|
||
"2 15.607471 190.535054 /work/martinls/232589/ShallowWaterGPU/mpi_out_... \n",
|
||
"3 15.332916 188.146165 /work/martinls/232590/ShallowWaterGPU/mpi_out_... \n",
|
||
"4 15.941363 193.263406 /work/martinls/232591/ShallowWaterGPU/mpi_out_... \n",
|
||
"5 16.805506 194.776481 /work/martinls/232592/ShallowWaterGPU/mpi_out_... \n",
|
||
"6 18.009921 198.615131 /work/martinls/232593/ShallowWaterGPU/mpi_out_... \n",
|
||
"7 17.990572 199.018155 /work/martinls/232594/ShallowWaterGPU/mpi_out_... \n",
|
||
"8 19.366701 202.898836 /work/martinls/232595/ShallowWaterGPU/mpi_out_... \n",
|
||
"9 19.890607 205.122811 /work/martinls/232596/ShallowWaterGPU/mpi_out_... \n",
|
||
"10 20.974516 207.287065 /work/martinls/232597/ShallowWaterGPU/mpi_out_... \n",
|
||
"11 21.358601 209.105944 /work/martinls/232598/ShallowWaterGPU/mpi_out_... \n",
|
||
"12 22.813077 211.172879 /work/martinls/232599/ShallowWaterGPU/mpi_out_... \n",
|
||
"13 23.636758 212.722331 /work/martinls/232600/ShallowWaterGPU/mpi_out_... \n",
|
||
"14 23.983026 214.176335 /work/martinls/232601/ShallowWaterGPU/mpi_out_... \n",
|
||
"15 24.996966 216.951382 /work/martinls/232602/ShallowWaterGPU/mpi_out_... \n",
|
||
"\n",
|
||
" t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n",
|
||
"0 10.661480 113.172576 42.137838 0.0 \n",
|
||
"1 11.083883 118.234985 43.038861 0.0 \n",
|
||
"2 11.338173 118.849141 43.378157 0.0 \n",
|
||
"3 11.166394 116.970772 43.362903 0.0 \n",
|
||
"4 11.167876 121.090511 43.696337 0.0 \n",
|
||
"5 11.125732 122.019746 43.435468 0.0 \n",
|
||
"6 11.410769 124.265493 43.508696 0.0 \n",
|
||
"7 11.951049 123.907622 43.785883 0.0 \n",
|
||
"8 11.861801 126.177618 44.059032 0.0 \n",
|
||
"9 12.045421 127.249941 44.542234 0.0 \n",
|
||
"10 12.357193 128.412160 44.133266 0.0 \n",
|
||
"11 12.668238 129.337771 44.327086 0.0 \n",
|
||
"12 12.733378 129.754346 44.384927 0.0 \n",
|
||
"13 12.836023 130.674045 44.157766 0.0 \n",
|
||
"14 13.105231 131.080429 44.535530 0.0 \n",
|
||
"15 13.106097 133.506058 43.892579 0.0 \n",
|
||
"\n",
|
||
" t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n",
|
||
"0 41.482056 0.042358 \n",
|
||
"1 41.775146 0.042603 \n",
|
||
"2 41.762573 0.041992 \n",
|
||
"3 41.740112 0.041138 \n",
|
||
"4 41.728638 0.043213 \n",
|
||
"5 41.725586 0.044678 \n",
|
||
"6 41.731934 0.044067 \n",
|
||
"7 41.630493 0.043823 \n",
|
||
"8 41.810547 0.044678 \n",
|
||
"9 41.643677 0.044678 \n",
|
||
"10 41.851196 0.045288 \n",
|
||
"11 41.774414 0.046509 \n",
|
||
"12 41.790405 0.046509 \n",
|
||
"13 41.642212 0.046387 \n",
|
||
"14 41.643066 0.045044 \n",
|
||
"15 41.756714 0.047485 \n",
|
||
"\n",
|
||
" t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n",
|
||
"0 0.059082 0.025330 22528.0 22528.0 0.000001 \n",
|
||
"1 0.402832 0.026062 22528.0 22528.0 0.000001 \n",
|
||
"2 0.779541 0.026123 22528.0 22528.0 0.000001 \n",
|
||
"3 1.217041 0.025879 22528.0 22528.0 0.000001 \n",
|
||
"4 1.111328 0.026855 22528.0 22528.0 0.000001 \n",
|
||
"5 0.885742 0.027466 22528.0 22528.0 0.000001 \n",
|
||
"6 0.954346 0.027405 22528.0 22528.0 0.000001 \n",
|
||
"7 1.984375 0.028320 22528.0 22528.0 0.000001 \n",
|
||
"8 1.729980 0.027954 22528.0 22528.0 0.000001 \n",
|
||
"9 1.878174 0.028931 22528.0 22528.0 0.000001 \n",
|
||
"10 1.613525 0.029053 22528.0 22528.0 0.000001 \n",
|
||
"11 1.831299 0.028137 22528.0 22528.0 0.000001 \n",
|
||
"12 1.806152 0.029480 22528.0 22528.0 0.000001 \n",
|
||
"13 1.662354 0.030518 22528.0 22528.0 0.000001 \n",
|
||
"14 1.943604 0.029297 22528.0 22528.0 0.000001 \n",
|
||
"15 0.937256 0.030579 22528.0 22528.0 0.000001 \n",
|
||
"\n",
|
||
" n_time_steps slurm_job_id n_cuda_devices n_processes \\\n",
|
||
"0 200.0 232557.0 1 1 \n",
|
||
"1 200.0 232558.0 2 2 \n",
|
||
"2 200.0 232589.0 3 3 \n",
|
||
"3 200.0 232590.0 4 4 \n",
|
||
"4 200.0 232591.0 5 5 \n",
|
||
"5 200.0 232592.0 6 6 \n",
|
||
"6 200.0 232593.0 7 7 \n",
|
||
"7 200.0 232594.0 8 8 \n",
|
||
"8 200.0 232595.0 9 9 \n",
|
||
"9 200.0 232596.0 10 10 \n",
|
||
"10 200.0 232597.0 11 11 \n",
|
||
"11 200.0 232598.0 12 12 \n",
|
||
"12 200.0 232599.0 13 13 \n",
|
||
"13 200.0 232600.0 14 14 \n",
|
||
"14 200.0 232601.0 15 15 \n",
|
||
"15 200.0 232602.0 16 16 \n",
|
||
"\n",
|
||
" git_hash \\\n",
|
||
"0 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"1 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"2 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"3 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"4 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"5 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"6 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"7 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"8 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"9 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"10 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"11 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"12 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"13 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"14 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"15 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"\n",
|
||
" git_status \n",
|
||
"0 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"1 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"2 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"3 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"4 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"5 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"6 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"7 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"8 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"9 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"10 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"11 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"12 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"13 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"14 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"15 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# DGX-2\n",
|
||
"#weak_scaling_profiling_data = read_profiling_files(\"output_dgx-2/weak_scaling/2022-06-09T134809/\")\n",
|
||
"weak_scaling_profiling_data = read_profiling_files(\"output_dgx-2/weak_scaling/2022-06-23T154025/\")\n",
|
||
"\n",
|
||
"# HGX\n",
|
||
"#weak_scaling_profiling_data = read_profiling_files(\"output_hgx/weak_scaling/2022-06-16T162931/\")\n",
|
||
"##weak_scaling_profiling_data = read_profiling_files(\"output_hgx/weak_scaling/2022-06-16T170630/\")\n",
|
||
"\n",
|
||
"print(weak_scaling_profiling_data)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Strong scaling"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"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": 8,
|
||
"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": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" t_init t_total outfile \\\n",
|
||
"0 15.227155 189.004926 /work/martinls/232634/ShallowWaterGPU/mpi_out_... \n",
|
||
"1 12.726498 145.335962 /work/martinls/232635/ShallowWaterGPU/mpi_out_... \n",
|
||
"2 11.482033 123.139408 /work/martinls/232636/ShallowWaterGPU/mpi_out_... \n",
|
||
"3 10.548483 100.839853 /work/martinls/232637/ShallowWaterGPU/mpi_out_... \n",
|
||
"4 10.746949 95.866956 /work/martinls/232638/ShallowWaterGPU/mpi_out_... \n",
|
||
"5 10.345715 87.113081 /work/martinls/232639/ShallowWaterGPU/mpi_out_... \n",
|
||
"6 9.915406 75.785243 /work/martinls/232640/ShallowWaterGPU/mpi_out_... \n",
|
||
"7 10.107682 69.963608 /work/martinls/232641/ShallowWaterGPU/mpi_out_... \n",
|
||
"8 10.620777 66.039795 /work/martinls/232642/ShallowWaterGPU/mpi_out_... \n",
|
||
"9 11.305829 63.000684 /work/martinls/232643/ShallowWaterGPU/mpi_out_... \n",
|
||
"10 11.614343 60.330283 /work/martinls/232644/ShallowWaterGPU/mpi_out_... \n",
|
||
"11 12.639043 60.506280 /work/martinls/232645/ShallowWaterGPU/mpi_out_... \n",
|
||
"12 13.312508 57.034760 /work/martinls/232646/ShallowWaterGPU/mpi_out_... \n",
|
||
"\n",
|
||
" t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n",
|
||
"0 11.414952 118.087399 42.976445 0.0 \n",
|
||
"1 8.819334 90.167300 32.226894 0.0 \n",
|
||
"2 7.751206 75.901292 26.841162 0.0 \n",
|
||
"3 6.980121 58.661561 23.018016 0.0 \n",
|
||
"4 6.335883 57.172819 20.371334 0.0 \n",
|
||
"5 5.870950 51.546669 18.195306 0.0 \n",
|
||
"6 5.579971 41.915547 16.725574 0.0 \n",
|
||
"7 5.234274 38.144568 14.960167 0.0 \n",
|
||
"8 4.945005 35.074090 13.968068 0.0 \n",
|
||
"9 4.773231 32.496020 13.152020 0.0 \n",
|
||
"10 4.734492 30.088176 11.919627 0.0 \n",
|
||
"11 4.422556 30.348880 11.168828 0.0 \n",
|
||
"12 4.536324 26.665879 10.616396 0.0 \n",
|
||
"\n",
|
||
" t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n",
|
||
"0 41.536133 0.042114 \n",
|
||
"1 31.025757 0.041748 \n",
|
||
"2 25.926025 0.039062 \n",
|
||
"3 22.155762 0.040649 \n",
|
||
"4 19.375610 0.040161 \n",
|
||
"5 17.366577 0.039062 \n",
|
||
"6 15.636230 0.040527 \n",
|
||
"7 14.279663 0.040649 \n",
|
||
"8 13.050293 0.039307 \n",
|
||
"9 11.995850 0.039917 \n",
|
||
"10 11.195801 0.039429 \n",
|
||
"11 10.509277 0.039307 \n",
|
||
"12 9.817139 0.040283 \n",
|
||
"\n",
|
||
" t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n",
|
||
"0 1.334229 0.025146 45056.0 11264.0 0.000001 \n",
|
||
"1 0.792480 0.026306 45056.0 8396.0 0.000001 \n",
|
||
"2 0.567139 0.025024 45056.0 6997.0 0.000001 \n",
|
||
"3 0.596924 0.025452 45056.0 5997.0 0.000001 \n",
|
||
"4 0.803955 0.024841 45056.0 5248.0 0.000001 \n",
|
||
"5 0.732422 0.025330 45056.0 4664.0 0.000001 \n",
|
||
"6 0.979492 0.026062 45056.0 4198.0 0.000001 \n",
|
||
"7 0.487793 0.025635 45056.0 3816.0 0.000001 \n",
|
||
"8 0.795654 0.024780 45056.0 3498.0 0.000001 \n",
|
||
"9 0.995605 0.025330 45056.0 3229.0 0.000001 \n",
|
||
"10 0.691406 0.025452 45056.0 2998.0 0.000001 \n",
|
||
"11 0.388672 0.025757 45056.0 2798.0 0.000001 \n",
|
||
"12 0.655518 0.025146 45056.0 2624.0 0.000001 \n",
|
||
"\n",
|
||
" n_time_steps slurm_job_id n_cuda_devices n_processes \\\n",
|
||
"0 200.0 232634.0 4 4 \n",
|
||
"1 200.0 232635.0 5 5 \n",
|
||
"2 200.0 232636.0 6 6 \n",
|
||
"3 200.0 232637.0 7 7 \n",
|
||
"4 200.0 232638.0 8 8 \n",
|
||
"5 200.0 232639.0 9 9 \n",
|
||
"6 200.0 232640.0 10 10 \n",
|
||
"7 200.0 232641.0 11 11 \n",
|
||
"8 200.0 232642.0 12 12 \n",
|
||
"9 200.0 232643.0 13 13 \n",
|
||
"10 200.0 232644.0 14 14 \n",
|
||
"11 200.0 232645.0 15 15 \n",
|
||
"12 200.0 232646.0 16 16 \n",
|
||
"\n",
|
||
" git_hash \\\n",
|
||
"0 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"1 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"2 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"3 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"4 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"5 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"6 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"7 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"8 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"9 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"10 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"11 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"12 aa693a9a468e3d591417342d96128d90c9df7884\\n \n",
|
||
"\n",
|
||
" git_status \n",
|
||
"0 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"1 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"2 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"3 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"4 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"5 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"6 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"7 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"8 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"9 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"10 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"11 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n",
|
||
"12 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# DGX-2\n",
|
||
"#strong_scaling_profiling_data = read_profiling_files(\"output_dgx-2/strong_scaling/2022-06-09T160712/\")\n",
|
||
"strong_scaling_profiling_data = read_profiling_files(\"output_dgx-2/strong_scaling/2022-06-23T172838/\")\n",
|
||
"\n",
|
||
"# HGX\n",
|
||
"#strong_scaling_profiling_data = read_profiling_files(\"output_hgx/strong_scaling/2022-06-16T152945/\")\n",
|
||
"\n",
|
||
"print(strong_scaling_profiling_data)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Plotting"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 1152x432 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.rcParams['font.size'] = 16\n",
|
||
"plt.rcParams['legend.fontsize'] = 14\n",
|
||
"plt.rcParams['axes.linewidth'] = 2\n",
|
||
"plt.rcParams['lines.linewidth'] = 2\n",
|
||
"\n",
|
||
"fig, (ax_weak, ax_strong) = plt.subplots(1, 2, figsize=(16,6))\n",
|
||
"\n",
|
||
"t_total_no_init_or_file_io = weak_scaling_profiling_data[\"t_total\"] \\\n",
|
||
" -weak_scaling_profiling_data[\"t_init\"] \\\n",
|
||
" -weak_scaling_profiling_data[\"t_nc_write\"] \\\n",
|
||
" -weak_scaling_profiling_data[\"t_sim_init\"]\n",
|
||
"\n",
|
||
"t_total_halo_exchange = weak_scaling_profiling_data[\"t_mpi_halo_exchange_download\"] \\\n",
|
||
" +weak_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"] \\\n",
|
||
" +weak_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"]\n",
|
||
"\n",
|
||
"#ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
"# speedup(t_total_no_init_or_file_io[0], t_total_no_init_or_file_io), label=\"Total (no init or file I/O)\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_full_step\"][0], weak_scaling_profiling_data[\"t_full_step\"]), label=\"Total runtime (except init and file I/O)\")\n",
|
||
"ax_weak.locator_params(axis=\"x\", nbins=16)\n",
|
||
"\n",
|
||
"\"\"\"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"][0:].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(t_total_halo_exchange[0], t_total_halo_exchange[0:]), label=\"Halo exchange (D/E/U)\", linestyle=\"dashed\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_total\"][0], weak_scaling_profiling_data[\"t_total\"]), label=\"Total\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"][0], weak_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"]), label=\"MPI send/recv\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_mpi_halo_exchange_download\"][0], weak_scaling_profiling_data[\"t_mpi_halo_exchange_download\"]), label=\"Download (GPU->CPU)\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"][0], weak_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"]), label=\"Upload (CPU->GPU)\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_nc_write\"][0], weak_scaling_profiling_data[\"t_nc_write\"]), label=\"Write to file\")\n",
|
||
"\n",
|
||
"ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(weak_scaling_profiling_data[\"t_init\"][0], weak_scaling_profiling_data[\"t_init\"]), label=\"Init\")\n",
|
||
"\"\"\"\n",
|
||
"\n",
|
||
"ax_weak.plot(nproc, np.ones(len(nproc)), label=\"Ideal (constant)\", linestyle=\"dotted\")\n",
|
||
"\n",
|
||
"ax_weak.set_xlabel(\"Number of ranks/GPUs\")\n",
|
||
"ax_weak.set_ylabel(\"Efficiency\")\n",
|
||
"ax_weak.legend(loc=\"upper right\", bbox_to_anchor=[1.0, 0.95])\n",
|
||
"#fig.show()\n",
|
||
"\n",
|
||
"##############################################\n",
|
||
"\n",
|
||
"#fig, ax = plt.subplots(figsize=(8,6))\n",
|
||
"\n",
|
||
"t_total_no_init_or_file_io = strong_scaling_profiling_data[\"t_total\"] \\\n",
|
||
" -strong_scaling_profiling_data[\"t_init\"] \\\n",
|
||
" -strong_scaling_profiling_data[\"t_nc_write\"] \\\n",
|
||
" -strong_scaling_profiling_data[\"t_sim_init\"]\n",
|
||
"\n",
|
||
"t_total_halo_exchange = strong_scaling_profiling_data[\"t_mpi_halo_exchange_download\"] \\\n",
|
||
" +strong_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"] \\\n",
|
||
" +strong_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"]\n",
|
||
"\n",
|
||
"#ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
"# speedup(t_total_no_init_or_file_io[0], t_total_no_init_or_file_io)*4, label=\"Total (no init or file I/O)\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_full_step\"][0], strong_scaling_profiling_data[\"t_full_step\"])*4, label=\"Total runtime (except init and file I/O)\")\n",
|
||
"\n",
|
||
"\"\"\"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(t_total_halo_exchange[0], t_total_halo_exchange)*4, label=\"Halo exchange (D/E/U)\", linestyle=\"dashed\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_total\"][0], strong_scaling_profiling_data[\"t_total\"])*4, label=\"Total\")\n",
|
||
" \n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"][0], strong_scaling_profiling_data[\"t_mpi_halo_exchange_sendreceive\"]), label=\"MPI send/recv\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_mpi_halo_exchange_download\"][0], strong_scaling_profiling_data[\"t_mpi_halo_exchange_download\"]), label=\"Download (GPU->CPU)\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"][0], strong_scaling_profiling_data[\"t_mpi_halo_exchange_upload\"]), label=\"Upload (CPU->GPU)\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_nc_write\"][0], strong_scaling_profiling_data[\"t_nc_write\"]), label=\"Write to file\")\n",
|
||
"\n",
|
||
"ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n",
|
||
" speedup(strong_scaling_profiling_data[\"t_init\"][0], strong_scaling_profiling_data[\"t_init\"]), label=\"Init\")\n",
|
||
"\"\"\"\n",
|
||
"\n",
|
||
"#ax_strong.plot(nproc, amdahls_speedup(0.9, nproc), label=\"Amdahls 90%\", linestyle=\"dashed\")\n",
|
||
"#ax_strong.plot(nproc, amdahls_speedup(0.5, nproc), label=\"Amdahls 50%\", linestyle=\"dashed\")\n",
|
||
"#ax_strong.plot(nproc, amdahls_speedup(0.1, nproc), label=\"Amdahls 10%\", linestyle=\"dashed\")\n",
|
||
"\n",
|
||
"#ax_strong.plot(nproc, gustafsons_speedup(0.9, nproc), label=\"Gustafsons 90%\")\n",
|
||
"#ax_strong.plot(nproc, gustafsons_speedup(0.5, nproc), label=\"Gustafsons 50%\")\n",
|
||
"#ax_strong.plot(nproc, gustafsons_speedup(0.1, nproc), label=\"Gustafsons 10%\")\n",
|
||
"\n",
|
||
"ax_strong.plot(nproc[3:], nproc[3:], label=\"Ideal (linear)\", linestyle=\"dotted\")\n",
|
||
"\n",
|
||
"ax_strong.set_xlabel(\"Number of ranks/GPUs\")\n",
|
||
"ax_strong.set_ylabel(\"Speedup\")\n",
|
||
"ax_strong.legend(loc=\"upper left\")\n",
|
||
"fig.show()\n",
|
||
"\n",
|
||
"fig.savefig(\"dgx-2-scaling.pdf\", bbox_inches='tight')"
|
||
]
|
||
},
|
||
{
|
||
"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": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAcvUlEQVR4nO3de3hddZ3v8fenaWhaWqb0AgcbNS0FpLUlQqko6oSLTAc5BeegwADTGWHqFXCOqKAeceYo1qOOyMAMloJ0hsrlqVY4OF5qbQF5EGghQmnBOrXYcCq9cBGwgYZ+zx9rpSRpmuw0e+21d9fn9Tz7yV5rr8s3O+13//Zv/db3p4jAzMyKY0jeAZiZWWU58ZuZFYwTv5lZwTjxm5kVjBO/mVnBDM07gFKMGzcumpqa8g7DzKymrFq1amtEjO+5viYSf1NTEytXrsw7DDOzmiLpqd7Wu6vHzKxgnPjNzArGid/MrGBqoo/fzPZ9O3bsoK2tjfb29rxDqTkNDQ00NjZSX19f0vZO/GZWFdra2hg1ahRNTU1IyjucmhERbNu2jba2NiZOnFjSPu7qMbOq0N7eztixY530B0gSY8eOHdA3JSd+M6saTvp7Z6DvmxO/mVnBOPGbWXUq90XeEo43cuTIfre58MILWbNmDQBXXnnloMPKgxP/PqK9Y+//k/TcdzDHKsf+ZgA0NIBUvkdDQ1nCWrBgAVOmTAFqN/F7VM8+omFoA/rHvesfjSu6z8I2mGP1djyzWrNixQq+9KUvMW7cOFavXs0xxxzDzTffjCRaWlr4xje+weLFi9m+fTvNzc1MnTqVRYsW5R12ydziNzPrxSOPPMJVV13FmjVrWL9+Pffdd1+31+fNm8fw4cNpbW2tqaQPTvxmZr2aOXMmjY2NDBkyhObmZjZs2JB3SGXjxG9m1othw4btel5XV0dHR0eO0ZSXE7+Z2V6qr69nx44deYcxYE78Zlad2tshonyPDGoAzZ07l+nTp3PuueeW/dhZUkT1j8CYMWNGeCKWvrXv2E5D/fCy7DuYY5VjfyumtWvXcuSRR+YdRs3q7f2TtCoiZvTcNtPhnJI2AC8CrwEdETFD0hjgNqAJ2AB8MCKeyzKOImioH56MVd6bfXt8+A/mWL0dz8yqSyW6ek6IiOYunzqXAcsi4jBgWbpsZmYVkkcf/+nAwvT5QuCMHGIwMyusrBN/AD+TtErS3HTdwRGxKX3+B+Dg3naUNFfSSkkrt2zZknGYZmbFkXXJhndFxNOSDgKWSnqi64sREZJ67RCOiPnAfEgu7mYcp5lZYWTa4o+Ip9Ofm4ElwEzgGUmHAKQ/N2cZg5mZdZdZ4pe0v6RRnc+BU4DVwJ3AnHSzOcAdWcVgZjXstTKPuy/heJI477zzdi13dHQwfvx4TjvtNABuuukmxo8fT3NzM1OmTOH666/ftf4Tn/hEeePNUJZdPQcDS9KZYYYC34uIn0h6CLhd0gXAU8AHM4yB9o52GobuXTnWwexrZoNU1wDfK+OMXH/df4/x/vvvz+rVq9m+fTvDhw9n6dKlTJgwods2Z511Ftdccw2bN29m6tSpzJ49u3wxVkhmiT8i1gNH9bJ+G3BSVuftqZzlis1s33fqqafyox/9iDPPPJNbbrmFc845h3vvvXe37Q466CAOPfRQnnrqqRyiHByXbDAz6+Lss8/m1ltvpb29nUcffZS3v/3tvW63fv161q9fz+TJkysc4eB5IharKe66s6xNnz6dDRs2cMstt3Dqqafu9vptt93GL3/5S4YNG8Z3vvMdxowZk0OUg+PEbzXFXXdWCbNnz+bSSy9lxYoVbNu2rdtrnX38tcyJ38yshw996EOMHj2aadOmsWLFirzDKbt9PvG379i+1y09V5k0y9Fr7SWNxBnQ8epK6+prbGzk4osvLt+5q0wxyjLvbaXJGnhvuinn7zmI6pxZv2/u6tk3uSzz4AykLLNH9ZiZFYwTv5lZwezzffy2b/E1G7PBc+K3mlLOmcbMispdPWZmBePEb2ZWME78ZlaV2jvKW5a5lON95StfYerUqUyfPp3m5mYeeOABLrzwQtasWVOWGJqamti6dWuf21x55ZVlOVdf3MdvZlVpMOU5etPfoID777+fu+66i4cffphhw4axdetWXn31VRYsWFC2GEpx5ZVX8rnPfS7Tc7jFb2YGbNq0iXHjxjFs2DAAxo0bxxve8AZaWlrovIF05MiRfPrTn2bq1KmcfPLJPPjgg7S0tDBp0iTuvPNOYPdJWU477bReyz6cccYZHHPMMUydOpX58+cDcNlll7F9+3aam5s599xzAbj55puZOXMmzc3NfPjDH+a1114b9O/qxG9mBpxyyils3LiRww8/nI997GPcfffdu23z8ssvc+KJJ/L4448zatQovvCFL7B06VKWLFnCF7/4xQGd78Ybb2TVqlWsXLmSq6++mm3btjFv3jyGDx9Oa2srixYtYu3atdx2223cd999tLa2UldXx6JFiwb9u7qrJ0cuMWxWPUaOHMmqVau49957Wb58OWeddRbz5s3rts1+++3HrFmzAJg2bRrDhg2jvr6eadOmsWHDhgGd7+qrr2bJkiUAbNy4kXXr1jF27Nhu2yxbtoxVq1Zx7LHHArB9+3YOOuigvfwNX+fEnyOXGDarLnV1dbS0tNDS0sK0adNYuHBht9fr6+tJp5NlyJAhu7qFhgwZQkdHBwBDhw5l586du/Zpb9/9ovKKFSv4+c9/zv3338+IESNoaWnpdbuIYM6cOXz1q18t2+8I7uoxMwPgySefZN26dbuWW1tbefOb3zzg4zQ1NdHa2srOnTvZuHEjDz744G7bvPDCCxx44IGMGDGCJ554gl/96le7Xquvr2fHjh0AnHTSSSxevJjNmzcD8Oyzz5Zlqke3+M2sKrV3tJf1m21/3aMvvfQSF110Ec8//zxDhw5l8uTJzJ8/nzPPPHNA5zn++OOZOHEiU6ZM4cgjj+Too4/ebZtZs2Zx3XXXceSRR3LEEUdw3HHH7Xpt7ty5TJ8+naOPPppFixbx5S9/mVNOOYWdO3dSX1/Ptddeu1cfSF25LHNfKvDelLWrpyBlmav572l7z2WZB8dlmc3MbI/c1ZMjV5o0szw48efIlSbNuouIXaNmrHQD7bJ3V4+ZVYWGhga2bds24CRWdBHBtm3baGgo/b4et/jNLBc9R9k0NjbS1tbGli1bStq/Vr4dDCbOUvdtaGigsbGx5OM68ZtZLgZbhK2WbmKsths13dVjZlYwTvxmZgXjxG9mVjCZJ35JdZIekXRXujxR0gOSfivpNkn7ZR2DmZm9rhIt/kuAtV2WvwZ8KyImA88BF1QgBjMzS2U6qkdSI/A+4CvA/1QyLulE4K/TTRYCXwL+Lcs4zKz6DObO9c79a+Hu9Wq8Qz/r4ZxXAZ8BRqXLY4HnI6IjXW4DJmQcg5lVocHcuQ61c/d6Nd6hn1lXj6TTgM0RsWov958raaWklaXe0GFmVg7tHbtPilKJfSslyxb/8cBsSacCDcABwLeB0ZKGpq3+RuDp3naOiPnAfEjKMmcYp5lZN/v67HiZtfgj4vKIaIyIJuBs4BcRcS6wHOic2WAOcEdWMZiZ2e7yGMf/WZILvb8l6fO/IYcYzMwKqyK1eiJiBbAifb4emFmJ85pZMfQ3rWLW+9caF2kzs5pXpIJv5eCSDWZmBeMWv5lZD9V401U5OfGbmfVQjTddlZO7eszMCsaJ38ysYNzVY2YlG8ywxyyHTBal4Fu5OPGbWcmqtZRBUQq+lYu7eszMCsaJ38ysYJz4zcwKxonfzKxgnPjNzArGo3rMrGT7eimDonDiN7OS7eulDIrCXT1mZgXTb4tf0juA84B3A4cA24HVwI+AmyPihUwjNDOzsuqzxS/px8CFwE+BWSSJfwrwBZIJ1O+QNDvrIM3MrHz6a/GfHxFbe6x7CXg4fXxT0rhMIjOzsqjW+jqWnz4Tf2fSl7Q/sD0idko6HHgL8OOI2NHLB4OZVZFqra9j+Sn14u49QIOkCcDPgPOBm7IKyszMslNq4ldE/An4K+BfI+IDwNTswjIzs6yUnPjT0T3nkozmAajLJiQzM8tSqYn/EuByYElEPC5pErA8u7DMiqu9oz3X/W3fV9KduxFxD0k/f+fyeuDirIIyK7LBXIwFX5C1/vWZ+CVdD1wdEY/18tr+wFnAKxGxKKP4zGyQXF/HeuqvxX8t8L8kTSO5W3cLyY1bhwEHADcCTvpmVcz1dayn/sbxtwIflDQSmMHrJRvWRsST2YdnVhsGe6OTb5SySiq1j/8lYEW2oZjVLvfLWy1xdU4rrMGMfvHIGatlmdXjl9RAMhJoWHqexRFxhaSJwK3AWGAVST2gV7OKw2xPqrWUwWAuxnbu7wuy1pcBtfgljRjA5q8AJ0bEUUAzMEvSccDXgG9FxGTgOeCCgcRgtq/bdTF2Lx9O+tafkhK/pHdKWgM8kS4fJelf+9onEi+li/XpI4ATgcXp+oXAGXsRt5mZ7aVSW/zfAv4C2AYQEb8G3tPfTpLqJLUCm4GlwH8Bz0dER7pJGzBhgDGbmdkglNzHHxEb1X0s8Gsl7PMa0CxpNLCEpJxzSSTNBeYCvOlNbyp1N7NcuF/eakmpLf6Nkt4JhKR6SZcCa0s9SUQ8T1Lb5x3AaEmdHziNwNN72Gd+RMyIiBnjx48v9VRmuXC/vNWSUlv8HwG+TdIt8zRJTf6P97WDpPHAjoh4XtJw4L0kF3aXA2eSjOyZA9yxd6FXnm/S2be4lIEVVak3cG0lKck8EIcACyXVkXyzuD0i7kovEt8q6cvAI8ANAzxubnyTzsBV84elSxlYUZWU+NOx9xcBTV33iYg9TrQeEY8Cb+tl/Xpg5kADtdrkD0uz6lNqV88PSVrm/xfYmVk0ZmaWuVITf3tEXJ1pJGZmVhGlJv5vS7qC5KLuK50rI+LhTKIyM7PMlJr4pwHnk9x129nV03kXbmF4rLaZ7QtKTfwfACYVvZjaYEaBgEeCmFl1KDXxrwZGk5ReMCuZvyWZVZ9SE/9o4AlJD9G9j3+PwznNwN+SzKpRqYn/ikyjMDOziin1zt27sw7EzMwqo8/EL+mXEfEuSS+SjOLZ9RJJyf0DMo3OzMzKrs/EHxHvSn+Oqkw4ZmaWtVJn4PqPUtaZmVn1K7Ue/9SuC2k9/WPKH46ZmWWtz8Qv6fK0f3+6pD+mjxeBZ6ihOvpmZva6PhN/RHw17d//ekQckD5GRcTYiLi8QjGamVkZlTqc83JJE4A3070e/z1ZBWZmZtkodSKWecDZwBpen2Q9ACd+M7MaU+qdu+8HjoiIV/rd0szMqlqpo3rWA/VZBmJmZpVRaov/T0CrpGV0L9J2cSZRmZlZZkpN/HemDzMzq3GljupZmHUgZmZWGaWO6vkd3Yu0ARARk8oekZmZZarUrp4ZXZ43kEzFOKb84ZiZWdZKGtUTEdu6PJ6OiKuA92UbmpmZZaHUrp6juywOIfkGUOq3BTMzqyKlJu9vdnneAWwg6e4xM7MaU+qonhO6LkuqIynh8JssgjIzs+z0V5b5gLQ08zWS3qvEJ4DfAh+sTIhmZlZO/bX4/wN4Drgf+Hvg8yTz7b4/IlqzDc3MzLLQX+KfFBHTACQtADYBb4qI9swjMzOzTPQ3nHNH55OIeA1oKzXpS3qjpOWS1kh6XNIl6foxkpZKWpf+PHDvwzczs4HqL/Ef1WPKxc4pGF+U9Md+9u0APhURU4DjgI9LmgJcBiyLiMOAZemymZlVSJ9dPRFRt7cHjohNJF1DRMSLktYCE4DTgZZ0s4XACuCze3seMzMbmFLr8Q+KpCbgbcADwMHphwLAH4CD97DPXEkrJa3csmVLJcI0MyuEzBO/pJHA94FPRkS37qGICHop/pa+Nj8iZkTEjPHjx2cdpplZYWSa+CXVkyT9RRHxg3T1M5IOSV8/BNicZQxmZtZdZolfkoAbgLUR8c9dXroTmJM+nwPckVUMZma2uywLrR0PnA88Jqk1Xfc5YB5wu6QLgKfwHcBmZhWVWeKPiF+S3OXbm5OyOq+ZmfWtIqN6zMysejjxm5kVjBO/mVnBOPGbmRWME7+ZWcE48ZuZFYwTv5lZwTjxm5kVjBO/mVnBOPGbmRWME7+ZWcE48ZuZFYwTv5lZwTjxm5kVjBO/mVnBOPGbmRWME7+ZWcE48ZuZFYwTv5lZwTjxm5kVjBO/mVnBOPGbmRWME7+ZWcE48ZuZFYwTv5lZwTjxm5kVjBO/mVnBOPGbmRWME7+ZWcE48ZuZFUxmiV/SjZI2S1rdZd0YSUslrUt/HpjV+c3MrHdZtvhvAmb1WHcZsCwiDgOWpctmZlZBmSX+iLgHeLbH6tOBhenzhcAZWZ3fzMx6V+k+/oMjYlP6/A/AwXvaUNJcSSslrdyyZUtlojMzK4DcLu5GRADRx+vzI2JGRMwYP358BSMzM9u3VTrxPyPpEID05+YKn9/MrPAqnfjvBOakz+cAd1T4/GZmhZflcM5bgPuBIyS1SboAmAe8V9I64OR02czMKmhoVgeOiHP28NJJWZ3TzMz65zt3zcwKxonfzKxgnPjNzArGid/MrGCc+M3MCsaJ38ysYJz4zcwKxonfzKxgnPjNzArGid/MrGCc+M3MCsaJ38ysYJz4zcwKxonfzKxgnPjNzArGid/MrGCc+M3MCsaJ38ysYJz4zcwKxonfzKxgnPjNzArGid/MrGCc+M3MCsaJ38ysYJz4zcwKxonfzKxgnPjNzArGid/MrGCc+M3MCsaJ38ysYHJJ/JJmSXpS0m8lXZZHDGZmRVXxxC+pDrgW+EtgCnCOpCmVjsPMrKjyaPHPBH4bEesj4lXgVuD0HOIwMyukoTmccwKwsctyG/D2nhtJmgvMTRdfkvRk+nwcsDXTCF8PYqB79B3bwI+3Z+WMrZxxDfx4fs8Gfjy/ZwM/XlHfszf3tjKPxF+SiJgPzO+5XtLKiJiRQ0j9cmwDV61xQfXGVq1xQfXGVq1xQT6x5dHV8zTwxi7Ljek6MzOrgDwS/0PAYZImStoPOBu4M4c4zMwKqeJdPRHRIekTwE+BOuDGiHh8AIfYrfuniji2gavWuKB6Y6vWuKB6Y6vWuCCH2BQRlT6nmZnlyHfumpkVjBO/mVnB1FTir9ZSD5LeKGm5pDWSHpd0Sd4xdSWpTtIjku7KO5auJI2WtFjSE5LWSnpH3jEBSPqH9O+4WtItkhpyjOVGSZslre6yboykpZLWpT8PrJK4vp7+LR+VtETS6ErHtafYurz2KUkhaVy1xCXpovR9e1zS/6lELDWT+Ku81EMH8KmImAIcB3y8imIDuARYm3cQvfg28JOIeAtwFFUQo6QJwMXAjIh4K8kAhLNzDOkmYFaPdZcByyLiMGBZulxpN7F7XEuBt0bEdOA3wOWVDip1E7vHhqQ3AqcAv690QKmb6BGXpBNIKhccFRFTgW9UIpCaSfxUcamHiNgUEQ+nz18kSWAT8o0qIakReB+wIO9YupL0Z8B7gBsAIuLViHg+16BeNxQYLmkoMAL4f3kFEhH3AM/2WH06sDB9vhA4o5IxQe9xRcTPIqIjXfwVyT06FbeH9wzgW8BngFxGtOwhro8C8yLilXSbzZWIpZYSf2+lHqoiuXYlqQl4G/BAzqF0uorkH/vOnOPoaSKwBfhu2g21QNL+eQcVEU+TtLp+D2wCXoiIn+Ub1W4OjohN6fM/AAfnGcwefAj4cd5BdJJ0OvB0RPw671h6OBx4t6QHJN0t6dhKnLSWEn/VkzQS+D7wyYj4YxXEcxqwOSJW5R1LL4YCRwP/FhFvA14mny6LbtL+8tNJPpjeAOwv6bx8o9qzSMZjV9WYbEmfJ+n+XJR3LACSRgCfA76Ydyy9GAqMIeki/jRwu1Tuoka7q6XEX9WlHiTVkyT9RRHxg7zjSR0PzJa0gaRr7ERJN+cb0i5tQFtEdH4zWkzyQZC3k4HfRcSWiNgB/AB4Z84x9fSMpEMA0p8V6R4ohaS/BU4Dzo3quUnoUJIP8l+n/xcagYcl/bdco0q0AT+IxIMk38wzv/BcS4m/aks9pJ/QNwBrI+Kf846nU0RcHhGNEdFE8n79IiKqovUaEX8ANko6Il11ErAmx5A6/R44TtKI9O96ElVw0bmHO4E56fM5wB05xrKLpFkk3YqzI+JPecfTKSIei4iDIqIp/b/QBhyd/hvM2w+BEwAkHQ7sRwWqD9dM4k8vGnWWelgL3D7AUg9ZOh44n6RF3Zo+Ts07qBpwEbBI0qNAM3BlvuFA+g1kMfAw8BjJ/5HcbveXdAtwP3CEpDZJFwDzgPdKWkfyDWVelcR1DTAKWJr+H7iu0nH1EVvu9hDXjcCkdIjnrcCcSnxTcskGM7OCqZkWv5mZlYcTv5lZwTjxm5kVjBO/mVnBOPGbmRWME79lLq2G+M0uy5dK+lKZjn2TpDPLcax+zvOBtILo8qzP1U8c9ZIeTp8fLOl7ktZLWiXpfknvT19rkfRCOqxyraQr0vV/K+maHsdcIakqJyK3bDjxWyW8AvxVHqVw+5IWYSvVBcDfR8QJOZ2/07uA+9Kby34I3BMRkyLiGJKb9LoWRrs3IpqBGcB5kqrhzmirAk78VgkdJDdB/UPPF3q22CW9lP5sSYtW3ZG2aOdJOlfSg5Iek3Rol8OcLGmlpN+k9Yk65yD4uqSHlNSH/3CX494r6U56uVNY0jnp8VdL+lq67oskCfcGSV/vZZ/Ppvv8WtK8dF2zpF/p9dr0B6brV0i6StJK4BJJx6S/5ypJP+1SiuFiJfM7PCrp1i6nm0VS/OxE4NWI2HWTVEQ8FRH/0jO+iHgZWAVM7uVv0/X3qEv/HqvT32e3v5ftGyo+2boV1rXAoxrYRBNHAUeSlLJdDyyIiJlKJrq5CPhkul0TSdnuQ4HlkiYDf0NSWfNYScNIWsmdVTaPJqkb/7uuJ5P0BuBrwDHAc8DPJJ0REf8k6UTg0ohY2WOfvyQp6vb2iPiTpDHpS/8OXBQRd0v6J+CKLvHuFxEzlNR3uhs4PSK2SDoL+ApJZcvLgIkR8Yq6T2hyAvCPwIUkdxf3S9JYkiJg/xvoq/pjMzAhnYcA5TSRimXPLX6riLRa6b+TTHJSqofSuQ5eAf4L6Ezcj5Ek+063R8TOiFhH8gHxFpIJN/5GUitJieyxwGHp9g/2TPqpY4EVaYG2zuqS7+knxpOB73bWpomIZ5XMNTA6Iu5Ot1nY4zi3pT+PAN5KWuIA+AKvd9U8SlLO4jySb0ydk8Q821sdHEnXpt84Huqy+t2SHiF53+alJU72dKt+kLx3kyT9i5K6O7lXmLVsuMVvlXQVSSv1u13WdZA2QCQNISlS1emVLs93dlneSfd/uz2TWQAiaXH/tOsLklpISkDnqfP8Ah6PiN6mnHwfyYfFfwc+L2kaSTdP5+/zOPA/OjeOiI+n11C6fiO5NyJO63HcbUDPqRrHAFsj4jlJRwF/AXwE+CDJtw/bx7jFbxUTEc8Ct5NcKO20gaRrBWA2UL8Xh/6ApCFpv/8k4EmSBPnRtDsFSYer/4leHgT+XNI4JVN9nkPSFdOXpcDfKan5jqQxEfEC8Jykd6fbnL+H4zwJjFc617CSETtT0w/AN0bEcuCzwJ8BI3m9fx/gF0CDpI92Od6IfmKFpMrt8UpLEqejeYaRVEodBwyJiO+TfPvwxeB9lFv8VmnfJKmy2ul64A5JvwZ+wt61xn9PkrQPAD4SEe2SFpB0Bz2cjoDZQj9TFEbEJkmXActJWuM/iog+Sx5HxE8kNQMrJb0K/CfJpB9zgOvSD4T1wN/1su+r6YXtq9PuoaEk34p+A9ycrhNwNfAiMDkinkj3DUlnAN+S9Jn093uZ5IOir3ifSa+R/Gf6AfMScE5E7Ey7kr6brof85sy1jLk6p1kNkPQu4LyI+EjesVjtc+I3MysY9/GbmRWME7+ZWcE48ZuZFYwTv5lZwTjxm5kVjBO/mVnB/H+V2nhUJmh0qAAAAABJRU5ErkJggg==",
|
||
"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": "5ec8a684eb355694b427c525a814c01edbb663f485e9b356374be21a7726d858"
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|