From 248fb79b574364adc05d396c261faa387a367865 Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Wed, 4 Dec 2024 09:49:39 -0800 Subject: [PATCH] Adding weak scaling on GPUs to Docs (#1999) Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/Performance.rst | 12 ++++++++++++ Docs/sphinx_doc/figures/WeakScaling_GPU.png | Bin 0 -> 27181 bytes 2 files changed, 12 insertions(+) create mode 100644 Docs/sphinx_doc/figures/WeakScaling_GPU.png diff --git a/Docs/sphinx_doc/Performance.rst b/Docs/sphinx_doc/Performance.rst index 9cb1c6075..a41b0be63 100644 --- a/Docs/sphinx_doc/Performance.rst +++ b/Docs/sphinx_doc/Performance.rst @@ -15,6 +15,10 @@ For the strong scaling study, a fixed mesh size of :math:`(N_x, N_y, N_z) = (512 is shown in the figure below. In the above, N is the number of cores and T is the time taken per time step. At 2048 cores, and ~32^3 cells per rank, the parallel efficiency is 69%. On GPU nodes, the number of CPU ranks is held constant at 4 --- i.e., each rank offloads its work to a single GPU. Therefore, the speed-up presented here between GPU and CPU is per node, rather than per rank. On node, speed-ups of 5--15x are achieved up to 16 GPU nodes, as shown in the figure below. +A weak scaling test was performed on CPUs with a mesh size of :math:`(512,512,256) = 67.1` million, on 1 node (128 MPI ranks), and the number of cells was progressively scaled to :math:`(4096,2048,256) = 2.1` billion, on 32 nodes (4096 MPI ranks). Excellent weak scaling is shown by the nearly constant timings, for 10 iterations, as in figure below. + +A weak scaling test was also performed on GPUs with a mesh size of :math:`(256,256,512)` on 1 GPU node, and the number of cells was progressively scaled to :math:`(2048,1024,512)` on 32 nodes. The total elapsed time for 100 iterations with and without GPU-aware-MPI is shown in figure below. The nearly constant timings show excellent weak scaling and the benefits of GPU-aware-MPI are clearly observed with the 25-35% speed-up. + .. figure:: figures/StrongScaling_CPU.png :alt: Strong scaling on CPUs :name: strong_CPU @@ -46,3 +50,11 @@ is shown in the figure below. In the above, N is the number of cores and T is th :align: left **Comparison of timings on CPU and GPU showing the speed-up factor. We compare a CPU node with 128 ranks to a GPU node with 4 ranks, so there are 32x more points per GPU than per CPU core. Points on the same vertical line represent the same number of nodes.** + +.. figure:: figures/WeakScaling_GPU.png + :alt: Weak scaling on GPUs + :name: weak_GPU + :figwidth: 45% + :align: left + + **Weak scaling on GPUs with and without GPU-aware MPI.** diff --git a/Docs/sphinx_doc/figures/WeakScaling_GPU.png b/Docs/sphinx_doc/figures/WeakScaling_GPU.png new file mode 100644 index 0000000000000000000000000000000000000000..cae197382545973d9bce6a71ee8399c6bf665c80 GIT binary patch literal 27181 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 SapZpkMeWnlrQg*&67XN7E8=zl literal 0 HcmV?d00001