//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // // Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS). // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 Los Alamos National Security. // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_cont_Algorithm_h #define vtk_m_cont_Algorithm_h #include #include #include #include namespace vtkm { namespace cont { namespace { struct CopyFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Copy(std::forward(args)...); return true; } }; struct CopyIfFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::CopyIf(std::forward(args)...); return true; } }; struct CopySubRangeFunctor { bool valid; template VTKM_CONT bool operator()(Device, Args&&... args) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); valid = vtkm::cont::DeviceAdapterAlgorithm::CopySubRange(std::forward(args)...); return true; } }; struct LowerBoundsFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::LowerBounds(std::forward(args)...); return true; } }; template struct ReduceFunctor { U result; ReduceFunctor() : result(U(0)) { } template VTKM_CONT bool operator()(Device, Args&&... args) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); result = vtkm::cont::DeviceAdapterAlgorithm::Reduce(std::forward(args)...); return true; } }; struct ReduceByKeyFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::ReduceByKey(std::forward(args)...); return true; } }; template struct ScanInclusiveResultFunctor { T result; ScanInclusiveResultFunctor() : result(T(0)) { } template VTKM_CONT bool operator()(Device, Args&&... args) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); result = vtkm::cont::DeviceAdapterAlgorithm::ScanInclusive(std::forward(args)...); return true; } }; template struct StreamingScanExclusiveFunctor { T result; StreamingScanExclusiveFunctor() : result(T(0)) { } template VTKM_CONT bool operator()(Device, const vtkm::Id numBlocks, const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); result = vtkm::cont::DeviceAdapterAlgorithm::StreamingScanExclusive(numBlocks, input, output); return true; } }; struct ScanInclusiveByKeyFunctor { ScanInclusiveByKeyFunctor() {} template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::ScanInclusiveByKey(std::forward(args)...); return true; } }; template struct ScanExclusiveFunctor { T result; ScanExclusiveFunctor() : result(T(0)) { } template VTKM_CONT bool operator()(Device, Args&&... args) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); result = vtkm::cont::DeviceAdapterAlgorithm::ScanExclusive(std::forward(args)...); return true; } }; struct ScanExclusiveByKeyFunctor { ScanExclusiveByKeyFunctor() {} template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::ScanExclusiveByKey(std::forward(args)...); return true; } }; struct ScheduleFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Schedule(std::forward(args)...); return true; } }; struct SortFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Sort(std::forward(args)...); return true; } }; struct SortByKeyFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::SortByKey(std::forward(args)...); return true; } }; struct SynchronizeFunctor { template VTKM_CONT bool operator()(Device) { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Synchronize(); return true; } }; struct TransformFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Transform(std::forward(args)...); return true; } }; struct UniqueFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::Unique(std::forward(args)...); return true; } }; struct UpperBoundsFunctor { template VTKM_CONT bool operator()(Device, Args&&... args) const { VTKM_IS_DEVICE_ADAPTER_TAG(Device); vtkm::cont::DeviceAdapterAlgorithm::UpperBounds(std::forward(args)...); return true; } }; } // annonymous namespace struct Algorithm { template VTKM_CONT static void Copy(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output) { vtkm::cont::TryExecute(CopyFunctor(), input, output); } template VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& stencil, vtkm::cont::ArrayHandle& output) { vtkm::cont::TryExecute(CopyIfFunctor(), input, stencil, output); } template VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& stencil, vtkm::cont::ArrayHandle& output, UnaryPredicate unary_predicate) { vtkm::cont::TryExecute(CopyIfFunctor(), input, stencil, output, unary_predicate); } template VTKM_CONT static bool CopySubRange(const vtkm::cont::ArrayHandle& input, vtkm::Id inputStartIndex, vtkm::Id numberOfElementsToCopy, vtkm::cont::ArrayHandle& output, vtkm::Id outputIndex = 0) { CopySubRangeFunctor functor; vtkm::cont::TryExecute( functor, input, inputStartIndex, numberOfElementsToCopy, output, outputIndex); return functor.valid; } template VTKM_CONT static void LowerBounds(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output) { vtkm::cont::TryExecute(LowerBoundsFunctor(), input, values, output); } template VTKM_CONT static void LowerBounds(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output, BinaryCompare binary_compare) { vtkm::cont::TryExecute(LowerBoundsFunctor(), input, values, output, binary_compare); } template VTKM_CONT static void LowerBounds(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& values_output) { vtkm::cont::TryExecute(LowerBoundsFunctor(), input, values_output); } template VTKM_CONT static U Reduce(const vtkm::cont::ArrayHandle& input, U initialValue) { ReduceFunctor functor; vtkm::cont::TryExecute(functor, input, initialValue); return functor.result; } template VTKM_CONT static U Reduce(const vtkm::cont::ArrayHandle& input, U initialValue, BinaryFunctor binary_functor) { ReduceFunctor functor; vtkm::cont::TryExecute(functor, input, initialValue, binary_functor); return functor.result; } template VTKM_CONT static void ReduceByKey(const vtkm::cont::ArrayHandle& keys, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& keys_output, vtkm::cont::ArrayHandle& values_output, BinaryFunctor binary_functor) { vtkm::cont::TryExecute( ReduceByKeyFunctor(), keys, values, keys_output, values_output, binary_functor); } template VTKM_CONT static T ScanInclusive(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output) { ScanInclusiveResultFunctor functor; vtkm::cont::TryExecute(functor, input, output); return functor.result; } template VTKM_CONT static T StreamingScanExclusive(const vtkm::Id numBlocks, const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output) { StreamingScanExclusiveFunctor functor; vtkm::cont::TryExecute(functor, numBlocks, input, output); return functor.result; } template VTKM_CONT static T ScanInclusive(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output, BinaryFunctor binary_functor) { ScanInclusiveResultFunctor functor; vtkm::cont::TryExecute(functor, input, output, binary_functor); return functor.result; } template VTKM_CONT static void ScanInclusiveByKey(const vtkm::cont::ArrayHandle& keys, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& values_output, BinaryFunctor binary_functor) { vtkm::cont::TryExecute( ScanInclusiveByKeyFunctor(), keys, values, values_output, binary_functor); } template VTKM_CONT static void ScanInclusiveByKey(const vtkm::cont::ArrayHandle& keys, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& values_output) { vtkm::cont::TryExecute(ScanInclusiveByKeyFunctor(), keys, values, values_output); } template VTKM_CONT static T ScanExclusive(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output) { ScanExclusiveFunctor functor; vtkm::cont::TryExecute(functor, input, output); return functor.result; } template VTKM_CONT static T ScanExclusive(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& output, BinaryFunctor binaryFunctor, const T& initialValue) { ScanExclusiveFunctor functor; vtkm::cont::TryExecute(functor, input, output, binaryFunctor, initialValue); return functor.result; } template VTKM_CONT static void ScanExclusiveByKey(const vtkm::cont::ArrayHandle& keys, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output, const U& initialValue, BinaryFunctor binaryFunctor) { vtkm::cont::TryExecute( ScanExclusiveByKeyFunctor(), keys, values, output, initialValue, binaryFunctor); } template VTKM_CONT static void ScanExclusiveByKey(const vtkm::cont::ArrayHandle& keys, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output) { vtkm::cont::TryExecute(ScanExclusiveByKeyFunctor(), keys, values, output); } template VTKM_CONT static void Schedule(Functor functor, vtkm::Id numInstances) { vtkm::cont::TryExecute(ScheduleFunctor(), functor, numInstances); } template VTKM_CONT static void Schedule(Functor functor, vtkm::Id3 rangeMax) { vtkm::cont::TryExecute(ScheduleFunctor(), functor, rangeMax); } template VTKM_CONT static void Sort(vtkm::cont::ArrayHandle& values) { vtkm::cont::TryExecute(SortFunctor(), values); } template VTKM_CONT static void Sort(vtkm::cont::ArrayHandle& values, BinaryCompare binary_compare) { vtkm::cont::TryExecute(SortFunctor(), values, binary_compare); } template VTKM_CONT static void SortByKey(vtkm::cont::ArrayHandle& keys, vtkm::cont::ArrayHandle& values) { vtkm::cont::TryExecute(SortByKeyFunctor(), keys, values); } template VTKM_CONT static void SortByKey(vtkm::cont::ArrayHandle& keys, vtkm::cont::ArrayHandle& values, BinaryCompare binary_compare) { vtkm::cont::TryExecute(SortByKeyFunctor(), keys, values, binary_compare); } VTKM_CONT static void Synchronize() { vtkm::cont::TryExecute(SynchronizeFunctor()); } template VTKM_CONT static void Transform(const vtkm::cont::ArrayHandle& input1, const vtkm::cont::ArrayHandle& input2, vtkm::cont::ArrayHandle& output, BinaryFunctor binaryFunctor) { vtkm::cont::TryExecute(TransformFunctor(), input1, input2, output, binaryFunctor); } template VTKM_CONT static void Unique(vtkm::cont::ArrayHandle& values) { vtkm::cont::TryExecute(UniqueFunctor(), values); } template VTKM_CONT static void Unique(vtkm::cont::ArrayHandle& values, BinaryCompare binary_compare) { vtkm::cont::TryExecute(UniqueFunctor(), values, binary_compare); } template VTKM_CONT static void UpperBounds(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output) { vtkm::cont::TryExecute(UpperBoundsFunctor(), input, values, output); } template VTKM_CONT static void UpperBounds(const vtkm::cont::ArrayHandle& input, const vtkm::cont::ArrayHandle& values, vtkm::cont::ArrayHandle& output, BinaryCompare binary_compare) { vtkm::cont::TryExecute(UpperBoundsFunctor(), input, values, output, binary_compare); } template VTKM_CONT static void UpperBounds(const vtkm::cont::ArrayHandle& input, vtkm::cont::ArrayHandle& values_output) { vtkm::cont::TryExecute(UpperBoundsFunctor(), input, values_output); } }; } } // namespace vtkm::cont #endif //vtk_m_cont_Algorithm_h