xref: /petsc/src/vec/vec/impls/seq/seqviennacl/viennaclvecimpl.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
1 #pragma once
2 
3 #include <petscviennacl.h>
4 #include <petsc/private/vecimpl.h>
5 #include <petsc/private/deviceimpl.h>
6 
7 #include <algorithm>
8 #include <vector>
9 #include <string>
10 #include <exception>
11 
12 #include "viennacl/vector.hpp"
13 
14 #define ViennaCLWaitForGPU() \
15   if (PetscViennaCLSynchronize) viennacl::backend::finish();
16 
17 typedef viennacl::vector<PetscScalar> ViennaCLVector;
18 
19 PETSC_EXTERN PetscErrorCode PetscViennaCLInit(void);
20 
21 PETSC_INTERN PetscErrorCode VecDotNorm2_SeqViennaCL(Vec, Vec, PetscScalar *, PetscScalar *);
22 PETSC_INTERN PetscErrorCode VecPointwiseDivide_SeqViennaCL(Vec, Vec, Vec);
23 PETSC_INTERN PetscErrorCode VecWAXPY_SeqViennaCL(Vec, PetscScalar, Vec, Vec);
24 PETSC_INTERN PetscErrorCode VecMDot_SeqViennaCL(Vec, PetscInt, const Vec[], PetscScalar *);
25 PETSC_INTERN PetscErrorCode VecSet_SeqViennaCL(Vec, PetscScalar);
26 PETSC_INTERN PetscErrorCode VecMAXPY_SeqViennaCL(Vec, PetscInt, const PetscScalar *, Vec *);
27 PETSC_INTERN PetscErrorCode VecAXPBYPCZ_SeqViennaCL(Vec, PetscScalar, PetscScalar, PetscScalar, Vec, Vec);
28 PETSC_INTERN PetscErrorCode VecPointwiseMult_SeqViennaCL(Vec, Vec, Vec);
29 PETSC_INTERN PetscErrorCode VecPlaceArray_SeqViennaCL(Vec, const PetscScalar *);
30 PETSC_INTERN PetscErrorCode VecResetArray_SeqViennaCL(Vec);
31 PETSC_INTERN PetscErrorCode VecReplaceArray_SeqViennaCL(Vec, const PetscScalar *);
32 PETSC_INTERN PetscErrorCode VecDot_SeqViennaCL(Vec, Vec, PetscScalar *);
33 PETSC_INTERN PetscErrorCode VecTDot_SeqViennaCL(Vec, Vec, PetscScalar *);
34 PETSC_INTERN PetscErrorCode VecScale_SeqViennaCL(Vec, PetscScalar);
35 PETSC_INTERN PetscErrorCode VecCopy_SeqViennaCL(Vec, Vec);
36 PETSC_INTERN PetscErrorCode VecSwap_SeqViennaCL(Vec, Vec);
37 PETSC_INTERN PetscErrorCode VecAXPY_SeqViennaCL(Vec, PetscScalar, Vec);
38 PETSC_INTERN PetscErrorCode VecAXPBY_SeqViennaCL(Vec, PetscScalar, PetscScalar, Vec);
39 PETSC_INTERN PetscErrorCode VecDuplicate_SeqViennaCL(Vec, Vec *);
40 PETSC_INTERN PetscErrorCode VecNorm_SeqViennaCL(Vec, NormType, PetscReal *);
41 PETSC_INTERN PetscErrorCode VecViennaCLCopyToGPU(Vec);
42 PETSC_INTERN PetscErrorCode VecViennaCLAllocateCheck(Vec);
43 PETSC_EXTERN PetscErrorCode VecViennaCLAllocateCheckHost(Vec);
44 PETSC_EXTERN PetscErrorCode VecCreate_SeqViennaCL(Vec);
45 PETSC_INTERN PetscErrorCode VecCreate_SeqViennaCL_Private(Vec, const ViennaCLVector *);
46 PETSC_INTERN PetscErrorCode VecDestroy_SeqViennaCL(Vec);
47 PETSC_INTERN PetscErrorCode VecAYPX_SeqViennaCL(Vec, PetscScalar, Vec);
48 PETSC_INTERN PetscErrorCode VecSetRandom_SeqViennaCL(Vec, PetscRandom);
49 PETSC_INTERN PetscErrorCode VecGetArrayWrite_SeqViennaCL(Vec, PetscScalar **);
50 PETSC_INTERN PetscErrorCode VecGetArray_SeqViennaCL(Vec, PetscScalar **);
51 PETSC_INTERN PetscErrorCode VecRestoreArray_SeqViennaCL(Vec, PetscScalar **);
52 
53 PETSC_INTERN PetscErrorCode VecCreate_MPIViennaCL_Private(Vec, PetscBool, PetscInt, const ViennaCLVector *);
54 
55 PETSC_INTERN PetscErrorCode VecViennaCLCopyToGPU_Public(Vec);
56 PETSC_INTERN PetscErrorCode VecViennaCLAllocateCheck_Public(Vec);
57 
58 struct Vec_ViennaCL {
59   viennacl::vector<PetscScalar> *GPUarray;           // this always holds the GPU data
60   viennacl::vector<PetscScalar> *GPUarray_allocated; // if the array was allocated by PETSc this is its pointer
61 };
62