             int* devInfo;
             CheckCudaError(cudaMalloc(&devInfo, sizeof(int)));
 
-            device_internals.cusolver_handle().Call(getrf, m, m, lu_ptr, m, work_ptr, ipiv_ptr, devInfo);
+            device_internals.cusolverdn_handle().Call(getrf, m, m, lu_ptr, m, work_ptr, ipiv_ptr, devInfo);
 
             int devInfo_h = 0;
             CheckCudaError(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));

            int* ipiv_ptr = static_cast<int*>(internal::GetRawOffsetData(ipiv));

            int buffersize = 0;
            device_internals.cusolver_handle().Call(getrf_bufferSize, m, m, lu_ptr, m, &buffersize);

            Array work = Empty(Shape({buffersize}), dtype, device);
            T* work_ptr = static_cast<T*>(internal::GetRawOffsetData(work));

            device.backend().CallKernel<CopyKernel>(b, out);
            T* out_ptr = static_cast<T*>(internal::GetRawOffsetData(out));

            device_internals.cusolverdn_handle().Call(getrs, CUBLAS_OP_N, m, m, lu_ptr, m, ipiv_ptr, out_ptr, m, devInfo);

            CheckCudaError(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));
            if (devInfo_h != 0) {
