| 68 | |
| 69 | template<typename T, typename Tr> |
| 70 | void svdInPlace(Array<Tr> &s, Array<T> &u, Array<T> &vt, Array<T> &in) { |
| 71 | dim4 iDims = in.dims(); |
| 72 | int M = iDims[0]; |
| 73 | int N = iDims[1]; |
| 74 | |
| 75 | int lwork = 0; |
| 76 | |
| 77 | CUSOLVER_CHECK(gesvd_buf_func<T>(solverDnHandle(), M, N, &lwork)); |
| 78 | |
| 79 | auto lWorkspace = memAlloc<T>(lwork); |
| 80 | auto rWorkspace = memAlloc<Tr>(5 * std::min(M, N)); |
| 81 | |
| 82 | auto info = memAlloc<int>(1); |
| 83 | |
| 84 | gesvd_func<T, Tr>(solverDnHandle(), 'A', 'A', M, N, in.get(), M, s.get(), |
| 85 | u.get(), M, vt.get(), N, lWorkspace.get(), lwork, |
| 86 | rWorkspace.get(), info.get()); |
| 87 | } |
| 88 | |
| 89 | template<typename T, typename Tr> |
| 90 | void svd(Array<Tr> &s, Array<T> &u, Array<T> &vt, const Array<T> &in) { |
no test coverage detected