Skip to content

Commit 85a0c72

Browse files
authored
Use ‘const’ in Neighbor Table Value Types (#1796)
Additionally fixes missing `host_view` etc. in const data stores. Gives speedups when combined with #1795.
1 parent 12ca60f commit 85a0c72

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

include/gridtools/storage/data_store.hpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -173,38 +173,52 @@ namespace gridtools {
173173
auto const_host_view() const { return const_target_view(); }
174174
};
175175

176-
template <class Traits, class T, class Info, class Kind, bool IsHostRefrenceable>
177-
class data_store<Traits, T const, Info, Kind, true, IsHostRefrenceable>
178-
: public base<Traits, T const, Info, Kind> {
179-
180-
template <class>
181-
struct is_host_refrenceable : std::bool_constant<IsHostRefrenceable> {};
182-
183-
template <class Initializer, std::enable_if_t<!is_host_refrenceable<Initializer>::value, int> = 0>
184-
void init(Initializer const &initializer) {
185-
auto host_ptr = std::make_unique<T[]>(this->info().length());
186-
initializer(host_ptr.get(), typename data_store::layout_t(), this->info());
187-
traits::update_target<Traits>(this->raw_target_ptr(), host_ptr.get(), this->info().length());
188-
}
176+
template <class Traits, class T, class Info, class Kind>
177+
class data_store<Traits, T const, Info, Kind, true, false> : public base<Traits, T const, Info, Kind> {
178+
std::unique_ptr<T[]> m_host_ptr;
189179

190-
template <class Initializer, std::enable_if_t<is_host_refrenceable<Initializer>::value, int> = 0>
191-
void init(Initializer const &initializer) {
192-
initializer(this->raw_target_ptr(), typename data_store::layout_t(), this->info());
180+
public:
181+
template <class Halos>
182+
data_store(std::string, Info, Halos const &, uninitialized const &) = delete;
183+
184+
template <class Initializer, class Halos>
185+
data_store(std::string name, Info info, Halos const &halos, Initializer const &initializer)
186+
: data_store::base(std::move(name), std::move(info), halos),
187+
m_host_ptr(std::make_unique<T[]>(this->info().length())) {
188+
initializer(m_host_ptr.get(), typename data_store::layout_t(), this->info());
189+
traits::update_target<Traits>(this->raw_target_ptr(), m_host_ptr.get(), this->info().length());
193190
}
194191

192+
T const *get_target_ptr() const { return this->raw_target_ptr(); }
193+
T const *get_const_target_ptr() const { return this->raw_target_ptr(); }
194+
auto target_view() const { return traits::make_target_view<Traits>(get_target_ptr(), this->info()); }
195+
auto const_target_view() const { return target_view(); }
196+
197+
T const *get_host_ptr() const { return m_host_ptr.get(); }
198+
T const *get_const_host_ptr() const { return get_host_ptr(); }
199+
auto host_view() const { return make_host_view(get_host_ptr(), this->info()); }
200+
auto const_host_view() const { return host_view(); }
201+
};
202+
203+
template <class Traits, class T, class Info, class Kind>
204+
class data_store<Traits, T const, Info, Kind, true, true> : public base<Traits, T const, Info, Kind> {
195205
public:
196206
template <class Halos>
197207
data_store(std::string, Info, Halos const &, uninitialized const &) = delete;
198208

199209
template <class Initializer, class Halos>
200210
data_store(std::string name, Info info, Halos const &halos, Initializer const &initializer)
201211
: base<Traits, T const, Info, Kind>(std::move(name), std::move(info), halos) {
202-
init(initializer);
212+
initializer(this->raw_target_ptr(), typename data_store::layout_t(), this->info());
203213
}
204214
T const *get_target_ptr() const { return this->raw_target_ptr(); }
215+
T const *get_const_target_ptr() const { return get_target_ptr(); }
205216
auto target_view() const { return traits::make_target_view<Traits>(get_target_ptr(), this->info()); }
206-
auto get_const_target_ptr() const { return get_target_ptr(); }
207217
auto const_target_view() const { return target_view(); }
218+
T const *get_host_ptr() { return get_target_ptr(); }
219+
T const *get_const_host_ptr() { return get_target_ptr(); }
220+
auto host_view() const { return target_view(); }
221+
auto const_host_view() const { return target_view(); }
208222
};
209223

210224
template <class>

tests/include/fn_mesh.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ namespace gridtools {
120120
}
121121

122122
auto v2e_table() const {
123-
return storage::builder<StorageTraits>.dimensions(nvertices(), max_v2e_neighbors_t()).template type<int>().initializer(v2e_initializer()).unknown_id().build();
123+
return storage::builder<StorageTraits>.dimensions(nvertices(), max_v2e_neighbors_t()).template type<int const>().initializer(v2e_initializer()).unknown_id().build();
124124
}
125125

126126
auto e2v_table() const {
127-
return storage::builder<StorageTraits>.dimensions(nedges(), max_e2v_neighbors_t()).template type<int>().initializer(e2v_initializer()).unknown_id().build();
127+
return storage::builder<StorageTraits>.dimensions(nedges(), max_e2v_neighbors_t()).template type<int const>().initializer(e2v_initializer()).unknown_id().build();
128128
}
129129
};
130130

0 commit comments

Comments
 (0)