Skip to content

Commit

Permalink
vec/qf - initial valid/borrowed/owned split for data (#853)
Browse files Browse the repository at this point in the history
* vec/qf - initial valid/borrowed/owned split for data

* vec/qf - tidy logic for checking active/stale data

* minor - add missing NULL

* doc - explain VectorTakeArray update

* minor - update error messages

* test - update error message in junit/tap

* gpu - fix stray CeedScalar vs void for QFunctionContext

* vec/qf - clarify/simplify access logic

* vec - calloc host arrays when no value set to make empty

* style - minor

* style - minor

* minor - fix error messages

* vec/qf - move data validity checking to backend interface

* gpu - add missing sync error checking for qfcontext

* gpu - homogonize use of impl for backend data to reduce confusion

* vec - clarify access conditions

* python - update test for stricter vector access

* vec - minor fixes

* minor - fix ipython change

* vec - add missing declarations in ceed/backend.h

* ctx - mirror vector borrowed data check in ctx interface

* vec - add CeedVectorGetArrayWrite

* vec - consistent use of CeedVectorGetArray vs CeedVectorGetArrayWrite

* python - small vec fixes

* doc - describe vector data semantics

* magma - update restriction

* gpu - fix restr bug I added, need to sum into target

* magma - fix restriction bug

* cpu - fix restriction bug here too

* op - fix evec allocations

* julia - fix ElemRestriction for new vector access rules

* op - double check GetArray vs Read vs Write usage

* doc - small fix

* restr - clean up read/write logic for restr

* python - add vec.array_write

* magma - typo fix
  • Loading branch information
jeremylt committed Dec 17, 2021
1 parent 4a63c7d commit 9c774ed
Show file tree
Hide file tree
Showing 73 changed files with 2,034 additions and 877 deletions.
10 changes: 6 additions & 4 deletions backends/blocked/ceed-blocked-operator.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,8 +483,9 @@ static int CeedOperatorApplyAdd_Blocked(CeedOperator op, CeedVector in_vec,

// Output Evecs
for (CeedInt i=0; i<num_output_fields; i++) {
ierr = CeedVectorGetArray(impl->e_vecs_full[i+impl->num_inputs], CEED_MEM_HOST,
&e_data_full[i + num_input_fields]); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(impl->e_vecs_full[i+impl->num_inputs],
CEED_MEM_HOST, &e_data_full[i + num_input_fields]);
CeedChkBackend(ierr);
}

// Loop through elements
Expand Down Expand Up @@ -524,7 +525,8 @@ static int CeedOperatorApplyAdd_Blocked(CeedOperator op, CeedVector in_vec,
for (CeedInt i=0; i<num_output_fields; i++) {
// Restore evec
ierr = CeedVectorRestoreArray(impl->e_vecs_full[i+impl->num_inputs],
&e_data_full[i + num_input_fields]); CeedChkBackend(ierr);
&e_data_full[i + num_input_fields]);
CeedChkBackend(ierr);
// Get output vector
ierr = CeedOperatorFieldGetVector(op_output_fields[i], &vec);
CeedChkBackend(ierr);
Expand Down Expand Up @@ -652,7 +654,7 @@ static inline int CeedOperatorLinearAssembleQFunctionCore_Blocked(
&l_vec); CeedChkBackend(ierr);
impl->qf_l_vec = l_vec;
}
ierr = CeedVectorGetArray(l_vec, CEED_MEM_HOST, &a); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(l_vec, CEED_MEM_HOST, &a); CeedChkBackend(ierr);

// Build objects if needed
CeedInt strides[3] = {1, Q, num_active_in *num_active_out*Q};
Expand Down
2 changes: 1 addition & 1 deletion backends/cuda-shared/ceed-cuda-shared-basis.c
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,7 @@ int CeedBasisApplyTensor_Cuda_shared(CeedBasis basis, const CeedInt nelem,
if (emode != CEED_EVAL_WEIGHT) {
ierr = CeedVectorGetArrayRead(u, CEED_MEM_DEVICE, &d_u); CeedChkBackend(ierr);
}
ierr = CeedVectorGetArray(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);

// Clear v for transpose mode
if (tmode == CEED_TRANSPOSE) {
Expand Down
4 changes: 2 additions & 2 deletions backends/cuda/ceed-cuda-basis.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ int CeedBasisApply_Cuda(CeedBasis basis, const CeedInt nelem,
if (emode != CEED_EVAL_WEIGHT) {
ierr = CeedVectorGetArrayRead(u, CEED_MEM_DEVICE, &d_u); CeedChkBackend(ierr);
}
ierr = CeedVectorGetArray(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);

// Clear v for transpose operation
if (tmode == CEED_TRANSPOSE) {
Expand Down Expand Up @@ -438,7 +438,7 @@ int CeedBasisApplyNonTensor_Cuda(CeedBasis basis, const CeedInt nelem,
if (emode != CEED_EVAL_WEIGHT) {
ierr = CeedVectorGetArrayRead(u, CEED_MEM_DEVICE, &d_u); CeedChkBackend(ierr);
}
ierr = CeedVectorGetArray(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(v, CEED_MEM_DEVICE, &d_v); CeedChkBackend(ierr);

// Clear v for transpose operation
if (tmode == CEED_TRANSPOSE) {
Expand Down
29 changes: 15 additions & 14 deletions backends/cuda/ceed-cuda-operator.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static int CeedOperatorDestroy_Cuda(CeedOperator op) {
// Setup infields or outfields
//------------------------------------------------------------------------------
static int CeedOperatorSetupFields_Cuda(CeedQFunction qf, CeedOperator op,
bool inOrOut, CeedVector *evecs,
bool isinput, CeedVector *evecs,
CeedVector *qvecs, CeedInt starte,
CeedInt numfields, CeedInt Q,
CeedInt numelements) {
Expand All @@ -97,15 +97,15 @@ static int CeedOperatorSetupFields_Cuda(CeedQFunction qf, CeedOperator op,
bool strided;
bool skiprestrict;

if (inOrOut) {
ierr = CeedOperatorGetFields(op, NULL, NULL, NULL, &opfields);
if (isinput) {
ierr = CeedOperatorGetFields(op, NULL, &opfields, NULL, NULL);
CeedChkBackend(ierr);
ierr = CeedQFunctionGetFields(qf, NULL, NULL, NULL, &qffields);
ierr = CeedQFunctionGetFields(qf, NULL, &qffields, NULL, NULL);
CeedChkBackend(ierr);
} else {
ierr = CeedOperatorGetFields(op, NULL, &opfields, NULL, NULL);
ierr = CeedOperatorGetFields(op, NULL, NULL, NULL, &opfields);
CeedChkBackend(ierr);
ierr = CeedQFunctionGetFields(qf, NULL, &qffields, NULL, NULL);
ierr = CeedQFunctionGetFields(qf, NULL, NULL, NULL, &qffields);
CeedChkBackend(ierr);
}

Expand All @@ -125,7 +125,7 @@ static int CeedOperatorSetupFields_Cuda(CeedQFunction qf, CeedOperator op,
// CEED_STRIDES_BACKEND.

// First, check whether the field is input or output:
if (!inOrOut) {
if (isinput) {
// Check for passive input:
ierr = CeedOperatorFieldGetVector(opfields[i], &fieldvec); CeedChkBackend(ierr);
if (fieldvec != CEED_VECTOR_ACTIVE) {
Expand Down Expand Up @@ -225,13 +225,13 @@ static int CeedOperatorSetup_Cuda(CeedOperator op) {

// Set up infield and outfield evecs and qvecs
// Infields
ierr = CeedOperatorSetupFields_Cuda(qf, op, 0,
ierr = CeedOperatorSetupFields_Cuda(qf, op, true,
impl->evecs, impl->qvecsin, 0,
numinputfields, Q, numelements);
CeedChkBackend(ierr);

// Outfields
ierr = CeedOperatorSetupFields_Cuda(qf, op, 1,
ierr = CeedOperatorSetupFields_Cuda(qf, op, false,
impl->evecs, impl->qvecsout,
numinputfields, numoutputfields, Q,
numelements); CeedChkBackend(ierr);
Expand Down Expand Up @@ -435,8 +435,8 @@ static int CeedOperatorApplyAdd_Cuda(CeedOperator op, CeedVector invec,
CeedChkBackend(ierr);
if (emode == CEED_EVAL_NONE) {
// Set the output Q-Vector to use the E-Vector data directly.
ierr = CeedVectorGetArray(impl->evecs[i + impl->numein], CEED_MEM_DEVICE,
&edata[i + numinputfields]); CeedChkBackend(ierr);
ierr = CeedVectorGetArrayWrite(impl->evecs[i + impl->numein], CEED_MEM_DEVICE,
&edata[i + numinputfields]); CeedChkBackend(ierr);
ierr = CeedVectorSetArray(impl->qvecsout[i], CEED_MEM_DEVICE,
CEED_USE_POINTER, edata[i + numinputfields]);
CeedChkBackend(ierr);
Expand Down Expand Up @@ -1148,10 +1148,11 @@ static inline int CeedOperatorAssembleDiagonalCore_Cuda(CeedOperator op,
ierr = CeedVectorSetValue(elemdiag, 0.0); CeedChkBackend(ierr);

// Assemble element operator diagonals
CeedScalar *elemdiagarray, *assembledqfarray;
CeedScalar *elemdiagarray;
const CeedScalar *assembledqfarray;
ierr = CeedVectorGetArray(elemdiag, CEED_MEM_DEVICE, &elemdiagarray);
CeedChkBackend(ierr);
ierr = CeedVectorGetArray(assembledqf, CEED_MEM_DEVICE, &assembledqfarray);
ierr = CeedVectorGetArrayRead(assembledqf, CEED_MEM_DEVICE, &assembledqfarray);
CeedChkBackend(ierr);
CeedInt nelem;
ierr = CeedElemRestrictionGetNumElements(diagrstr, &nelem);
Expand All @@ -1177,7 +1178,7 @@ static inline int CeedOperatorAssembleDiagonalCore_Cuda(CeedOperator op,

// Restore arrays
ierr = CeedVectorRestoreArray(elemdiag, &elemdiagarray); CeedChkBackend(ierr);
ierr = CeedVectorRestoreArray(assembledqf, &assembledqfarray);
ierr = CeedVectorRestoreArrayRead(assembledqf, &assembledqfarray);
CeedChkBackend(ierr);

// Assemble local operator diagonal
Expand Down
2 changes: 1 addition & 1 deletion backends/cuda/ceed-cuda-qfunction.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ static int CeedQFunctionApply_Cuda(CeedQFunction qf, CeedInt Q,
CeedChkBackend(ierr);
}
for (CeedInt i = 0; i < numoutputfields; i++) {
ierr = CeedVectorGetArray(V[i], CEED_MEM_DEVICE, &data->fields.outputs[i]);
ierr = CeedVectorGetArrayWrite(V[i], CEED_MEM_DEVICE, &data->fields.outputs[i]);
CeedChkBackend(ierr);
}

Expand Down
Loading

0 comments on commit 9c774ed

Please sign in to comment.