@@ -169,7 +169,12 @@ atlas::linalg::SparseMatrixView<Value,Index> make_host_view_updated(const atlas:
169169
170170template <typename Value>
171171void 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
196201template <typename Value>
197202void 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&
255264template <typename Value>
256265void 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
269283template <typename Value>
270284void 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
284303template <typename Value>
285304void 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>
306329void 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