Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <charm++.h> 7 : 8 : #include "Parallel/TypeTraits.hpp" 9 : 10 : namespace Parallel { 11 : /// \cond 12 : namespace Algorithms { 13 : struct Singleton; 14 : } // namespace Algorithms 15 : /// \endcond 16 : 17 : /// Wrapper for calling Charm++'s `.ckLocal()` on a proxy 18 : /// 19 : /// The Proxy must be to a Charm++ array chare (implementing a singleton 20 : /// design pattern using a single-element array) or to a Charm++ array element 21 : /// chare (i.e., the proxy obtained by indexing into a Charm++ array chare). 22 : /// 23 : /// The function returns a pointer to the chare if it exists on the local 24 : /// processor, and NULL if it does not. See the Charm++ documentation. 25 : /// It is the responsibility of the user to check the result pointer is valid. 26 : template <typename Proxy> 27 1 : auto* local(Proxy&& proxy) { 28 : // It only makes sense to call .ckLocal() on some kinds of proxies 29 : static_assert(is_array_element_proxy<std::decay_t<Proxy>>::value or 30 : is_array_proxy<std::decay_t<Proxy>>::value); 31 : if constexpr (std::is_same_v< 32 : Parallel::Algorithms::Singleton, 33 : typename Parallel::get_parallel_component_from_proxy< 34 : std::decay_t<Proxy>>::type::chare_type>) { 35 : // The array case should be a single-element array serving as a singleton 36 : return proxy[0].ckLocal(); 37 : } else { 38 : return proxy.ckLocal(); 39 : } 40 : } 41 : 42 : /// Wrapper for calling Charm++'s `.ckLocalBranch()` on a proxy 43 : /// 44 : /// The Proxy must be to a Charm++ group chare or nodegroup chare. 45 : /// 46 : /// The function returns a pointer to the local group/nodegroup chare. 47 : template <typename Proxy> 48 1 : auto* local_branch(Proxy&& proxy) { 49 : // It only makes sense to call .ckLocalBranch() on some kinds of proxies 50 : static_assert(is_group_proxy<std::decay_t<Proxy>>::value or 51 : is_node_group_proxy<std::decay_t<Proxy>>::value); 52 : return proxy.ckLocalBranch(); 53 : } 54 : 55 : } // namespace Parallel