Hey,
One thing to be careful of here is that the CUDA api is asynchronous. So without the appropriate torch.cuda.synchronize() calls, you shoud not read too much into these timings.
Still you can see here 2 that we use LU factorization for the inverse and delegate all the heavy lifting to magma.
The pinverse is here 3 on the other hand and uses svd (done by magma as well). Note that it needs to handle batches of inputs.

Quick question about an implementation choice

Definitely open to discussions!