Lines Matching refs:aijkok
29 #include <../src/mat/impls/aij/seq/kokkos/aijkok.hpp>
66 Mat_SeqAIJKokkos *aijkok;
73 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
75 /* If aijkok does not exist, we just copy i, j to device.
76 If aijkok already exists, but the device's nonzero pattern does not match with the host's, we assume the latest data is on host.
77 In both cases, we build a new aijkok structure.
79 if (!aijkok || aijkok->nonzerostate != A->nonzerostate) { /* aijkok might not exist yet or nonzero pattern has changed */
80 if (aijkok && aijkok->host_aij_allocated_by_kokkos) { /* Avoid accidentally freeing much needed a,i,j on host when deleting aijkok */
81 PetscCall(PetscShmgetAllocateArray(aijkok->nrows() + 1, sizeof(PetscInt), (void **)&aijseq->i));
82 PetscCall(PetscShmgetAllocateArray(aijkok->nnz(), sizeof(PetscInt), (void **)&aijseq->j));
83 PetscCall(PetscShmgetAllocateArray(aijkok->nnz(), sizeof(PetscInt), (void **)&aijseq->a));
84 PetscCall(PetscArraycpy(aijseq->i, aijkok->i_host_data(), aijkok->nrows() + 1));
85 PetscCall(PetscArraycpy(aijseq->j, aijkok->j_host_data(), aijkok->nnz()));
86 PetscCall(PetscArraycpy(aijseq->a, aijkok->a_host_data(), aijkok->nnz()));
95 delete aijkok;
96 aijkok = new Mat_SeqAIJKokkos(A, A->rmap->n, A->cmap->n, aijseq, A->nonzerostate, PETSC_FALSE /* don't copy mat values to device */);
97 A->spptr = aijkok;
98 } else if (A->rmap->n && aijkok->diag_dual.extent(0) == 0) { // MatProduct might directly produce AIJ on device, but not the diag.
104 aijkok->diag_dual = MatRowMapKokkosDualView(diag_d, diag_h);
112 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
116 PetscCheck(aijkok, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Unexpected NULL (Mat_SeqAIJKokkos*)A->spptr");
117 if (aijkok->a_dual.need_sync_device()) {
118 PetscCall(KokkosDualViewSyncDevice(aijkok->a_dual, PetscGetKokkosExecutionSpace()));
119 aijkok->transpose_updated = PETSC_FALSE; /* values of the transpose is out-of-date */
120 aijkok->hermitian_updated = PETSC_FALSE;
128 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
132 aijkok->a_dual.clear_sync_state();
133 aijkok->a_dual.modify_device();
134 aijkok->transpose_updated = PETSC_FALSE;
135 aijkok->hermitian_updated = PETSC_FALSE;
142 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
149 PetscCheck(aijkok, PetscObjectComm((PetscObject)A), PETSC_ERR_PLIB, "Missing AIJKOK");
150 PetscCall(KokkosDualViewSyncHost(aijkok->a_dual, exec));
156 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
159 /* aijkok contains valid pointers only if the host's nonzerostate matches with the device's.
161 reallocated, will lead to stale {i,j,a}_dual in aijkok. In both operations, the hosts's nonzerostate
162 must have been updated. The stale aijkok will be rebuilt during MatAssemblyEnd.
164 if (aijkok && A->nonzerostate == aijkok->nonzerostate) {
165 PetscCall(KokkosDualViewSyncHost(aijkok->a_dual, PetscGetKokkosExecutionSpace()));
166 *array = aijkok->a_dual.view_host().data();
175 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
178 if (aijkok && A->nonzerostate == aijkok->nonzerostate) aijkok->a_dual.modify_host();
184 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
187 if (aijkok && A->nonzerostate == aijkok->nonzerostate) {
188 PetscCall(KokkosDualViewSyncHost(aijkok->a_dual, PetscGetKokkosExecutionSpace()));
189 *array = aijkok->a_dual.view_host().data();
205 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
208 if (aijkok && A->nonzerostate == aijkok->nonzerostate) {
209 *array = aijkok->a_dual.view_host().data();
218 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
221 if (aijkok && A->nonzerostate == aijkok->nonzerostate) {
222 aijkok->a_dual.clear_sync_state();
223 aijkok->a_dual.modify_host();
230 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
233 PetscCheck(aijkok != NULL, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "aijkok is NULL");
235 if (i) *i = aijkok->i_device_data();
236 if (j) *j = aijkok->j_device_data();
238 PetscCall(KokkosDualViewSyncDevice(aijkok->a_dual, PetscGetKokkosExecutionSpace()));
239 *a = aijkok->a_device_data();
388 Mat_SeqAIJKokkos *aijkok;
397 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
398 PetscCallCXX(KokkosSparse::spmv(PetscGetKokkosExecutionSpace(), "N", 1.0 /*alpha*/, aijkok->csrmat, xv, 0.0 /*beta*/, yv)); /* y = alpha A x + beta y */
402 PetscCall(PetscLogGpuFlops(2.0 * aijkok->csrmat.nnz()));
410 Mat_SeqAIJKokkos *aijkok;
425 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
426 csrmat = aijkok->csrmat;
440 Mat_SeqAIJKokkos *aijkok;
455 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
456 csrmat = aijkok->csrmat;
470 Mat_SeqAIJKokkos *aijkok;
480 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
481 PetscCallCXX(KokkosSparse::spmv(PetscGetKokkosExecutionSpace(), "N", 1.0 /*alpha*/, aijkok->csrmat, xv, 1.0 /*beta*/, zv)); /* z = alpha A x + beta z */
484 PetscCall(PetscLogGpuFlops(2.0 * aijkok->csrmat.nnz()));
492 Mat_SeqAIJKokkos *aijkok;
508 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
509 csrmat = aijkok->csrmat;
523 Mat_SeqAIJKokkos *aijkok;
539 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
540 csrmat = aijkok->csrmat;
553 Mat_SeqAIJKokkos *aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
559 if (A->form_explicit_transpose && !flg && aijkok) PetscCall(aijkok->DestroyMatTranspose());
669 Mat_SeqAIJKokkos *aijkok;
673 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
674 delete aijkok;
1021 Mat_SeqAIJKokkos *aijkok;
1026 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1027 KokkosBlas::scal(PetscGetKokkosExecutionSpace(), aijkok->a_dual.view_device(), a, aijkok->a_dual.view_device());
1029 PetscCall(PetscLogGpuFlops(aijkok->a_dual.extent(0)));
1045 const auto aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1046 const auto &Aa = aijkok->a_dual.view_device();
1047 const auto &Adiag = aijkok->diag_dual.view_device();
1074 const auto aijkok = static_cast<Mat_SeqAIJKokkos *>(Y->spptr);
1075 const auto &Aa = aijkok->a_dual.view_device();
1076 const auto &Adiag = aijkok->diag_dual.view_device();
1101 const auto aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1102 const auto &Aa = aijkok->a_dual.view_device();
1103 const auto &Ai = aijkok->i_dual.view_device();
1104 const auto &Aj = aijkok->j_dual.view_device();
1135 Mat_SeqAIJKokkos *aijkok;
1138 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1139 if (aijkok) { /* Only zero the device if data is already there */
1140 KokkosBlas::fill(PetscGetKokkosExecutionSpace(), aijkok->a_dual.view_device(), 0.0);
1150 Mat_SeqAIJKokkos *aijkok;
1160 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1162 const auto &Aa = aijkok->a_dual.view_device();
1163 const auto &Ai = aijkok->i_dual.view_device();
1164 const auto &Adiag = aijkok->diag_dual.view_device();
1179 Mat_SeqAIJKokkos *aijkok;
1186 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1187 *kv = aijkok->a_dual.view_device();
1202 Mat_SeqAIJKokkos *aijkok;
1209 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1210 *kv = aijkok->a_dual.view_device();
1226 Mat_SeqAIJKokkos *aijkok;
1232 aijkok = static_cast<Mat_SeqAIJKokkos *>(A->spptr);
1233 *kv = aijkok->a_dual.view_device();
2054 Mat_SeqAIJKokkos *aijkok = (Mat_SeqAIJKokkos *)A->spptr;
2063 auto a_d = aijkok->a_dual.view_device();
2064 auto i_d = aijkok->i_dual.view_device();
2065 auto j_d = aijkok->j_dual.view_device();
2087 Mat_SeqAIJKokkos *aijkok;
2109 aijkok = (Mat_SeqAIJKokkos *)A->spptr;
2110 auto i_d = aijkok->i_dual.view_device();
2111 auto j_d = aijkok->j_dual.view_device();