I guess this explains the type checks in the cuda_host and cuda_device types above I was confused about. This appears to be making the type "strided * strided * cuda_device[float32]" instead of what I thought we had chosen, which was to always have the memory type at the outermost level of "cuda_device[strided * strided * float32]". What's the reason for the former?