WattOps

fp16 vs fp32 on a Tesla T4: 81 to 84% less GPU energy

Last updated 17 October 2026

How much GPU energy does fp16 save over fp32? Spec sheets give peak FLOPS and TDP, not joules per job, so we measured it on a Tesla T4: the same matrix multiply job in fp16 and in fp32, five runs each, under three different setups.

The result: fp16 used 81 to 84% less GPU energy and finished 4.3 to 4.8× faster. All three setups agree, and the spread between runs was as low as 0.1%.

To run it yourself in a few clicks, open the Kaggle notebook.

The job

An 8192 × 8192 matrix multiply, repeated 100 times, in PyTorch on one Tesla T4 (a Kaggle notebook with the GPU T4 x2 accelerator, GPU 0 only):

import sys, torch
dtype = {"fp16": torch.float16, "fp32": torch.float32}[sys.argv[1]]
a = torch.randn(8192, 8192, device="cuda", dtype=dtype)
for _ in range(100):
    b = a @ a
torch.cuda.synchronize()

Each run is a whole process (Python start-up, CUDA set-up and the 100 multiplies), so the numbers are energy per job, the way a real script uses the GPU.

How it was measured

All of it is one command, joules compare, from the open-source joules CLI.

Results

Setupfp16fp32GPU energy savedTime savedSpread (IQR)
No cooling between runs475 J, 8.6 s2.53 kJ, 39.7 s81.2%78.3%1.0 to 1.3%
Every run starts at 65 °C or cooler426 J, 7.8 s2.21 kJ, 33.8 s80.8%77.0%2.6 to 5.1%
65 °C plus 3 warm-up runs413 J, 8.4 s2.50 kJ, 40.1 s83.5%79.0%0.1 to 0.2%

p = 0.008 in all three setups.

SetupAverage power, fp16Average power, fp32Time throttled, fp16Time throttled, fp32
No cooling between runs55.7 W63.7 W62%92%
Every run starts at 65 °C or cooler54.9 W65.4 W60%92%
65 °C plus 3 warm-up runs49.2 W62.5 W62%92%

Why the gap is so large

What this does and does not tell you

Run it yourself

The quickest way: open the Kaggle notebook, click Copy & Edit, set the accelerator to GPU T4 x2 and click Run All. It installs joules, runs the comparison and prints the table.

Or, on any machine with an NVIDIA GPU, save the script above as bench.py, then:

pip install -U landauer-gap
joules compare --names fp16,fp32 --baseline fp32 \
  --runs 5 --warmup 3 --cool-to 65 --gpus 0 \
  "python3 bench.py fp16" "python3 bench.py fp32"

It prints the table above for your GPU: median GPU energy, time, average power, clocks, throttling, temperature and the p-value, with a warning when the two sides did not run under the same conditions. Add --markdown results.md to save the table. Nothing leaves the machine unless you add --track.

The joules guide lists every command. To see the same numbers for every job on a GPU fleet, with cost per job and the GPUs that sit idle, try WattOps.