Actual source code: ex18cu.cu

      1: #include <petscdevice_cuda.h>
      2: #include "ex18.h"

      4: __global__ void FillValues(PetscInt n, PetscScalar *v)
      5: {
      6:   PetscInt     i = blockIdx.x * blockDim.x + threadIdx.x;
      7:   PetscScalar *s;
      8:   if (i < n) {
      9:     s = &v[3 * 3 * i];
     10:     for (PetscInt vi = 0; vi < 3; vi++) {
     11:       for (PetscInt vj = 0; vj < 3; vj++) s[vi * 3 + vj] = vi + 2 * vj;
     12:     }
     13:   }
     14: }

     16: PetscErrorCode FillMatrixCUDACOO(FEStruct *fe, Mat A)
     17: {
     18:   PetscScalar *v;

     20:   PetscFunctionBeginUser;
     21:   PetscCallCUDA(cudaMalloc((void **)&v, 3 * 3 * fe->Ne * sizeof(PetscScalar)));
     22:   FillValues<<<(fe->Ne + 255) / 256, 256>>>(fe->Ne, v);
     23:   PetscCall(MatSetValuesCOO(A, v, INSERT_VALUES));
     24:   PetscCallCUDA(cudaFree(v));
     25:   PetscFunctionReturn(PETSC_SUCCESS);
     26: }