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.
This commit is contained in:
Kenneth Moreland 2021-02-09 17:59:25 -07:00
parent 0bee744384
commit 0797359c57
5 changed files with 94 additions and 42 deletions

@ -226,20 +226,20 @@ public:
using ExecutionSignature = void(_1, _2, _3, _4); using ExecutionSignature = void(_1, _2, _3, _4);
using InputDomain = _1; using InputDomain = _1;
template <typename WeightType, typename T, typename S, typename D> template <typename WeightType, typename T, typename S>
VTKM_EXEC void operator()(const vtkm::Id2& low_high, VTKM_EXEC void operator()(const vtkm::Id2& low_high,
const WeightType& weight, const WeightType& weight,
const vtkm::exec::ExecutionWholeArrayConst<T, S, D>& inPortal, const vtkm::exec::ExecutionWholeArrayConst<T, S>& inPortal,
T& result) const T& result) const
{ {
//fetch the low / high values from inPortal //fetch the low / high values from inPortal
result = vtkm::Lerp(inPortal.Get(low_high[0]), inPortal.Get(low_high[1]), weight); result = vtkm::Lerp(inPortal.Get(low_high[0]), inPortal.Get(low_high[1]), weight);
} }
template <typename WeightType, typename T, typename S, typename D, typename U> template <typename WeightType, typename T, typename S, typename U>
VTKM_EXEC void operator()(const vtkm::Id2&, VTKM_EXEC void operator()(const vtkm::Id2&,
const WeightType&, const WeightType&,
const vtkm::exec::ExecutionWholeArrayConst<T, S, D>&, const vtkm::exec::ExecutionWholeArrayConst<T, S>&,
U&) const U&) const
{ {
//the inPortal and result need to be the same type so this version only //the inPortal and result need to be the same type so this version only

@ -56,7 +56,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayIn, ContObjectType, Devi
using ValueType = typename ContObjectType::ValueType; using ValueType = typename ContObjectType::ValueType;
using StorageTag = typename ContObjectType::StorageTag; using StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst<ValueType, StorageTag, Device>; using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst<ValueType, StorageTag>;
template <typename InputDomainType> template <typename InputDomainType>
VTKM_CONT ExecObjectType operator()(ContObjectType& array, VTKM_CONT ExecObjectType operator()(ContObjectType& array,
@ -69,7 +69,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayIn, ContObjectType, Devi
// array might not have the same size depending on how the user is using // array might not have the same size depending on how the user is using
// the array. // the array.
return ExecObjectType(array, token); return ExecObjectType(array, Device{}, token);
} }
#ifdef VTKM_MSVC #ifdef VTKM_MSVC

@ -58,7 +58,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayInOut, ContObjectType, D
using ValueType = typename ContObjectType::ValueType; using ValueType = typename ContObjectType::ValueType;
using StorageTag = typename ContObjectType::StorageTag; using StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag, Device>; using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
template <typename InputDomainType> template <typename InputDomainType>
VTKM_CONT ExecObjectType operator()(ContObjectType& array, VTKM_CONT ExecObjectType operator()(ContObjectType& array,
@ -71,7 +71,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayInOut, ContObjectType, D
// array might not have the same size depending on how the user is using // array might not have the same size depending on how the user is using
// the array. // the array.
return ExecObjectType(array, token); return ExecObjectType(array, Device{}, token);
} }
#ifdef VTKM_MSVC #ifdef VTKM_MSVC

@ -58,7 +58,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayOut, ContObjectType, Dev
using ValueType = typename ContObjectType::ValueType; using ValueType = typename ContObjectType::ValueType;
using StorageTag = typename ContObjectType::StorageTag; using StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag, Device>; using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
template <typename InputDomainType> template <typename InputDomainType>
VTKM_CONT ExecObjectType operator()(ContObjectType& array, VTKM_CONT ExecObjectType operator()(ContObjectType& array,
@ -71,7 +71,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayOut, ContObjectType, Dev
// array might not have the same size depending on how the user is using // array might not have the same size depending on how the user is using
// the array. // the array.
return ExecObjectType(array, array.GetNumberOfValues(), token); return ExecObjectType(array, array.GetNumberOfValues(), Device{}, token);
} }
#ifdef VTKM_MSVC #ifdef VTKM_MSVC

@ -13,12 +13,14 @@
#include <vtkm/cont/ArrayHandle.h> #include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/DeviceAdapter.h> #include <vtkm/cont/DeviceAdapter.h>
#include <vtkm/Deprecated.h>
namespace vtkm namespace vtkm
{ {
namespace exec 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 /// internally only. Please use the \c WholeArrayIn, \c WholeArrayOut, and
/// \c WholeArrayInOut \c ControlSignature tags instead. /// \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 /// function. This can be used to allow worklets to have a shared search
/// structure. /// structure.
/// ///
template <typename T, typename StorageTag, typename DeviceAdapterTag> template <typename T, typename StorageTag, typename... MaybeDevice>
class ExecutionWholeArray class ExecutionWholeArray;
template <typename T, typename StorageTag>
class ExecutionWholeArray<T, StorageTag>
{ {
public: public:
using ValueType = T; using ValueType = T;
@ -41,29 +46,20 @@ public:
{ {
} }
// This constructor is deprecated in VTK-m 1.6
VTKM_CONT VTKM_CONT
ExecutionWholeArray(HandleType& handle) ExecutionWholeArray(HandleType& handle,
: Portal(handle.PrepareForInPlace(DeviceAdapterTag())) vtkm::cont::DeviceAdapterId device,
{ vtkm::cont::Token& token)
} : Portal(handle.PrepareForInPlace(device, token))
// This constructor is deprecated in VTK-m 1.6
VTKM_CONT
ExecutionWholeArray(HandleType& handle, vtkm::Id length)
: Portal(handle.PrepareForOutput(length, DeviceAdapterTag()))
{ {
} }
VTKM_CONT VTKM_CONT
ExecutionWholeArray(HandleType& handle, vtkm::cont::Token& token) ExecutionWholeArray(HandleType& handle,
: Portal(handle.PrepareForInPlace(DeviceAdapterTag(), token)) vtkm::Id length,
{ vtkm::cont::DeviceAdapterId device,
} vtkm::cont::Token& token)
: Portal(handle.PrepareForOutput(length, device, token))
VTKM_CONT
ExecutionWholeArray(HandleType& handle, vtkm::Id length, vtkm::cont::Token& token)
: Portal(handle.PrepareForOutput(length, DeviceAdapterTag(), token))
{ {
} }
@ -86,13 +82,50 @@ private:
PortalType Portal; PortalType Portal;
}; };
template <typename T, typename StorageTag, typename Device>
class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.")
ExecutionWholeArray<T, StorageTag, Device> : public ExecutionWholeArray<T, StorageTag>
{
using Superclass = ExecutionWholeArray<T, StorageTag>;
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 /// \c ExecutionWholeArrayConst is an execution object that allows an array handle
/// content to be a parameter in an execution environment /// content to be a parameter in an execution environment
/// function. This can be used to allow worklets to have a shared search /// function. This can be used to allow worklets to have a shared search
/// structure /// structure
/// ///
template <typename T, typename StorageTag, typename DeviceAdapterTag> template <typename T, typename StorageTag, typename... MaybeDevice>
class ExecutionWholeArrayConst class ExecutionWholeArrayConst;
template <typename T, typename StorageTag>
class ExecutionWholeArrayConst<T, StorageTag>
{ {
public: public:
using ValueType = T; using ValueType = T;
@ -105,16 +138,11 @@ public:
{ {
} }
// This constructor is deprecated in VTK-m 1.6
VTKM_CONT VTKM_CONT
ExecutionWholeArrayConst(const HandleType& handle) ExecutionWholeArrayConst(const HandleType& handle,
: Portal(handle.PrepareForInput(DeviceAdapterTag())) vtkm::cont::DeviceAdapterId device,
{ vtkm::cont::Token& token)
} : Portal(handle.PrepareForInput(device, token))
VTKM_CONT
ExecutionWholeArrayConst(const HandleType& handle, vtkm::cont::Token& token)
: Portal(handle.PrepareForInput(DeviceAdapterTag(), token))
{ {
} }
@ -133,6 +161,30 @@ public:
private: private:
PortalType Portal; PortalType Portal;
}; };
template <typename T, typename StorageTag, typename Device>
class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.")
ExecutionWholeArrayConst<T, StorageTag, Device> : public ExecutionWholeArrayConst<T, StorageTag>
{
using Superclass = ExecutionWholeArrayConst<T, StorageTag>;
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 } // namespace vtkm::exec