From 0797359c576bf885db76c3491f6c5821e219c0f0 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Tue, 9 Feb 2021 17:59:25 -0700 Subject: [PATCH] Make ExecutionWholeArray objects not depend on device type With recent changes to `Arrayhandle`, the type for the associated array portal is now the same across all devices. This means that almost all exec objects no longer need to be specialized on the device types. Thus, clean up the whole array exec objects to no longer need to be templated on device. --- benchmarking/BenchmarkFieldAlgorithms.cxx | 8 +- vtkm/cont/arg/TransportTagWholeArrayIn.h | 4 +- vtkm/cont/arg/TransportTagWholeArrayInOut.h | 4 +- vtkm/cont/arg/TransportTagWholeArrayOut.h | 4 +- vtkm/exec/ExecutionWholeArray.h | 116 ++++++++++++++------ 5 files changed, 94 insertions(+), 42 deletions(-) diff --git a/benchmarking/BenchmarkFieldAlgorithms.cxx b/benchmarking/BenchmarkFieldAlgorithms.cxx index a23c2c3b8..8a690f073 100644 --- a/benchmarking/BenchmarkFieldAlgorithms.cxx +++ b/benchmarking/BenchmarkFieldAlgorithms.cxx @@ -226,20 +226,20 @@ public: using ExecutionSignature = void(_1, _2, _3, _4); using InputDomain = _1; - template + template VTKM_EXEC void operator()(const vtkm::Id2& low_high, const WeightType& weight, - const vtkm::exec::ExecutionWholeArrayConst& inPortal, + const vtkm::exec::ExecutionWholeArrayConst& inPortal, T& result) const { //fetch the low / high values from inPortal result = vtkm::Lerp(inPortal.Get(low_high[0]), inPortal.Get(low_high[1]), weight); } - template + template VTKM_EXEC void operator()(const vtkm::Id2&, const WeightType&, - const vtkm::exec::ExecutionWholeArrayConst&, + const vtkm::exec::ExecutionWholeArrayConst&, U&) const { //the inPortal and result need to be the same type so this version only diff --git a/vtkm/cont/arg/TransportTagWholeArrayIn.h b/vtkm/cont/arg/TransportTagWholeArrayIn.h index c4dad8e93..86454234d 100644 --- a/vtkm/cont/arg/TransportTagWholeArrayIn.h +++ b/vtkm/cont/arg/TransportTagWholeArrayIn.h @@ -56,7 +56,7 @@ struct Transport; + using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst; template VTKM_CONT ExecObjectType operator()(ContObjectType& array, @@ -69,7 +69,7 @@ struct Transport; + using ExecObjectType = vtkm::exec::ExecutionWholeArray; template VTKM_CONT ExecObjectType operator()(ContObjectType& array, @@ -71,7 +71,7 @@ struct Transport; + using ExecObjectType = vtkm::exec::ExecutionWholeArray; template VTKM_CONT ExecObjectType operator()(ContObjectType& array, @@ -71,7 +71,7 @@ struct Transport #include +#include + namespace vtkm { namespace exec { -/// The following classes have been deprecated and are meant to be used +/// The following classes have been sort of deprecated and are meant to be used /// internally only. Please use the \c WholeArrayIn, \c WholeArrayOut, and /// \c WholeArrayInOut \c ControlSignature tags instead. @@ -27,8 +29,11 @@ namespace exec /// function. This can be used to allow worklets to have a shared search /// structure. /// -template -class ExecutionWholeArray +template +class ExecutionWholeArray; + +template +class ExecutionWholeArray { public: using ValueType = T; @@ -41,29 +46,20 @@ public: { } - // This constructor is deprecated in VTK-m 1.6 VTKM_CONT - ExecutionWholeArray(HandleType& handle) - : Portal(handle.PrepareForInPlace(DeviceAdapterTag())) - { - } - - // This constructor is deprecated in VTK-m 1.6 - VTKM_CONT - ExecutionWholeArray(HandleType& handle, vtkm::Id length) - : Portal(handle.PrepareForOutput(length, DeviceAdapterTag())) + ExecutionWholeArray(HandleType& handle, + vtkm::cont::DeviceAdapterId device, + vtkm::cont::Token& token) + : Portal(handle.PrepareForInPlace(device, token)) { } VTKM_CONT - ExecutionWholeArray(HandleType& handle, vtkm::cont::Token& token) - : Portal(handle.PrepareForInPlace(DeviceAdapterTag(), token)) - { - } - - VTKM_CONT - ExecutionWholeArray(HandleType& handle, vtkm::Id length, vtkm::cont::Token& token) - : Portal(handle.PrepareForOutput(length, DeviceAdapterTag(), token)) + ExecutionWholeArray(HandleType& handle, + vtkm::Id length, + vtkm::cont::DeviceAdapterId device, + vtkm::cont::Token& token) + : Portal(handle.PrepareForOutput(length, device, token)) { } @@ -86,13 +82,50 @@ private: PortalType Portal; }; +template +class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.") + ExecutionWholeArray : public ExecutionWholeArray +{ + using Superclass = ExecutionWholeArray; + using HandleType = typename Superclass::HandleType; + +public: + using Superclass::Superclass; + + VTKM_CONT ExecutionWholeArray(HandleType& handle) + : Superclass(handle, Device{}, vtkm::cont::Token{}) + { + } + + VTKM_CONT + ExecutionWholeArray(HandleType& handle, vtkm::Id length) + : Superclass(handle, length, Device{}, vtkm::cont::Token{}) + { + } + + VTKM_CONT + ExecutionWholeArray(HandleType& handle, vtkm::cont::Token& token) + : Superclass(handle, Device{}, token) + { + } + + VTKM_CONT + ExecutionWholeArray(HandleType& handle, vtkm::Id length, vtkm::cont::Token& token) + : Superclass(handle, length, Device{}, token) + { + } +}; + /// \c ExecutionWholeArrayConst is an execution object that allows an array handle /// content to be a parameter in an execution environment /// function. This can be used to allow worklets to have a shared search /// structure /// -template -class ExecutionWholeArrayConst +template +class ExecutionWholeArrayConst; + +template +class ExecutionWholeArrayConst { public: using ValueType = T; @@ -105,16 +138,11 @@ public: { } - // This constructor is deprecated in VTK-m 1.6 VTKM_CONT - ExecutionWholeArrayConst(const HandleType& handle) - : Portal(handle.PrepareForInput(DeviceAdapterTag())) - { - } - - VTKM_CONT - ExecutionWholeArrayConst(const HandleType& handle, vtkm::cont::Token& token) - : Portal(handle.PrepareForInput(DeviceAdapterTag(), token)) + ExecutionWholeArrayConst(const HandleType& handle, + vtkm::cont::DeviceAdapterId device, + vtkm::cont::Token& token) + : Portal(handle.PrepareForInput(device, token)) { } @@ -133,6 +161,30 @@ public: private: PortalType Portal; }; + +template +class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.") + ExecutionWholeArrayConst : public ExecutionWholeArrayConst +{ + using Superclass = ExecutionWholeArrayConst; + using HandleType = typename Superclass::HandleType; + +public: + using Superclass::Superclass; + + VTKM_CONT ExecutionWholeArrayConst(HandleType& handle) + : Superclass(handle, Device{}, vtkm::cont::Token{}) + { + } + + VTKM_CONT + ExecutionWholeArrayConst(HandleType& handle, vtkm::cont::Token& token) + : Superclass(handle, Device{}, token) + { + } +}; + + } } // namespace vtkm::exec