Looking at the source,

the forward uses LU decomposition 1,
the backward does a SVD and then calls SVD’s backward.

The original PR introducing logdet has some discussion around the reasoning, but I must admit I don’t fully follow it (and maybe things have changed since).
Note that your benchmarking is wrong for CUDA: You need to torch.cuda.synchronitze() before taking times (both start and end).