diff --git a/Figures.ipynb b/Figures.ipynb index d7144f3..dc48b2b 100644 --- a/Figures.ipynb +++ b/Figures.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -36,140 +36,30 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 5, "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" - ] - } - ], + "outputs": [], "source": [ - "def read_profiling_files(profile_dir_path=\".\"):\n", + "def read_profiling_files(profile_dir_path=\".\", drop_multinode=False, drop_singlenode=False):\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", + " if(drop_singlenode):\n", + " json_filenames = [file for file in json_filenames if \"1_nodes\" not in file]\n", + "\n", + " if(drop_multinode):\n", + " json_filenames = [file for file in json_filenames if \"1_nodes\" in file]\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\"])\n", + " profiling_data = profiling_data.sort_values(by=[\"n_processes\"], ignore_index=True)\n", "\n", - " return profiling_data\n", - "\n", - "profiling_data = read_profiling_files(\"output_dgx-2/2022-04-26T155207/\")\n", - "print(profiling_data)" + " return profiling_data" ] }, { @@ -181,96 +71,106 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 6, "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" + " t_init t_total outfile \\\n", + "0 5.327343 72.445652 /cluster/work/jobs/5977262/ShallowWaterGPU/mpi... \n", + "1 5.766222 70.390925 /cluster/work/jobs/5977264/ShallowWaterGPU/mpi... \n", + "2 6.594021 72.797283 /cluster/work/jobs/5977265/ShallowWaterGPU/mpi... \n", + "3 13.090770 98.327636 /cluster/work/jobs/5977266/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 6.785504 34.131567 24.233159 0.0 \n", + "1 6.297029 31.896560 24.437577 0.0 \n", + "2 6.115570 33.620830 24.389490 0.0 \n", + "3 23.062950 35.326106 24.479295 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.969971 0.039307 \n", + "1 23.959106 0.035278 \n", + "2 23.961182 0.036865 \n", + "3 23.963623 0.038574 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 0.049072 0.027039 12288.0 12288.0 0.000001 \n", + "1 0.200195 0.022766 12288.0 12288.0 0.000001 \n", + "2 0.150146 0.025269 12288.0 12288.0 0.000001 \n", + "3 0.281494 0.028137 12288.0 12288.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977262.0 1 1 \n", + "1 200.0 5977264.0 2 2 \n", + "2 200.0 5977265.0 3 3 \n", + "3 200.0 5977266.0 4 4 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "3 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M conda_environment.yml\\n M conda_environment... \n", + "1 M conda_environment.yml\\n M conda_environment... \n", + "2 M conda_environment.yml\\n M conda_environment... \n", + "3 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + " t_init t_total outfile \\\n", + "0 5.409974 74.459357 /cluster/work/jobs/5977267/ShallowWaterGPU/mpi... \n", + "1 10.191378 87.734289 /cluster/work/jobs/5977268/ShallowWaterGPU/mpi... \n", + "2 10.992114 92.724516 /cluster/work/jobs/5977269/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 8.215068 31.199623 27.619763 0.0 \n", + "1 18.097157 30.747718 26.639607 0.0 \n", + "2 18.207139 32.633317 28.926713 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.962158 0.035278 \n", + "1 23.961914 0.035278 \n", + "2 23.966187 0.037476 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 3.625488 0.022888 12288.0 12288.0 0.000001 \n", + "1 2.509521 0.022278 12288.0 12288.0 0.000001 \n", + "2 4.665771 0.023193 12288.0 12288.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977267.0 1 2 \n", + "1 200.0 5977268.0 1 3 \n", + "2 200.0 5977269.0 1 4 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M conda_environment.yml\\n M conda_environment... \n", + "1 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "2 M saga_scaling_benchmark.job\\n M saga_strong_... \n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":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": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ - "fig, ax = plt.subplots(figsize=(8,6))\n", + "# 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", - "# 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", + "# 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", - "ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", - " speedup(profiling_data[\"t_total\"][0], profiling_data[\"t_total\"]), label=\"Total\")\n", + "# Saga\n", + "singlenode_weak_scaling_profiling_data = read_profiling_files(\"output_saga/weak_scaling/2022-06-16T151516/\", drop_multinode=True)\n", + "multinode_weak_scaling_profiling_data = read_profiling_files(\"output_saga/weak_scaling/2022-06-16T151516/\", drop_singlenode=True)\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()" + "print(singlenode_weak_scaling_profiling_data)\n", + "print(multinode_weak_scaling_profiling_data)" ] }, { @@ -282,7 +182,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -293,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -304,22 +204,110 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 9, "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - ":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" + " t_init t_total outfile \\\n", + "0 9.692163 80.12349 /cluster/work/jobs/5977971/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 8.455713 35.275914 24.448944 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.929565 0.03894 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 0.340088 0.028564 24576.0 6144.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977971.0 4 4 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + " t_init t_total outfile \\\n", + "0 10.973809 93.593265 /cluster/work/jobs/5977972/ShallowWaterGPU/mpi... \n", + "1 4.248161 39.835643 /cluster/work/jobs/5977974/ShallowWaterGPU/mpi... \n", + "2 11.035480 60.120367 /cluster/work/jobs/5983711/ShallowWaterGPU/mpi... \n", + "3 9.521014 44.935236 /cluster/work/jobs/5983714/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 18.225805 32.501692 29.925707 0.0 \n", + "1 4.393575 15.181573 13.800955 0.0 \n", + "2 26.829786 10.607348 9.628182 0.0 \n", + "3 17.313007 8.706373 7.796057 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.949829 0.037476 \n", + "1 12.015137 0.035522 \n", + "2 8.051514 0.038574 \n", + "3 6.057861 0.042480 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 5.814209 0.025513 24576.0 6144.0 0.000001 \n", + "1 1.679688 0.023071 24576.0 3072.0 0.000001 \n", + "2 1.506348 0.025513 24576.0 2048.0 0.000001 \n", + "3 1.665527 0.029907 24576.0 1536.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977972.0 1 4 \n", + "1 200.0 5977974.0 2 8 \n", + "2 200.0 5983711.0 3 12 \n", + "3 200.0 5983714.0 4 16 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "3 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "1 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "2 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "3 M saga_scaling_benchmark.job\\n M saga_strong_... \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", + "# Saga\n", + "singlenode_strong_scaling_profiling_data = read_profiling_files(\"output_saga/strong_scaling/2022-06-16T190721/\", drop_multinode=True)\n", + "multinode_strong_scaling_profiling_data = read_profiling_files(\"output_saga/strong_scaling/2022-06-16T190721/\", drop_singlenode=True)\n", + "\n", + "print(singlenode_strong_scaling_profiling_data)\n", + "print(multinode_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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", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -329,31 +317,192 @@ } ], "source": [ - "fig, ax = plt.subplots(figsize=(8,6))\n", + "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", - "ax.plot(profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", - " speedup(profiling_data[\"t_total\"][0], profiling_data[\"t_total\"]), label=\"Total\")\n", + "fig, (ax_weak, ax_strong) = plt.subplots(1, 2, figsize=(16,6))\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", + "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", - "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", + "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.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", + "#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.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", + "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=\"Runtime (except init and file I/O)\")\n", + "ax_weak.locator_params(axis=\"x\", nbins=16)\n", "\n", - "ax.plot(nproc, nproc, label=\"Ideal (linear)\", linestyle=\"dotted\")\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.set_xlabel(\"Number of cores/GPUs\")\n", - "ax.set_ylabel(\"Speedup\")\n", - "ax.legend(loc=\"upper left\")\n", - "fig.show()" + "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 runtime (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=\"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 runtime (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": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/lib/python3.7/site-packages/ipykernel_launcher.py:45: 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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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "###\n", + "### Saga\n", + "###\n", + "\n", + "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", + "ax_weak.plot(singlenode_weak_scaling_profiling_data[\"n_processes\"][0:4].to_numpy(dtype=\"int\"), \n", + " speedup(singlenode_weak_scaling_profiling_data[\"t_full_step\"][0], singlenode_weak_scaling_profiling_data[\"t_full_step\"][0:4]), \n", + " label=\"Single-node runtime (no init or file I/O)\", marker=\"x\")\n", + "\n", + "ax_weak.plot(multinode_weak_scaling_profiling_data[\"n_processes\"][0:3].to_numpy(dtype=\"int\"), \n", + " speedup(singlenode_weak_scaling_profiling_data[\"t_full_step\"][0], multinode_weak_scaling_profiling_data[\"t_full_step\"][0:3]), \n", + " label=\"2–4 nodes runtime (no init or file I/O)\", marker=\"o\", color=\"green\")\n", + "\n", + "ax_weak.locator_params(axis=\"x\", nbins=4)\n", + "\n", + "ax_weak.plot(nproc[0:4], np.ones(len(nproc[0:4])), label=\"Ideal runtime (constant)\", linestyle=\"dotted\", color=\"orange\")\n", + "\n", + "ax_weak.set_xlabel(\"Number of ranks/GPUs\")\n", + "ax_weak.set_ylabel(\"Efficiency\")\n", + "ax_weak.legend(loc=\"upper left\", bbox_to_anchor=[0.0, 0.8])\n", + "\n", + "##############################################\n", + "\n", + "#ax_strong.plot(singlenode_strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", + "# speedup(singlenode_strong_scaling_profiling_data[\"t_full_step\"][0], singlenode_strong_scaling_profiling_data[\"t_full_step\"])*4, \n", + "# label=\"Single-node (no init or file I/O)\", marker=\"x\")\n", + "\n", + "ax_strong.plot(multinode_strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", + " speedup(multinode_strong_scaling_profiling_data[\"t_full_step\"][0], multinode_strong_scaling_profiling_data[\"t_full_step\"])*4, \n", + " label=\"Four nodes runtime (no init or file I/O)\", marker=\"o\")\n", + "\n", + "ax_strong.locator_params(axis=\"x\", nbins=16)\n", + "\n", + "ax_strong.plot(nproc[0:], nproc[0:], label=\"Ideal runtime (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(\"saga-scaling.pdf\", bbox_inches='tight')" ] }, { @@ -494,11 +643,8 @@ } ], "metadata": { - "interpreter": { - "hash": "d80e56d67bdb125526bdf12740b058f9c8b2e6eb30981cd0c9aaae49693d1172" - }, "kernelspec": { - "display_name": "ShallowWaterGPU_HPC", + "display_name": "Python 3.7.12 ('ShallowWaterGPU_HPC')", "language": "python", "name": "python3" }, @@ -512,7 +658,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.7.12" + }, + "vscode": { + "interpreter": { + "hash": "cb8fa661d82d1ec49918052345889e962ab1d5f5f5cbd9596ba31c436e222a26" + } } }, "nbformat": 4, diff --git a/GPUSimulators/Common.py b/GPUSimulators/Common.py index a965231..76902c5 100644 --- a/GPUSimulators/Common.py +++ b/GPUSimulators/Common.py @@ -100,8 +100,8 @@ def runSimulation(simulator, simulator_args, outfile, save_times, save_var_names profiling_data_sim_runner["end"]["t_sim_init"] = 0 profiling_data_sim_runner["start"]["t_nc_write"] = 0 profiling_data_sim_runner["end"]["t_nc_write"] = 0 - profiling_data_sim_runner["start"]["t_step"] = 0 - profiling_data_sim_runner["end"]["t_step"] = 0 + profiling_data_sim_runner["start"]["t_full_step"] = 0 + profiling_data_sim_runner["end"]["t_full_step"] = 0 profiling_data_sim_runner["start"]["t_sim_init"] = time.time() @@ -121,7 +121,14 @@ def runSimulation(simulator, simulator_args, outfile, save_times, save_var_names outdata.ncfile.git_hash = getGitHash() outdata.ncfile.git_status = getGitStatus() outdata.ncfile.simulator = str(simulator) - outdata.ncfile.sim_args = toJson(simulator_args) + + # do not write fields to attributes (they are to large) + simulator_args_for_ncfile = simulator_args.copy() + del simulator_args_for_ncfile["rho"] + del simulator_args_for_ncfile["rho_u"] + del simulator_args_for_ncfile["rho_v"] + del simulator_args_for_ncfile["E"] + outdata.ncfile.sim_args = toJson(simulator_args_for_ncfile) #Create dimensions outdata.ncfile.createDimension('time', len(save_times)) @@ -172,13 +179,13 @@ def runSimulation(simulator, simulator_args, outfile, save_times, save_var_names logger.error("Error after {:d} steps (t={:f}: {:s}".format(sim.simSteps(), sim.simTime(), str(e))) return outdata.filename - profiling_data_sim_runner["start"]["t_step"] += time.time() + profiling_data_sim_runner["start"]["t_full_step"] += time.time() #Simulate if (t_step > 0.0): sim.simulate(t_step, dt) - profiling_data_sim_runner["end"]["t_step"] += time.time() + profiling_data_sim_runner["end"]["t_full_step"] += time.time() profiling_data_sim_runner["start"]["t_nc_write"] += time.time() diff --git a/GPUSimulators/EE2D_KP07_dimsplit.py b/GPUSimulators/EE2D_KP07_dimsplit.py index cc15c9c..2c3f810 100644 --- a/GPUSimulators/EE2D_KP07_dimsplit.py +++ b/GPUSimulators/EE2D_KP07_dimsplit.py @@ -138,9 +138,9 @@ class EE2D_KP07_dimsplit (BaseSimulator): return if external and not internal: - ############################################################# - # XXX: Only treating north and south external cells for now # - ############################################################# + ################################### + # XXX: Corners are treated twice! # + ################################### ns_grid_size = (self.grid_size[0], 1) @@ -189,14 +189,58 @@ class EE2D_KP07_dimsplit (BaseSimulator): self.cfl_data.gpudata, 0, 0, self.nx, int(self.u0[0].y_halo)) + + we_grid_size = (1, self.grid_size[1]) + + # WEST + # (x0, y0) x (x1, y1) + # (0, 0) x (x_halo, ny) + self.kernel.prepared_async_call(we_grid_size, self.block_size, self.stream, + self.nx, self.ny, + self.dx, self.dy, dt, + self.g, + self.gamma, + self.theta, + substep, + self.boundary_conditions, + self.u0[0].data.gpudata, self.u0[0].data.strides[0], + self.u0[1].data.gpudata, self.u0[1].data.strides[0], + self.u0[2].data.gpudata, self.u0[2].data.strides[0], + self.u0[3].data.gpudata, self.u0[3].data.strides[0], + self.u1[0].data.gpudata, self.u1[0].data.strides[0], + self.u1[1].data.gpudata, self.u1[1].data.strides[0], + self.u1[2].data.gpudata, self.u1[2].data.strides[0], + self.u1[3].data.gpudata, self.u1[3].data.strides[0], + self.cfl_data.gpudata, + 0, 0, + int(self.u0[0].x_halo), self.ny) + + # EAST + # (x0, y0) x (x1, y1) + # (nx-x_halo, 0) x (nx, ny) + self.kernel.prepared_async_call(we_grid_size, self.block_size, self.stream, + self.nx, self.ny, + self.dx, self.dy, dt, + self.g, + self.gamma, + self.theta, + substep, + self.boundary_conditions, + self.u0[0].data.gpudata, self.u0[0].data.strides[0], + self.u0[1].data.gpudata, self.u0[1].data.strides[0], + self.u0[2].data.gpudata, self.u0[2].data.strides[0], + self.u0[3].data.gpudata, self.u0[3].data.strides[0], + self.u1[0].data.gpudata, self.u1[0].data.strides[0], + self.u1[1].data.gpudata, self.u1[1].data.strides[0], + self.u1[2].data.gpudata, self.u1[2].data.strides[0], + self.u1[3].data.gpudata, self.u1[3].data.strides[0], + self.cfl_data.gpudata, + self.nx - int(self.u0[0].x_halo), 0, + self.nx, self.ny) return if internal and not external: - ############################################################# - # XXX: Only treating north and south external cells for now # - # So we need to include west and east boundary here! # - ############################################################# - + # INTERNAL DOMAIN # (x0, y0) x (x1, y1) # (x_halo, y_halo) x (nx - x_halo, ny - y_halo) @@ -217,8 +261,8 @@ class EE2D_KP07_dimsplit (BaseSimulator): self.u1[2].data.gpudata, self.u1[2].data.strides[0], self.u1[3].data.gpudata, self.u1[3].data.strides[0], self.cfl_data.gpudata, - 0, int(self.u0[0].y_halo), - self.nx, self.ny - int(self.u0[0].y_halo)) + int(self.u0[0].x_halo), int(self.u0[0].y_halo), + self.nx - int(self.u0[0].x_halo), self.ny - int(self.u0[0].y_halo)) return def swapBuffers(self): diff --git a/GPUSimulators/MPISimulator.py b/GPUSimulators/MPISimulator.py index 3e2a7e0..c092c01 100644 --- a/GPUSimulators/MPISimulator.py +++ b/GPUSimulators/MPISimulator.py @@ -27,7 +27,7 @@ from mpi4py import MPI import time import pycuda.driver as cuda -import nvtx +#import nvtx @@ -208,18 +208,17 @@ class MPISimulator(Simulator.BaseSimulator): """ def __init__(self, sim, grid): self.profiling_data_mpi = { 'start': {}, 'end': {} } - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange"] = 0 - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange"] = 0 - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_download"] = 0 - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_download"] = 0 - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_upload"] = 0 - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_upload"] = 0 - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] = 0 - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] = 0 - self.profiling_data_mpi["start"]["t_step_mpi"] = 0 - self.profiling_data_mpi["end"]["t_step_mpi"] = 0 + self.profiling_data_mpi["start"]["t_mpi_halo_exchange"] = 0 + self.profiling_data_mpi["end"]["t_mpi_halo_exchange"] = 0 + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_download"] = 0 + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_download"] = 0 + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_upload"] = 0 + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_upload"] = 0 + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] = 0 + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] = 0 + self.profiling_data_mpi["start"]["t_mpi_step"] = 0 + self.profiling_data_mpi["end"]["t_mpi_step"] = 0 self.profiling_data_mpi["n_time_steps"] = 0 - self.profiling_data_mpi["start"]["t_sim_mpi_init"] = time.time() self.logger = logging.getLogger(__name__) autotuner = sim.context.autotuner @@ -297,43 +296,43 @@ class MPISimulator(Simulator.BaseSimulator): #Note that east and west also transfer ghost cells #whilst north/south only transfer internal cells #Reuses the width/height defined in the read-extets above - self.in_e = cuda.pagelocked_empty((int(self.nvars), int(self.read_e[3]), int(self.read_e[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty((self.nvars, self.read_e[3], self.read_e[2]), dtype=np.float32) - self.in_w = cuda.pagelocked_empty((int(self.nvars), int(self.read_w[3]), int(self.read_w[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty((self.nvars, self.read_w[3], self.read_w[2]), dtype=np.float32) - self.in_n = cuda.pagelocked_empty((int(self.nvars), int(self.read_n[3]), int(self.read_n[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty((self.nvars, self.read_n[3], self.read_n[2]), dtype=np.float32) - self.in_s = cuda.pagelocked_empty((int(self.nvars), int(self.read_s[3]), int(self.read_s[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty((self.nvars, self.read_s[3], self.read_s[2]), dtype=np.float32) + self.in_e = cuda.pagelocked_empty((int(self.nvars), int(self.read_e[3]), int(self.read_e[2])), dtype=np.float32) #np.empty((self.nvars, self.read_e[3], self.read_e[2]), dtype=np.float32) + self.in_w = cuda.pagelocked_empty((int(self.nvars), int(self.read_w[3]), int(self.read_w[2])), dtype=np.float32) #np.empty((self.nvars, self.read_w[3], self.read_w[2]), dtype=np.float32) + self.in_n = cuda.pagelocked_empty((int(self.nvars), int(self.read_n[3]), int(self.read_n[2])), dtype=np.float32) #np.empty((self.nvars, self.read_n[3], self.read_n[2]), dtype=np.float32) + self.in_s = cuda.pagelocked_empty((int(self.nvars), int(self.read_s[3]), int(self.read_s[2])), dtype=np.float32) #np.empty((self.nvars, self.read_s[3], self.read_s[2]), dtype=np.float32) #Allocate data for sending - self.out_e = cuda.pagelocked_empty((int(self.nvars), int(self.read_e[3]), int(self.read_e[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty_like(self.in_e) - self.out_w = cuda.pagelocked_empty((int(self.nvars), int(self.read_w[3]), int(self.read_w[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty_like(self.in_w) - self.out_n = cuda.pagelocked_empty((int(self.nvars), int(self.read_n[3]), int(self.read_n[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty_like(self.in_n) - self.out_s = cuda.pagelocked_empty((int(self.nvars), int(self.read_s[3]), int(self.read_s[2])), dtype=np.float32, mem_flags=cuda.host_alloc_flags.PORTABLE) #np.empty_like(self.in_s) + self.out_e = cuda.pagelocked_empty((int(self.nvars), int(self.read_e[3]), int(self.read_e[2])), dtype=np.float32) #np.empty_like(self.in_e) + self.out_w = cuda.pagelocked_empty((int(self.nvars), int(self.read_w[3]), int(self.read_w[2])), dtype=np.float32) #np.empty_like(self.in_w) + self.out_n = cuda.pagelocked_empty((int(self.nvars), int(self.read_n[3]), int(self.read_n[2])), dtype=np.float32) #np.empty_like(self.in_n) + self.out_s = cuda.pagelocked_empty((int(self.nvars), int(self.read_s[3]), int(self.read_s[2])), dtype=np.float32) #np.empty_like(self.in_s) self.logger.debug("Simlator rank {:d} initialized on {:s}".format(self.grid.comm.rank, MPI.Get_processor_name())) - self.profiling_data_mpi["end"]["t_sim_mpi_init"] = time.time() - self.old_exchange() + self.full_exchange() + sim.context.synchronize() def substep(self, dt, step_number): - nvtx.mark("substep start", color="yellow") + #nvtx.mark("substep start", color="yellow") - self.profiling_data_mpi["start"]["t_step_mpi"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_step"] += time.time() - nvtx.mark("substep internal", color="red") - self.sim.substep(dt, step_number, internal=True, external=False) # "internal ghost cells" excluded - - nvtx.mark("substep external", color="blue") + #nvtx.mark("substep external", color="blue") self.sim.substep(dt, step_number, external=True, internal=False) # only "internal ghost cells" + + #nvtx.mark("substep internal", color="red") + self.sim.substep(dt, step_number, internal=True, external=False) # "internal ghost cells" excluded #nvtx.mark("substep full", color="blue") #self.sim.substep(dt, step_number, external=True, internal=True) self.sim.swapBuffers() - self.profiling_data_mpi["end"]["t_step_mpi"] += time.time() + self.profiling_data_mpi["end"]["t_mpi_step"] += time.time() - nvtx.mark("exchange", color="blue") - self.old_exchange() + #nvtx.mark("exchange", color="blue") + self.full_exchange() #nvtx.mark("download", color="blue") #self.download_for_exchange(self.sim.u0) @@ -344,10 +343,10 @@ class MPISimulator(Simulator.BaseSimulator): #nvtx.mark("upload", color="blue") #self.upload_for_exchange(self.sim.u0) - nvtx.mark("sync start", color="blue") + #nvtx.mark("sync start", color="blue") self.sim.stream.synchronize() self.sim.internal_stream.synchronize() - nvtx.mark("sync end", color="blue") + #nvtx.mark("sync end", color="blue") self.profiling_data_mpi["n_time_steps"] += 1 @@ -383,8 +382,7 @@ class MPISimulator(Simulator.BaseSimulator): return [x0, x1, y0, y1] def download_for_exchange(self, u): - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_download"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_download"] += time.time() # North-south if self.north is not None: @@ -406,12 +404,10 @@ class MPISimulator(Simulator.BaseSimulator): u[k].download(self.sim.stream, cpu_data=self.out_w[k,:,:], asynch=True, extent=self.read_w) #self.out_w[k,:,:] = u[k].download(self.sim.stream, asynch=True, extent=self.read_w) - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_download"] += time.time() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_download"] += time.time() def exchange(self): - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] += time.time() #Send/receive to north/south neighbours comm_send = [] @@ -441,12 +437,10 @@ class MPISimulator(Simulator.BaseSimulator): for comm in comm_send: comm.wait() - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] += time.time() def upload_for_exchange(self, u): - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_upload"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_upload"] += time.time() # North-south if self.north is not None: @@ -464,15 +458,11 @@ class MPISimulator(Simulator.BaseSimulator): for k in range(self.nvars): u[k].upload(self.sim.stream, self.in_w[k,:,:], extent=self.write_w) - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_upload"] += time.time() - + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_upload"] += time.time() - - - def old_exchange(self): + def full_exchange(self): #### # FIXME: This function can be optimized using persitent communications. # Also by overlapping some of the communications north/south and east/west of GPU and intra-node @@ -484,8 +474,7 @@ class MPISimulator(Simulator.BaseSimulator): #### #Download from the GPU - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_download"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_download"] += time.time() if self.north is not None: for k in range(self.nvars): @@ -495,10 +484,10 @@ class MPISimulator(Simulator.BaseSimulator): self.sim.u0[k].download(self.sim.stream, cpu_data=self.out_s[k,:,:], asynch=True, extent=self.read_s) self.sim.stream.synchronize() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_download"] += time.time() + #Send/receive to north/south neighbours - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_download"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] += time.time() comm_send = [] comm_recv = [] @@ -513,10 +502,10 @@ class MPISimulator(Simulator.BaseSimulator): for comm in comm_recv: comm.wait() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] += time.time() + #Upload to the GPU - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_upload"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_upload"] += time.time() if self.north is not None: for k in range(self.nvars): @@ -524,25 +513,23 @@ class MPISimulator(Simulator.BaseSimulator): if self.south is not None: for k in range(self.nvars): self.sim.u0[k].upload(self.sim.stream, self.in_s[k,:,:], extent=self.write_s) + + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_upload"] += time.time() #Wait for sending to complete - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_upload"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] += time.time() for comm in comm_send: comm.wait() - + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] += time.time() #### # Then transfer east-west including ghost cells that have been filled in by north-south transfer above #### #Download from the GPU - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_download"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_download"] += time.time() if self.east is not None: for k in range(self.nvars): @@ -552,10 +539,10 @@ class MPISimulator(Simulator.BaseSimulator): self.sim.u0[k].download(self.sim.stream, cpu_data=self.out_w[k,:,:], asynch=True, extent=self.read_w) self.sim.stream.synchronize() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_download"] += time.time() + #Send/receive to east/west neighbours - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_download"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] += time.time() comm_send = [] comm_recv = [] @@ -566,15 +553,14 @@ class MPISimulator(Simulator.BaseSimulator): comm_send += [self.grid.comm.Isend(self.out_w, dest=self.west, tag=4*self.nt + 3)] comm_recv += [self.grid.comm.Irecv(self.in_w, source=self.west, tag=4*self.nt + 2)] - #Wait for incoming transfers to complete for comm in comm_recv: comm.wait() + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] += time.time() + #Upload to the GPU - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_upload"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_upload"] += time.time() if self.east is not None: for k in range(self.nvars): @@ -583,13 +569,12 @@ class MPISimulator(Simulator.BaseSimulator): for k in range(self.nvars): self.sim.u0[k].upload(self.sim.stream, self.in_w[k,:,:], extent=self.write_w) + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_upload"] += time.time() + #Wait for sending to complete - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_upload"] += time.time() - self.profiling_data_mpi["start"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + self.profiling_data_mpi["start"]["t_mpi_halo_exchange_sendreceive"] += time.time() for comm in comm_send: comm.wait() - - if self.profiling_data_mpi["n_time_steps"] > 0: - self.profiling_data_mpi["end"]["t_step_mpi_halo_exchange_sendreceive"] += time.time() + + self.profiling_data_mpi["end"]["t_mpi_halo_exchange_sendreceive"] += time.time() diff --git a/dgx-2_strong_scaling_benchmark.job b/dgx-2_scaling_benchmark.job similarity index 62% rename from dgx-2_strong_scaling_benchmark.job rename to dgx-2_scaling_benchmark.job index d607feb..d4c7cb5 100644 --- a/dgx-2_strong_scaling_benchmark.job +++ b/dgx-2_scaling_benchmark.job @@ -6,6 +6,21 @@ #SBATCH -t 0-00:10 # time (D-HH:MM) #SBATCH -o slurm.%N.%j.out # STDOUT #SBATCH -e slurm.%N.%j.err # STDERR +#SBATCH --reservation=martinls_17 + + +# For Linux 64, Open MPI is built with CUDA awareness but this support is disabled by default. +# To enable it, please set the environment variable OMPI_MCA_opal_cuda_support=true before +# launching your MPI processes. Equivalently, you can set the MCA parameter in the command line: +# mpiexec --mca opal_cuda_support 1 ... +# +# In addition, the UCX support is also built but disabled by default. +# To enable it, first install UCX (conda install -c conda-forge ucx). Then, set the environment +# variables OMPI_MCA_pml="ucx" OMPI_MCA_osc="ucx" before launching your MPI processes. +# Equivalently, you can set the MCA parameters in the command line: +# mpiexec --mca pml ucx --mca osc ucx ... +# Note that you might also need to set UCX_MEMTYPE_CACHE=n for CUDA awareness via UCX. +# Please consult UCX's documentation for detail. ulimit -s 10240 module load slurm/20.02.7 @@ -26,7 +41,11 @@ cp -r . /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU cd /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU #mpirun --mca btl_openib_if_include mlx5_0 --mca btl_openib_warn_no_device_params_found 0 $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile #nsys profile -t nvtx,cuda mpirun -np $SLURM_NTASKS numactl --cpunodebind=0 --localalloc $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile -mpirun -np $SLURM_NTASKS numactl --cpunodebind=0 --localalloc $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +#mpirun -np $SLURM_NTASKS numactl --cpunodebind=0 --localalloc $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile + +export OMPI_MCA_opal_cuda_support=true +mpirun -np $SLURM_NTASKS $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile + cd $HOME/src/ShallowWaterGPU ## Copy files from work directory: diff --git a/dgx-2_strong_scaling_benchmark.sh b/dgx-2_strong_scaling_benchmark.sh index 9c94602..cf6121d 100644 --- a/dgx-2_strong_scaling_benchmark.sh +++ b/dgx-2_strong_scaling_benchmark.sh @@ -2,21 +2,72 @@ TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") -# one node: 1-8 GPUs -sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=4096,NY=2048,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=4096,NY=1365,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=4096,NY=1024,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=4096,NY=819,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=4096,NY=683,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=4096,NY=585,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job +# one node: 1-16 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=8192,NY=4096,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=8192,NY=2731,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=8192,NY=2048,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=8192,NY=1638,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=8192,NY=1365,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=8192,NY=1170,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=8192,NY=1024,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +# +#sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=8192,NY=910,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=8192,NY=819,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=8192,NY=745,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=8192,NY=683,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=8192,NY=630,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=8192,NY=585,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=8192,NY=546,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=8192,NY=512,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=4096,NY=512,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job +# one node: 4-16 GPUs +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=41984,NY=10496,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=41984,NY=8396,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=41984,NY=6997,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=41984,NY=5997,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=41984,NY=5248,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +# +#sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=41984,NY=4664,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=41984,NY=4198,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=41984,NY=3816,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=41984,NY=3498,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=41984,NY=3229,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=41984,NY=2998,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=41984,NY=2798,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=41984,NY=2624,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job + +# one node: 1-16 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=22528,NY=11264,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=22528,NY=7509,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=22528,NY=5632,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=22528,NY=4505,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=22528,NY=3754,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=22528,NY=3218,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=22528,NY=2816,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job + +sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=22528,NY=2503,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=22528,NY=2252,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=22528,NY=2048,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=22528,NY=1877,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=22528,NY=1732,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=22528,NY=1609,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=22528,NY=1501,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=22528,NY=1408,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job + +# one node: 4-16 GPUs +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=45056,NY=11264,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=45056,NY=8396,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=45056,NY=6997,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=45056,NY=5997,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=45056,NY=5248,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job + +sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=45056,NY=4664,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=45056,NY=4198,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=45056,NY=3816,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=45056,NY=3498,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=45056,NY=3229,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=45056,NY=2998,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=45056,NY=2798,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=45056,NY=2624,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job diff --git a/dgx-2_weak_scaling_benchmark.sh b/dgx-2_weak_scaling_benchmark.sh index 4bb0772..fddabf9 100644 --- a/dgx-2_weak_scaling_benchmark.sh +++ b/dgx-2_weak_scaling_benchmark.sh @@ -2,21 +2,40 @@ TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") -# one node: 1-8 GPUs -sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job +# one node: 1-16 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +# +#sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=4096,NY=4096,NOW=$TIMESTAMP dgx-2_strong_scaling_benchmark.job +# one node: 1-16 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job + +sbatch --nodes=1 --gpus-per-node=9 --ntasks-per-node=9 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=10 --ntasks-per-node=10 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=11 --ntasks-per-node=11 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=12 --ntasks-per-node=12 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=13 --ntasks-per-node=13 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=14 --ntasks-per-node=14 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=15 --ntasks-per-node=15 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=16 --ntasks-per-node=16 --export=ALL,NX=22528,NY=22528,NOW=$TIMESTAMP dgx-2_scaling_benchmark.job \ No newline at end of file diff --git a/hgx_scaling_benchmark.job b/hgx_scaling_benchmark.job new file mode 100644 index 0000000..f072fcf --- /dev/null +++ b/hgx_scaling_benchmark.job @@ -0,0 +1,58 @@ +#!/bin/bash +# See http://wiki.ex3.simula.no before changing the values below +#SBATCH -p hgx2q # partition (GPU queue) +#SBATCH -w g002 # HGX node +#SBATCH -t 0-00:10 # time (D-HH:MM) +#SBATCH -o slurm.%N.%j.out # STDOUT +#SBATCH -e slurm.%N.%j.err # STDERR +#SBATCH --reservation=martinls_11 + + +# For Linux 64, Open MPI is built with CUDA awareness but this support is disabled by default. +# To enable it, please set the environment variable OMPI_MCA_opal_cuda_support=true before +# launching your MPI processes. Equivalently, you can set the MCA parameter in the command line: +# mpiexec --mca opal_cuda_support 1 ... +# +# In addition, the UCX support is also built but disabled by default. +# To enable it, first install UCX (conda install -c conda-forge ucx). Then, set the environment +# variables OMPI_MCA_pml="ucx" OMPI_MCA_osc="ucx" before launching your MPI processes. +# Equivalently, you can set the MCA parameters in the command line: +# mpiexec --mca pml ucx --mca osc ucx ... +# Note that you might also need to set UCX_MEMTYPE_CACHE=n for CUDA awareness via UCX. +# Please consult UCX's documentation for detail. + +ulimit -s 10240 +module load slurm/20.02.7 +module load cuda11.2/toolkit/11.2.2 +module load openmpi4-cuda11.2-ofed50-gcc8/4.1.0 + +# Check how many gpu's your job got +#nvidia-smi + +mkdir -p output_hgx/$NOW + +## Copy input files to the work directory: +mkdir -p /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU +cp -r . /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU + +# Run job +# (Assumes Miniconda is installed in user root dir.) +cd /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU +#mpirun --mca btl_openib_if_include mlx5_0 --mca btl_openib_warn_no_device_params_found 0 $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +#nsys profile -t nvtx,cuda mpirun -np $SLURM_NTASKS numactl --cpunodebind=0 --localalloc $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +#mpirun -np $SLURM_NTASKS numactl --cpunodebind=0 --localalloc $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile + +export OMPI_MCA_opal_cuda_support=true +mpirun -np $SLURM_NTASKS $HOME/miniconda3/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile + +cd $HOME/src/ShallowWaterGPU + +## Copy files from work directory: +# (NOTE: Copying is not performed if job fails!) +mkdir -p output_hgx/$NOW/$SLURM_JOB_ID +mv /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU/*.log ./output_hgx/$NOW/$SLURM_JOB_ID +mv /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU/*.nc ./output_hgx/$NOW/$SLURM_JOB_ID +mv /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU/*.json ./output_hgx/$NOW +mv /work/$USER/$SLURM_JOB_ID/ShallowWaterGPU/*.qdrep ./output_hgx/$NOW + +rm -rf /work/$USER/$SLURM_JOB_ID diff --git a/hgx_strong_scaling_benchmark.sh b/hgx_strong_scaling_benchmark.sh new file mode 100644 index 0000000..f92c611 --- /dev/null +++ b/hgx_strong_scaling_benchmark.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") + +# one node: 1-8 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=8192,NY=4096,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=8192,NY=2731,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=8192,NY=2048,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=8192,NY=1638,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=8192,NY=1365,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=8192,NY=1170,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=8192,NY=1024,NOW=$TIMESTAMP hgx_scaling_benchmark.job + +# one node: 4-8 GPUs +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=41984,NY=10496,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=41984,NY=8396,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=41984,NY=6997,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=41984,NY=5997,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=41984,NY=5248,NOW=$TIMESTAMP hgx_scaling_benchmark.job diff --git a/hgx_weak_scaling_benchmark.sh b/hgx_weak_scaling_benchmark.sh new file mode 100644 index 0000000..11b91d5 --- /dev/null +++ b/hgx_weak_scaling_benchmark.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") + +# one node: 1-16 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job +#sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=8192,NY=8192,NOW=$TIMESTAMP hgx_scaling_benchmark.job + +# one node: 1-8 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=5 --ntasks-per-node=5 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=6 --ntasks-per-node=6 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=7 --ntasks-per-node=7 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job +sbatch --nodes=1 --gpus-per-node=8 --ntasks-per-node=8 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP hgx_scaling_benchmark.job diff --git a/mpiTesting.py b/mpiTesting.py index 42e3bad..d33116b 100644 --- a/mpiTesting.py +++ b/mpiTesting.py @@ -114,13 +114,13 @@ logger.info("Generating initial conditions") nx = args.nx ny = args.ny -dt = 0.00001 +dt = 0.000001 gamma = 1.4 #save_times = np.linspace(0, 0.000009, 2) #save_times = np.linspace(0, 0.000099, 11) #save_times = np.linspace(0, 0.000099, 2) -save_times = np.linspace(0, 0.000999, 2) +save_times = np.linspace(0, 0.0000999, 2) outfile = "mpi_out_" + str(MPI.COMM_WORLD.rank) + ".nc" save_var_names = ['rho', 'rho_u', 'rho_v', 'E'] @@ -183,6 +183,8 @@ if(args.profile and MPI.COMM_WORLD.rank == 0): profiling_data["slurm_job_id"] = job_id profiling_data["n_cuda_devices"] = str(num_cuda_devices) profiling_data["n_processes"] = str(MPI.COMM_WORLD.size) + profiling_data["git_hash"] = Common.getGitHash() + profiling_data["git_status"] = Common.getGitStatus() with open(profiling_file, "w") as write_file: json.dump(profiling_data, write_file) diff --git a/saga_strong_scaling_benchmark.job b/saga_scaling_benchmark.job similarity index 59% rename from saga_strong_scaling_benchmark.job rename to saga_scaling_benchmark.job index fc61ffb..4ba1297 100644 --- a/saga_strong_scaling_benchmark.job +++ b/saga_scaling_benchmark.job @@ -1,6 +1,6 @@ #!/bin/bash # Job name: -#SBATCH --job-name=ShallowWaterGPUStrongScaling +#SBATCH --job-name=ShallowWaterGPUScaling # # Project: #SBATCH --account=nn9882k @@ -16,7 +16,8 @@ #SBATCH --partition=accel # # Max memory usage per task (core) - increasing this will cost more core hours: -#SBATCH --mem-per-cpu=3800M +##SBATCH --mem-per-cpu=3800M +#SBATCH --mem-per-cpu=24G # #SBATCH --qos=devel @@ -26,6 +27,8 @@ module restore system # instead of 'module purge' rather set module environment to the system default module load CUDA/11.4.1 +#module load CUDA/11.1.1-GCC-10.2.0 +#module load OpenMPI/4.0.5-gcccuda-2020b # It is also recommended to to list loaded modules, for easier debugging: module list @@ -40,12 +43,23 @@ cp -r . $SCRATCH/ShallowWaterGPU ## Make sure the results are copied back to the submit directory (see Work Directory below): # chkfile MyResultFile # chkfile is replaced by 'savefile' on Saga -savefile "$SCRATCH/ShallowWaterGPU/*.log" -savefile "$SCRATCH/ShallowWaterGPU/*.nc" -savefile "$SCRATCH/ShallowWaterGPU/*.json" +#savefile "$SCRATCH/ShallowWaterGPU/*.log" +#savefile "$SCRATCH/ShallowWaterGPU/*.nc" +#savefile "$SCRATCH/ShallowWaterGPU/*.json" +#savefile "$SCRATCH/ShallowWaterGPU/*.qdrep" + +cleanup "rm -rf $SCRATCH/ShallowWaterGPU" + +export OMPI_MCA_opal_cuda_support=true ## Do some work: cd $SCRATCH/ShallowWaterGPU -srun $HOME/.conda/envs/ShallowWaterGPU_HPC/bin/python3 --version -srun $HOME/.conda/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +srun /cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/bin/python3 --version +srun /cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +cd $HOME/src/ShallowWaterGPU +mkdir -p output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.log ./output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.nc ./output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.json ./output_saga/$NOW +mv $SCRATCH/ShallowWaterGPU/*.qdrep ./output_saga/$NOW diff --git a/saga_strong_scaling_benchmark.sh b/saga_strong_scaling_benchmark.sh index 96ba541..e550aca 100644 --- a/saga_strong_scaling_benchmark.sh +++ b/saga_strong_scaling_benchmark.sh @@ -1,13 +1,30 @@ #!/bin/bash -# one node: 1-4 GPUs -sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=1024,NY=1024 saga_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=1024,NY=512 saga_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=1024,NY=341 saga_strong_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=512,NY=512 saga_strong_scaling_benchmark.job +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") -# 2-4 nodes: 1 GPUs per node -sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=1024,NY=512 saga_strong_scaling_benchmark.job -sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=1024,NY=341 saga_strong_scaling_benchmark.job -sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=512,NY=512 saga_strong_scaling_benchmark.job +# one node: 1–4 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=10240,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=6826,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +# 4 nodes: 1–4 GPUs per node +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=2560,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=1706,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=1280,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks + +# 4 nodes: 1–4 GPUs per node +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=40960,NY=10240,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=40960,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=40960,NY=3413,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=40960,NY=2560,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks + +## one node: 1–4 GPUs +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=24576,NY=6144,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +# +## 4 nodes: 1–4 GPUs per node +#sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=24576,NY=6144,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +#sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=24576,NY=3072,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +#sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=24576,NY=2048,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +#sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=24576,NY=1536,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks diff --git a/saga_weak_scaling_benchmark.sh b/saga_weak_scaling_benchmark.sh new file mode 100644 index 0000000..70da66b --- /dev/null +++ b/saga_weak_scaling_benchmark.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") + +# one node: 1-4 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +# 2-4 nodes: 1 GPUs per node +sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +## one node: 1-4 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +## 2-4 nodes: 1 GPUs per node +#sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +#sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +#sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks \ No newline at end of file diff --git a/seymour_strong_scaling_benchmark.sh b/seymour_strong_scaling_benchmark.sh index 33fe534..a894640 100644 --- a/seymour_strong_scaling_benchmark.sh +++ b/seymour_strong_scaling_benchmark.sh @@ -4,35 +4,35 @@ NOW=$(date "+%Y-%m-%dT%H%M%S") mkdir -p output_seymour/$NOW # one node: 1-8 GPUs -mpiexec -n 1 python mpiTesting.py -nx 4096 -ny 4096 --profile && +mpiexec -n 1 python mpiTesting.py -nx 8192 -ny 8192 --profile && mkdir -p output_seymour/$NOW/1_proc && mv *.log output_seymour/$NOW/1_proc/ && mv *.nc output_seymour/$NOW/1_proc/ && -mpiexec -n 2 python mpiTesting.py -nx 4096 -ny 2048 --profile && +mpiexec -n 2 python mpiTesting.py -nx 8192 -ny 4096 --profile && mkdir -p output_seymour/$NOW/2_proc && mv *.log output_seymour/$NOW/2_proc/ && mv *.nc output_seymour/$NOW/2_proc/ && -mpiexec -n 3 python mpiTesting.py -nx 4096 -ny 1365 --profile && +mpiexec -n 3 python mpiTesting.py -nx 8192 -ny 2731 --profile && mkdir -p output_seymour/$NOW/3_proc && mv *.log output_seymour/$NOW/3_proc/ && mv *.nc output_seymour/$NOW/3_proc/ && -mpiexec -n 4 python mpiTesting.py -nx 4096 -ny 1024 --profile && +mpiexec -n 4 python mpiTesting.py -nx 8192 -ny 2048 --profile && mkdir -p output_seymour/$NOW/4_proc && mv *.log output_seymour/$NOW/4_proc/ && mv *.nc output_seymour/$NOW/4_proc/ && -mpiexec -n 5 python mpiTesting.py -nx 4096 -ny 819 --profile && +mpiexec -n 5 python mpiTesting.py -nx 8192 -ny 1638 --profile && mkdir -p output_seymour/$NOW/5_proc && mv *.log output_seymour/$NOW/5_proc/ && mv *.nc output_seymour/$NOW/5_proc/ && -mpiexec -n 6 python mpiTesting.py -nx 4096 -ny 683 --profile && +mpiexec -n 6 python mpiTesting.py -nx 8192 -ny 1365 --profile && mkdir -p output_seymour/$NOW/6_proc && mv *.log output_seymour/$NOW/6_proc/ && mv *.nc output_seymour/$NOW/6_proc/ && -mpiexec -n 7 python mpiTesting.py -nx 4096 -ny 585 --profile && +mpiexec -n 7 python mpiTesting.py -nx 8192 -ny 1170 --profile && mkdir -p output_seymour/$NOW/7_proc && mv *.log output_seymour/$NOW/7_proc/ && mv *.nc output_seymour/$NOW/7_proc/ && -mpiexec -n 8 python mpiTesting.py -nx 4096 -ny 512 --profile && +mpiexec -n 8 python mpiTesting.py -nx 8192 -ny 1024 --profile && mkdir -p output_seymour/$NOW/8_proc && mv *.log output_seymour/$NOW/8_proc/ && mv *.nc output_seymour/$NOW/8_proc/ &&