Because the cuda driver does some smart things to reduce fragementation in average. But if you end up in a worst case for its heuristic, it can actually be worst than our allocator (it is rare  ).
Allocation is a fairly hard problem because you don’t know about the future, so you cannot make a globally optimal choice for the final state. So you have to use heuristics. But since you don’t want to reshuffle the memory after it’s allocated, you cannot really predict final fragmentation.