---
# System prepended metadata

title: Current GTBench4Py Performance
tags: [benchmarking]

---

###### tags: `benchmarking`

# Current GTBench4Py Performance

State: end of June 2021.

## Comparison Of C++ with Tuned Python Performance

Measured on NVIDIA V100 (Tsa), domain size 512²×180, single precision. Default block sizes and default release compiler flags (fast-math disabled) are used in all cases.

| Configuration                 | Time  | Relative Time |
| ----------------------------- | ----- | ------------- |
| GTBench C++                   | 2.56s | 100.0%        |
| C++ Stencils & Python Driver¹ | 2.60s | 101.5%        |
| GT4Py gtc:cuda²               | 2.73s | 106.6%        |
| GT4Py gtc:gt:gpu²             | 2.80s | 109.4%        |
| GT4Py gtcuda²                 | 3.47s | 135.5%        |

Footnotes:
1. GTBench C++ stencils are invoked using GTBench Python bindings. Boundary conditions are handled on the Python side using sliced assignment while GTBench C++ uses GridTools boundary conditions (using fewer kernel invocations).
2. Those are measurements with all tunings enabled that are described below.

Results seem to be similar also for significantly smaller domain sizes. In the present case, the gap between Python and C++ is still negligible on a 64²×180 grid. On even smaller domain sizes it starts to grow and at some point the Python overhead dominates the run time.

## “Out-of-the-box” Performance vs. Tuned Performance

Just running GTBench4Py _without_ any tunings in GT4Py gives terrible performance numbers. This table shows the impact of applied tunings in the example of the `gtc:cuda` backend.

| Tuning                       | Time     | Relative Time |
| ---------------------------- | -------- | ------------- |
| None                         | 72.27s   | 2647.3%       |
| Disable Argument Validation  | 72.05s   | 2639.2%       |
| Remove Unneeded Device Syncs | 4.49s    | 164.5%        |
| Enforce Single-Precision     | 2.73s    | 100.0%        |


## Notes on Reproducibility

### GTBench C++

Commit: https://github.com/fthaler/gtbench/commit/2ef4e39a91ac18f83ca6a903037a2dca80f21928

Compiled using CUDA 10.2.89 and GCC 7.2.0. Built on Tsa (using CMake 3.18, Boost 1.74.0):
```bash
export CUDACXX=/usr/local/cuda-10.2/bin/nvcc
cmake -DGTBENCH_RUNTIME=single_node -DGTBENCH_BACKEND=gpu -DGTBENCH_FLOAT=float ..
make -j 8
```

### GTBench4Py

Commit: https://github.com/fthaler/gt4py-benchmarks/commit/c3da5f890431e16815e65f8ca92c967c7b477bb9

GT4Py version: https://github.com/fthaler/gt4py/tree/gtbench-hacks

Execution commands (requires Boost in the path):
```bash
export CUDA_HOME=/usr/local/cuda-10.2/
export CUDACXX=/usr/local/cuda-10.2/bin/nvcc
# Using GTBench C++ bindings
gtbench4py-benchmark single-node gtbench --gtbench-backend gpu --domain-size 512 512 180 --runs 1
# Using GT4Py + gtc:cuda
gtbench4py-benchmark single-node gt4py --gt4py-backend gtc:cuda --domain-size 512 512 180 --runs 1
# Using GT4Py + gtc:gt:gpu
gtbench4py-benchmark single-node gt4py --gt4py-backend gtc:gt:cuda --domain-size 512 512 180 --runs 1
# Using GT4Py + gtcuda
gtbench4py-benchmark single-node gt4py --gt4py-backend gtcuda --domain-size 512 512 180 --runs 1
```