77 cusparseMatDescr_t descr_M = 0;
79 cusolverSpHandle_t mCusolverhandle;
80 if (cusolverSpCreate(&mCusolverhandle) != CUSOLVER_STATUS_SUCCESS) {
84 if (cusparseCreateMatDescr(&descr_M) != CUSPARSE_STATUS_SUCCESS) {
89 if (cusparseSetMatIndexBase(descr_M, CUSPARSE_INDEX_BASE_ZERO) !=
90 CUSPARSE_STATUS_SUCCESS) {
94 if (cusparseSetMatType(descr_M, CUSPARSE_MATRIX_TYPE_GENERAL) !=
95 CUSPARSE_STATUS_SUCCESS) {
100 if (cusolverSpDcsrzfdHost(mCusolverhandle, matrix->
row_number, matrix->
nnz,
103 &perm_size) != CUSOLVER_STATUS_SUCCESS) {
108 size_t bufferSize = 0;
109 int *q = (
int *)malloc(
sizeof(
int) * matrix->
row_number);
110 int *map = (
int *)malloc(
sizeof(
int) * matrix->
nnz);
111 double *old_values = (
double *)malloc(
sizeof(
double) * matrix->
nnz);
112 for (
int i = 0; i <= matrix->
row_number; ++i) {
115 for (
int i = 0; i <= matrix->
nnz; ++i) {
117 old_values[i] = matrix->
values[i];
120 if (cusolverSpXcsrperm_bufferSizeHost(
123 &bufferSize) != CUSOLVER_STATUS_SUCCESS) {
124 dps_magma_plugin.log(
"cusolverSpXcsrperm_bufferSizeHost returend an error");
128 void *buffer = malloc(bufferSize);
130 if (cusolverSpXcsrpermHost(mCusolverhandle, matrix->
row_number,
133 q, map, buffer) != CUSOLVER_STATUS_SUCCESS) {
138 for (
int i = 0; i <= matrix->
nnz; ++i) {
139 matrix->
values[i] = old_values[map[i]];
146 data.mMagmaOpts.solver_par.solver = Magma_PIDRMERGE;
147 data.mMagmaOpts.solver_par.restart = 8;
148 data.mMagmaOpts.solver_par.maxiter = 1000;
149 data.mMagmaOpts.solver_par.rtol = 1e-10;
150 data.mMagmaOpts.solver_par.maxiter = 1000;
151 data.mMagmaOpts.precond_par.solver = Magma_ILU;
152 data.mMagmaOpts.precond_par.levels = 0;
153 data.mMagmaOpts.precond_par.trisolver = Magma_CUSOLVE;
155 magma_dsolverinfo_init(&
data.mMagmaOpts.solver_par,
156 &
data.mMagmaOpts.precond_par,
data.mMagmaQueue);
158 magma_dvinit(&
data.mDevRhsVec, Magma_DEV, matrix->
row_number, 1, 0.0,
160 magma_dmtransfer(
data.mHostSysMat, &
data.mDevSysMat, Magma_CPU, Magma_DEV,
162 magma_d_precondsetup(
data.mDevSysMat,
data.mDevRhsVec,
163 &
data.mMagmaOpts.solver_par,
164 &
data.mMagmaOpts.precond_par,
data.mMagmaQueue);
170 cusparseDestroyMatDescr(descr_M);
171 cusolverSpDestroy(mCusolverhandle);
180 for (
int i = 0; i <=
data.size; ++i) {
181 data.rhs_buffer[i] = rhs_values[
data.perm_map[i]];
185 magma_dvset(
data.size, 1,
data.rhs_buffer, &
data.mHostRhsVec,
187 magma_dmtransfer(
data.mHostRhsVec, &
data.mDevRhsVec, Magma_CPU, Magma_DEV,
189 magma_dvinit(&
data.mDevLhsVec, Magma_DEV,
data.mHostRhsVec.num_rows,
190 data.mHostRhsVec.num_cols, 0.0,
data.mMagmaQueue);
193 magma_d_solver(
data.mDevSysMat,
data.mDevRhsVec, &
data.mDevLhsVec,
194 &
data.mMagmaOpts,
data.mMagmaQueue);
197 magma_dmtransfer(
data.mDevLhsVec, &
data.mHostLhsVec, Magma_DEV, Magma_CPU,
199 magma_dvcopy(
data.mDevLhsVec, &
data.size, &one, lhs_values,
data.mMagmaQueue);