Actual source code: cuspvecimpl.h
petsc-3.4.2 2013-07-02
4: #include <petsccusp.h>
5: #include <petsc-private/vecimpl.h>
7: #include <algorithm>
8: #include <vector>
9: #include <string>
11: #include <cublas.h>
12: #include <cusp/blas.h>
13: #include <thrust/host_vector.h>
14: #include <thrust/device_vector.h>
15: #include <thrust/iterator/constant_iterator.h>
16: #include <thrust/transform.h>
17: #include <thrust/iterator/permutation_iterator.h>
19: #define CUSPARRAY cusp::array1d<PetscScalar,cusp::device_memory>
20: #define CUSPARRAYCPU cusp::array1d<PetscScalar,cusp::host_memory>
21: #define CUSPINTARRAYGPU cusp::array1d<PetscInt,cusp::device_memory>
22: #define CUSPINTARRAYCPU cusp::array1d<PetscInt,cusp::host_memory>
24: PETSC_INTERN PetscErrorCode VecDotNorm2_SeqCUSP(Vec,Vec,PetscScalar*, PetscScalar*);
25: PETSC_INTERN PetscErrorCode VecPointwiseDivide_SeqCUSP(Vec,Vec,Vec);
26: PETSC_INTERN PetscErrorCode VecWAXPY_SeqCUSP(Vec,PetscScalar,Vec,Vec);
27: PETSC_INTERN PetscErrorCode VecMDot_SeqCUSP(Vec,PetscInt,const Vec[],PetscScalar*);
28: PETSC_INTERN PetscErrorCode VecSet_SeqCUSP(Vec,PetscScalar);
29: PETSC_INTERN PetscErrorCode VecMAXPY_SeqCUSP(Vec,PetscInt,const PetscScalar*,Vec*);
30: PETSC_INTERN PetscErrorCode VecAXPBYPCZ_SeqCUSP(Vec,PetscScalar,PetscScalar,PetscScalar,Vec,Vec);
31: PETSC_INTERN PetscErrorCode VecPointwiseMult_SeqCUSP(Vec,Vec,Vec);
32: PETSC_INTERN PetscErrorCode VecPlaceArray_SeqCUSP(Vec,const PetscScalar*);
33: PETSC_INTERN PetscErrorCode VecResetArray_SeqCUSP(Vec);
34: PETSC_INTERN PetscErrorCode VecReplaceArray_SeqCUSP(Vec,const PetscScalar*);
35: PETSC_INTERN PetscErrorCode VecDot_SeqCUSP(Vec,Vec,PetscScalar*);
36: PETSC_INTERN PetscErrorCode VecTDot_SeqCUSP(Vec,Vec,PetscScalar*);
37: PETSC_INTERN PetscErrorCode VecScale_SeqCUSP(Vec,PetscScalar);
38: PETSC_INTERN PetscErrorCode VecCopy_SeqCUSP(Vec,Vec);
39: PETSC_INTERN PetscErrorCode VecSwap_SeqCUSP(Vec,Vec);
40: PETSC_INTERN PetscErrorCode VecAXPY_SeqCUSP(Vec,PetscScalar,Vec);
41: PETSC_INTERN PetscErrorCode VecAXPBY_SeqCUSP(Vec,PetscScalar,PetscScalar,Vec);
42: PETSC_INTERN PetscErrorCode VecDuplicate_SeqCUSP(Vec,Vec*);
43: PETSC_INTERN PetscErrorCode VecNorm_SeqCUSP(Vec,NormType,PetscReal*);
44: PETSC_INTERN PetscErrorCode VecCUSPCopyToGPU(Vec);
45: PETSC_INTERN PetscErrorCode VecCUSPAllocateCheck(Vec);
46: PETSC_INTERN PetscErrorCode VecCUSPAllocateCheckHost(Vec);
47: PETSC_EXTERN PetscErrorCode VecCreate_SeqCUSP(Vec);
48: PETSC_INTERN PetscErrorCode VecView_Seq(Vec,PetscViewer);
49: PETSC_INTERN PetscErrorCode VecDestroy_SeqCUSP(Vec);
50: PETSC_INTERN PetscErrorCode VecAYPX_SeqCUSP(Vec,PetscScalar,Vec);
51: PETSC_INTERN PetscErrorCode VecSetRandom_SeqCUSP(Vec,PetscRandom);
53: PETSC_INTERN PetscErrorCode VecCUSPCopyToGPU_Public(Vec);
54: PETSC_INTERN PetscErrorCode VecCUSPAllocateCheck_Public(Vec);
56: #if defined(PETSC_HAVE_TXPETSCGPU)
57: #include "tx_vector_interface.h"
58: #endif
60: struct _p_PetscCUSPIndices {
61: #if defined(PETSC_HAVE_TXPETSCGPU)
62: GPU_Indices<PetscInt, PetscScalar> * sendIndices;
63: GPU_Indices<PetscInt, PetscScalar> * recvIndices;
64: #else
65: CUSPINTARRAYCPU sendIndicesCPU;
66: CUSPINTARRAYGPU sendIndicesGPU;
68: CUSPINTARRAYCPU recvIndicesCPU;
69: CUSPINTARRAYGPU recvIndicesGPU;
70: #endif
71: };
73: #if defined(PETSC_HAVE_TXPETSCGPU)
74: PETSC_INTERN PetscErrorCode VecCUSPCopySomeToContiguousBufferGPU(Vec, PetscCUSPIndices);
75: PETSC_INTERN PetscErrorCode VecCUSPCopySomeFromContiguousBufferGPU(Vec, PetscCUSPIndices);
76: #endif
78: #define CHKERRCUSP(err) if (((int)err) != (int)CUBLAS_STATUS_SUCCESS) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUSP error %d",err)
80: #define VecCUSPCastToRawPtr(x) thrust::raw_pointer_cast(&(x)[0])
82: #define WaitForGPU() PetscCUSPSynchronize ? cudaThreadSynchronize() : 0
84: struct Vec_CUSP {
85: CUSPARRAY *GPUarray; /* this always holds the GPU data */
86: #if defined(PETSC_HAVE_TXPETSCGPU)
87: GPU_Vector<PetscInt, PetscScalar> * GPUvector; /* this always holds the GPU data */
88: #endif
89: };
91: #endif