Lines Matching refs:A

21 PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqAIJViennaCL(Mat A, MatType type, MatReuse reuse, Mat *newmat);
25 PetscErrorCode MatViennaCLCopyToGPU(Mat A)
27 Mat_SeqAIJViennaCL *viennaclstruct = (Mat_SeqAIJViennaCL *)A->spptr;
28 Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
31 if (A->rmap->n > 0 && A->cmap->n > 0 && a->nz) { //some OpenCL SDKs have issues with buffers of size 0
32 if (A->offloadmask == PETSC_OFFLOAD_UNALLOCATED || A->offloadmask == PETSC_OFFLOAD_CPU) {
33 PetscCall(PetscLogEventBegin(MAT_ViennaCLCopyToGPU, A, 0, 0, 0));
54 viennaclstruct->compressed_mat->set(row_buffer.get(), row_indices.get(), col_buffer.get(), a->a, A->rmap->n, A->cmap->n, a->compressedrow.nrows, a->nz);
63 row_buffer.raw_resize(dummy, A->rmap->n + 1);
64 for (PetscInt i = 0; i <= A->rmap->n; ++i) row_buffer.set(i, (a->i)[i]);
70 viennaclstruct->mat->set(row_buffer.get(), col_buffer.get(), a->a, A->rmap->n, A->cmap->n, a->nz);
71 PetscCall(PetscLogCpuToGpu(((A->rmap->n + 1) + a->nz) * sizeof(PetscInt) + (a->nz) * sizeof(PetscScalar)));
78 // Create temporary vector for v += A*x:
80 if (viennaclstruct->tempvec->size() != static_cast<std::size_t>(A->rmap->n)) {
82 viennaclstruct->tempvec = new ViennaCLVector(A->rmap->n);
87 viennaclstruct->tempvec = new ViennaCLVector(A->rmap->n);
90 A->offloadmask = PETSC_OFFLOAD_BOTH;
92 PetscCall(PetscLogEventEnd(MAT_ViennaCLCopyToGPU, A, 0, 0, 0));
98 PetscErrorCode MatViennaCLCopyFromGPU(Mat A, const ViennaCLAIJMatrix *Agpu)
100 Mat_SeqAIJViennaCL *viennaclstruct = (Mat_SeqAIJViennaCL *)A->spptr;
101 Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
102 PetscInt m = A->rmap->n;
105 if (A->offloadmask == PETSC_OFFLOAD_BOTH) PetscFunctionReturn(PETSC_SUCCESS);
106 if (A->offloadmask == PETSC_OFFLOAD_UNALLOCATED && Agpu) {
112 A->preallocated = PETSC_TRUE;
154 } else if (A->offloadmask == PETSC_OFFLOAD_UNALLOCATED) {
157 if (!Agpu && A->offloadmask != PETSC_OFFLOAD_GPU) PetscFunctionReturn(PETSC_SUCCESS);
166 A->offloadmask = PETSC_OFFLOAD_BOTH;
168 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
169 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
173 static PetscErrorCode MatMult_SeqAIJViennaCL(Mat A, Vec xx, Vec yy)
175 Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
176 Mat_SeqAIJViennaCL *viennaclstruct = (Mat_SeqAIJViennaCL *)A->spptr;
182 PetscCall(MatViennaCLCopyToGPU(A));
183 if (A->rmap->n > 0 && A->cmap->n > 0 && a->nz) {
207 static PetscErrorCode MatMultAdd_SeqAIJViennaCL(Mat A, Vec xx, Vec yy, Vec zz)
209 Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
210 Mat_SeqAIJViennaCL *viennaclstruct = (Mat_SeqAIJViennaCL *)A->spptr;
216 PetscCall(MatViennaCLCopyToGPU(A));
217 if (A->rmap->n > 0 && A->cmap->n > 0 && a->nz) {
243 static PetscErrorCode MatAssemblyEnd_SeqAIJViennaCL(Mat A, MatAssemblyType mode)
246 PetscCall(MatAssemblyEnd_SeqAIJ(A, mode));
248 if (!A->boundtocpu) PetscCall(MatViennaCLCopyToGPU(A));
267 . A - the matrix
287 PetscErrorCode MatCreateSeqAIJViennaCL(MPI_Comm comm, PetscInt m, PetscInt n, PetscInt nz, const PetscInt nnz[], Mat *A)
290 PetscCall(MatCreate(comm, A));
291 PetscCall(MatSetSizes(*A, m, n, m, n));
292 PetscCall(MatSetType(*A, MATSEQAIJVIENNACL));
293 PetscCall(MatSeqAIJSetPreallocation_SeqAIJ(*A, nz, (PetscInt *)nnz));
297 static PetscErrorCode MatDestroy_SeqAIJViennaCL(Mat A)
299 Mat_SeqAIJViennaCL *viennaclcontainer = (Mat_SeqAIJViennaCL *)A->spptr;
309 A->offloadmask = PETSC_OFFLOAD_UNALLOCATED;
314 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatConvert_seqaij_seqaijviennacl_C", NULL));
315 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatProductSetFromOptions_seqaijviennacl_seqdense_C", NULL));
316 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatProductSetFromOptions_seqaijviennacl_seqaij_C", NULL));
319 A->spptr = 0;
320 PetscCall(MatDestroy_SeqAIJ(A));
333 static PetscErrorCode MatDuplicate_SeqAIJViennaCL(Mat A, MatDuplicateOption cpvalues, Mat *B)
338 PetscCall(MatDuplicate_SeqAIJ(A, cpvalues, B));
341 PetscCall(MatBindToCPU_SeqAIJViennaCL(A, PETSC_FALSE));
358 static PetscErrorCode MatSeqAIJGetArray_SeqAIJViennaCL(Mat A, PetscScalar *array[])
361 PetscCall(MatViennaCLCopyFromGPU(A, (const ViennaCLAIJMatrix *)NULL));
362 *array = ((Mat_SeqAIJ *)A->data)->a;
366 static PetscErrorCode MatSeqAIJRestoreArray_SeqAIJViennaCL(Mat A, PetscScalar *array[])
369 A->offloadmask = PETSC_OFFLOAD_CPU;
374 static PetscErrorCode MatSeqAIJGetArrayRead_SeqAIJViennaCL(Mat A, const PetscScalar *array[])
377 PetscCall(MatViennaCLCopyFromGPU(A, (const ViennaCLAIJMatrix *)NULL));
378 *array = ((Mat_SeqAIJ *)A->data)->a;
382 static PetscErrorCode MatSeqAIJRestoreArrayRead_SeqAIJViennaCL(Mat A, const PetscScalar *array[])
386 /* No A->offloadmask = PETSC_OFFLOAD_CPU since if A->offloadmask was PETSC_OFFLOAD_BOTH, it is still BOTH */
390 static PetscErrorCode MatSeqAIJGetArrayWrite_SeqAIJViennaCL(Mat A, PetscScalar *array[])
393 *array = ((Mat_SeqAIJ *)A->data)->a;
397 static PetscErrorCode MatSeqAIJRestoreArrayWrite_SeqAIJViennaCL(Mat A, PetscScalar *array[])
400 A->offloadmask = PETSC_OFFLOAD_CPU;
405 static PetscErrorCode MatBindToCPU_SeqAIJViennaCL(Mat A, PetscBool flg)
407 Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
410 A->boundtocpu = flg;
418 PetscCall(MatViennaCLCopyFromGPU(A, (const ViennaCLAIJMatrix *)NULL));
419 A->ops->mult = MatMult_SeqAIJ;
420 A->ops->multadd = MatMultAdd_SeqAIJ;
421 A->ops->assemblyend = MatAssemblyEnd_SeqAIJ;
422 A->ops->duplicate = MatDuplicate_SeqAIJ;
425 A->ops->mult = MatMult_SeqAIJViennaCL;
426 A->ops->multadd = MatMultAdd_SeqAIJViennaCL;
427 A->ops->assemblyend = MatAssemblyEnd_SeqAIJViennaCL;
428 A->ops->destroy = MatDestroy_SeqAIJViennaCL;
429 A->ops->duplicate = MatDuplicate_SeqAIJViennaCL;
441 PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqAIJViennaCL(Mat A, MatType type, MatReuse reuse, Mat *newmat)
446 PetscCheck(reuse != MAT_REUSE_MATRIX, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "MAT_REUSE_MATRIX is not supported. Consider using MAT_INPLACE_MATRIX instead");
448 if (reuse == MAT_INITIAL_MATRIX) PetscCall(MatDuplicate(A, MAT_COPY_VALUES, newmat));
458 PetscCall(MatBindToCPU_SeqAIJViennaCL(A, PETSC_FALSE));
459 A->ops->bindtocpu = MatBindToCPU_SeqAIJViennaCL;
465 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatConvert_seqaij_seqaijviennacl_C", MatConvert_SeqAIJ_SeqAIJViennaCL));
466 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatProductSetFromOptions_seqaijviennacl_seqdense_C", MatProductSetFromOptions_SeqAIJ_SeqDense));
467 PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatProductSetFromOptions_seqaijviennacl_seqaij_C", MatProductSetFromOptions_SeqAIJ));
477 MATSEQAIJVIENNACL - MATAIJVIENNACL = "aijviennacl" = "seqaijviennacl" - A matrix type to be used for sparse matrices.
479 A matrix type whose data resides on GPUs. These matrices are in CSR format by