| 37 | |
| 38 | template<typename T> |
| 39 | Array<T> solveLU(const Array<T> &A, const Array<int> &pivot, const Array<T> &b, |
| 40 | const af_mat_prop options) { |
| 41 | if (OpenCLCPUOffload()) { return cpu::solveLU(A, pivot, b, options); } |
| 42 | |
| 43 | int N = A.dims()[0]; |
| 44 | int NRHS = b.dims()[1]; |
| 45 | |
| 46 | vector<int> ipiv(N); |
| 47 | copyData(&ipiv[0], pivot); |
| 48 | |
| 49 | Array<T> B = copyArray<T>(b); |
| 50 | |
| 51 | const Buffer *A_buf = A.get(); |
| 52 | Buffer *B_buf = B.get(); |
| 53 | |
| 54 | int info = 0; |
| 55 | magma_getrs_gpu<T>(MagmaNoTrans, N, NRHS, (*A_buf)(), A.getOffset(), |
| 56 | A.strides()[1], &ipiv[0], (*B_buf)(), B.getOffset(), |
| 57 | B.strides()[1], getQueue()(), &info); |
| 58 | return B; |
| 59 | } |
| 60 | |
| 61 | template<typename T> |
| 62 | Array<T> generalSolve(const Array<T> &a, const Array<T> &b) { |