OOM error even though there is free space

I’m getting the following OOM error:

RuntimeError: CUDA out of memory. Tried to allocate 450.00 MiB (GPU 0; 15.78 GiB total capacity; 12.43 GiB already allocated; 171.12 MiB free; 980.30 MiB cached)

can someone explain the mechanics behind this? Even if the cached memory is discounted, there should still be 15.78 - 12.43 - 0.98 = 2.37GB of free memory. Does it have to do with all the available memory being fragmented into blocks smaller than 450MB? But even so, why does it say there is only 171MB of free space?