Skip to content

Commit 4c2f7dc

Browse files
committed
Fail when requested backend doesn't support the requested operation. Simplify halo exchange to be done on the memory space of the backend.
1 parent 2306aef commit 4c2f7dc

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

src/atlas/interpolation/method/Method.cc

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,12 @@ atlas::linalg::SparseMatrixView<Value,Index> make_host_view_updated(const atlas:
169169

170170
template <typename Value>
171171
void Method::interpolate_field_rank1(const Field& src, Field& tgt, const Matrix& W) const {
172-
auto backend = std::is_same<Value, float>::value ? sparse::backend::openmp() : sparse::Backend{linalg_backend_};
172+
auto backend = sparse::Backend{linalg_backend_};
173+
174+
if (backend.type() == "hicsparse" && !std::is_same<eckit::linalg::Scalar, Value>::value) {
175+
ATLAS_NOTIMPLEMENTED; // hicsparse does not support mixed double-float
176+
}
177+
173178
const auto on_device = executesOnDevice(backend);
174179

175180
auto src_v = on_device ? make_device_view_updated<Value, 1>(src) : make_host_view_updated<Value, 1>(src);
@@ -195,8 +200,12 @@ void Method::interpolate_field_rank1(const Field& src, Field& tgt, const Matrix&
195200

196201
template <typename Value>
197202
void Method::interpolate_field_rank2(const Field& src, Field& tgt, const Matrix& W) const {
198-
auto backend = std::is_same<Value, float>::value ? sparse::backend::openmp() : sparse::Backend{linalg_backend_};
203+
auto backend = sparse::Backend{linalg_backend_};
199204

205+
if (backend.type() == "hicsparse" && !std::is_same<eckit::linalg::Scalar, Value>::value) {
206+
ATLAS_NOTIMPLEMENTED; // hicsparse does not support mixed double-float
207+
}
208+
200209
// Switch to OpenMP as eckit_linalg does not support this layout
201210
if (backend.type() == "eckit_linalg") {
202211
backend = sparse::backend::openmp();
@@ -255,6 +264,11 @@ void Method::interpolate_field_rank2(const Field& src, Field& tgt, const Matrix&
255264
template <typename Value>
256265
void Method::interpolate_field_rank3(const Field& src, Field& tgt, const Matrix& W) const {
257266
sparse::Backend backend{linalg_backend_};
267+
268+
if (backend.type() == "hicsparse") {
269+
ATLAS_NOTIMPLEMENTED; // hicsparse does not support rank-3 fields
270+
}
271+
258272
auto W_v = make_host_view<eckit::linalg::Scalar, eckit::linalg::Index>(W);
259273
auto src_v = make_host_view_updated<Value, 3>(src);
260274
auto tgt_v = make_host_view_updated<Value, 3>(tgt);
@@ -268,7 +282,12 @@ void Method::interpolate_field_rank3(const Field& src, Field& tgt, const Matrix&
268282

269283
template <typename Value>
270284
void Method::adjoint_interpolate_field_rank1(Field& src, const Field& tgt, const Matrix& W) const {
271-
auto backend = std::is_same<Value, float>::value ? sparse::backend::openmp() : sparse::Backend{linalg_backend_};
285+
auto backend = sparse::Backend{linalg_backend_};
286+
287+
if (backend.type() == "hicsparse" && !std::is_same<eckit::linalg::Scalar, Value>::value) {
288+
ATLAS_NOTIMPLEMENTED; // hicsparse does not support mixed double-float
289+
}
290+
272291
const auto on_device = executesOnDevice(backend);
273292

274293
auto src_v = on_device ? make_device_view_updated<Value, 1>(src) : make_host_view_updated<Value, 1>(src);
@@ -283,8 +302,12 @@ void Method::adjoint_interpolate_field_rank1(Field& src, const Field& tgt, const
283302

284303
template <typename Value>
285304
void Method::adjoint_interpolate_field_rank2(Field& src, const Field& tgt, const Matrix& W) const {
286-
auto backend = std::is_same<Value, float>::value ? sparse::backend::openmp() : sparse::Backend{linalg_backend_};
305+
auto backend = sparse::Backend{linalg_backend_};
287306

307+
if (backend.type() == "hicsparse" && !std::is_same<eckit::linalg::Scalar, Value>::value) {
308+
ATLAS_NOTIMPLEMENTED; // hicsparse does not support mixed double-float
309+
}
310+
288311
// Switch to OpenMP as eckit_linalg does not support this layout
289312
if (backend.type() == "eckit_linalg") {
290313
backend = sparse::backend::openmp();
@@ -306,6 +329,10 @@ template <typename Value>
306329
void Method::adjoint_interpolate_field_rank3(Field& src, const Field& tgt, const Matrix& W) const {
307330
sparse::Backend backend{linalg_backend_};
308331

332+
if (backend.type() == "hicsparse") {
333+
ATLAS_NOTIMPLEMENTED; // hicsparse backend does not support rank-3 fields
334+
}
335+
309336
auto src_v = make_host_view_updated<Value, 3>(src);
310337
auto tgt_v = make_host_view_updated<Value, 3>(tgt);
311338
auto W_v = make_host_view<eckit::linalg::Scalar,eckit::linalg::Index>(W);
@@ -479,12 +506,9 @@ void Method::do_execute(const Field& src, Field& tgt, Metadata&) const {
479506

480507
sparse::Backend backend{linalg_backend_};
481508

482-
const bool on_device = [&]() {
483-
const bool memory_is_synced = !src.hostNeedsUpdate() && !src.deviceNeedsUpdate();
484-
// if both memory spaces are up to date, pick the one associated with the backend
485-
// otherwise, pick the one that doesn't need updating.
486-
return memory_is_synced ? executesOnDevice(backend) : src.hostNeedsUpdate();
487-
}();
509+
const bool on_device = executesOnDevice(backend);
510+
511+
on_device ? src.updateDevice() : src.updateHost();
488512

489513
haloExchange(src, on_device);
490514

@@ -574,13 +598,7 @@ void Method::do_execute_adjoint(Field& src, const Field& tgt, Metadata&) const {
574598
}
575599

576600
src.set_dirty();
577-
578-
const bool on_device = [&]() {
579-
const bool memory_is_synced = !src.hostNeedsUpdate() && !src.deviceNeedsUpdate();
580-
// if both memory spaces are up to date, pick the one associated with the backend
581-
// otherwise, pick the one that doesn't need updating.
582-
return memory_is_synced ? executesOnDevice(backend) : src.hostNeedsUpdate();
583-
}();
601+
const bool on_device = executesOnDevice(backend);
584602

585603
adjointHaloExchange(src, on_device);
586604

0 commit comments

Comments
 (0)