//@HEADER // ************************************************************************ // // Kokkos v. 4.0 // Copyright (2022) National Technology & Engineering // Solutions of Sandia, LLC (NTESS). // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. // See https://kokkos.org/LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //@HEADER // Experimental unified task-data parallel manycore LDRD #ifndef KOKKOS_IMPL_TASKRESULT_HPP #define KOKKOS_IMPL_TASKRESULT_HPP #include #if defined(KOKKOS_ENABLE_TASKDAG) #include #include #include #include #include #include //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { namespace Impl { template struct TaskResult { enum : int32_t { size = sizeof(ResultType) }; using reference_type = ResultType&; template KOKKOS_INLINE_FUNCTION static ResultType* ptr( PoolAllocatedObjectBase* task) { return reinterpret_cast(reinterpret_cast(task) + task->get_allocation_size() - sizeof(ResultType)); } KOKKOS_INLINE_FUNCTION static ResultType* ptr(TaskBase* task) { return reinterpret_cast(reinterpret_cast(task) + task->m_alloc_size - sizeof(ResultType)); } KOKKOS_INLINE_FUNCTION static reference_type get(TaskBase* task) { return *ptr(task); } template KOKKOS_INLINE_FUNCTION static reference_type get( TaskNode* task) { return *ptr(task); } KOKKOS_INLINE_FUNCTION static void destroy(TaskBase* task) { get(task).~ResultType(); } // template // KOKKOS_INLINE_FUNCTION static // void destroy( TaskNode* task ) //{ get(task).~ResultType(); } }; template <> struct TaskResult { enum : int32_t { size = 0 }; using reference_type = void; template KOKKOS_INLINE_FUNCTION static void* ptr(TaskNode* /*task*/) { return nullptr; } KOKKOS_INLINE_FUNCTION static void* ptr(TaskBase*) { return nullptr; } template KOKKOS_INLINE_FUNCTION static reference_type get( TaskNode* /*task*/) { /* Should never be called */ } KOKKOS_INLINE_FUNCTION static reference_type get(TaskBase*) {} KOKKOS_INLINE_FUNCTION static void destroy(TaskBase* /*task*/) {} // template // KOKKOS_INLINE_FUNCTION static // void destroy( TaskNode* task ) //{ } }; } /* namespace Impl */ } /* namespace Kokkos */ //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- #endif /* #if defined( KOKKOS_ENABLE_TASKDAG ) */ #endif /* #ifndef KOKKOS_IMPL_TASKRESULT_HPP */