Avoid unnecessary deep_copy when only a single memory space
This commit is contained in:
@ -77,8 +77,6 @@ class AtomKokkos : public Atom {
|
|||||||
DAT::tdual_int_1d k_map_array;
|
DAT::tdual_int_1d k_map_array;
|
||||||
DAT::tdual_int_scalar k_error_flag;
|
DAT::tdual_int_scalar k_error_flag;
|
||||||
dual_hash_type k_map_hash;
|
dual_hash_type k_map_hash;
|
||||||
hash_type d_map_hash;
|
|
||||||
host_hash_type h_map_hash;
|
|
||||||
|
|
||||||
template<class DeviceType>
|
template<class DeviceType>
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
|||||||
@ -109,7 +109,10 @@ void AtomKokkos::map_init(int check)
|
|||||||
for (int i = 0; i < map_nhash; i++) map_hash[i].next = i + 1;
|
for (int i = 0; i < map_nhash; i++) map_hash[i].next = i + 1;
|
||||||
map_hash[map_nhash - 1].next = -1;
|
map_hash[map_nhash - 1].next = -1;
|
||||||
|
|
||||||
h_map_hash = host_hash_type(map_nhash);
|
// use "view" template method to avoid unnecessary deep_copy
|
||||||
|
|
||||||
|
auto h_map_hash = k_map_hash.view<LMPHostType>();
|
||||||
|
h_map_hash = decltype(h_map_hash)(map_nhash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,6 +210,9 @@ void AtomKokkos::map_set()
|
|||||||
|
|
||||||
// Copy to Kokkos hash
|
// Copy to Kokkos hash
|
||||||
|
|
||||||
|
// use "view" template method to avoid unnecessary deep_copy
|
||||||
|
|
||||||
|
auto h_map_hash = k_map_hash.view<LMPHostType>();
|
||||||
h_map_hash.clear();
|
h_map_hash.clear();
|
||||||
|
|
||||||
for (int i = nall - 1; i >= 0; i--) {
|
for (int i = nall - 1; i >= 0; i--) {
|
||||||
@ -237,6 +243,11 @@ void AtomKokkos::map_set()
|
|||||||
k_map_array.modify_host();
|
k_map_array.modify_host();
|
||||||
else if (map_style == Atom::MAP_HASH) {
|
else if (map_style == Atom::MAP_HASH) {
|
||||||
|
|
||||||
|
// use "view" template method to avoid unnecessary deep_copy
|
||||||
|
|
||||||
|
auto h_map_hash = k_map_hash.view<LMPHostType>();
|
||||||
|
auto d_map_hash = k_map_hash.view<LMPDeviceType>();
|
||||||
|
|
||||||
// check if fix shake or neigh bond needs a device hash
|
// check if fix shake or neigh bond needs a device hash
|
||||||
|
|
||||||
int device_hash_flag = 0;
|
int device_hash_flag = 0;
|
||||||
@ -248,10 +259,7 @@ void AtomKokkos::map_set()
|
|||||||
if (utils::strmatch(modify->fix[n]->style, "^shake"))
|
if (utils::strmatch(modify->fix[n]->style, "^shake"))
|
||||||
if (modify->fix[n]->execution_space == Device) device_hash_flag = 1;
|
if (modify->fix[n]->execution_space == Device) device_hash_flag = 1;
|
||||||
|
|
||||||
if (device_hash_flag) Kokkos::deep_copy(d_map_hash, h_map_hash);
|
if (device_hash_flag) Kokkos::deep_copy(d_map_hash,h_map_hash);
|
||||||
|
|
||||||
k_map_hash.h_view = h_map_hash;
|
|
||||||
k_map_hash.d_view = d_map_hash;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,8 +276,8 @@ void AtomKokkos::map_delete()
|
|||||||
memoryKK->destroy_kokkos(k_map_array, map_array);
|
memoryKK->destroy_kokkos(k_map_array, map_array);
|
||||||
map_array = nullptr;
|
map_array = nullptr;
|
||||||
} else {
|
} else {
|
||||||
h_map_hash = host_hash_type();
|
k_map_hash.h_view = host_hash_type();
|
||||||
d_map_hash = hash_type();
|
k_map_hash.d_view = hash_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
Atom::map_delete();
|
Atom::map_delete();
|
||||||
|
|||||||
@ -560,12 +560,10 @@ struct dual_hash_type {
|
|||||||
host_hash_type h_view;
|
host_hash_type h_view;
|
||||||
|
|
||||||
template<class DeviceType>
|
template<class DeviceType>
|
||||||
KOKKOS_INLINE_FUNCTION
|
std::enable_if_t<(std::is_same<DeviceType,LMPDeviceType>::value || Kokkos::SpaceAccessibility<LMPDeviceType::memory_space,LMPHostType::memory_space>::accessible),hash_type> view() {return d_view;}
|
||||||
std::enable_if_t<std::is_same<DeviceType,LMPDeviceType>::value,hash_type> view() {return d_view;}
|
|
||||||
|
|
||||||
template<class DeviceType>
|
template<class DeviceType>
|
||||||
KOKKOS_INLINE_FUNCTION
|
std::enable_if_t<!(std::is_same<DeviceType,LMPDeviceType>::value || Kokkos::SpaceAccessibility<LMPDeviceType::memory_space,LMPHostType::memory_space>::accessible),host_hash_type> view() {return h_view;}
|
||||||
std::enable_if_t<!std::is_same<DeviceType,LMPDeviceType>::value,host_hash_type> view() {return h_view;}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user