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 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,
const WeightType& weight,
const vtkm::exec::ExecutionWholeArrayConst<T, S, D>& inPortal,
const vtkm::exec::ExecutionWholeArrayConst<T, S>& 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 <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&,
const WeightType&,
const vtkm::exec::ExecutionWholeArrayConst<T, S, D>&,
const vtkm::exec::ExecutionWholeArrayConst<T, S>&,
U&) const
{
//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 StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst<ValueType, StorageTag, Device>;
using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst<ValueType, StorageTag>;
template <typename InputDomainType>
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
// the array.
return ExecObjectType(array, token);
return ExecObjectType(array, Device{}, token);
}
#ifdef VTKM_MSVC

@ -58,7 +58,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayInOut, ContObjectType, D
using ValueType = typename ContObjectType::ValueType;
using StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag, Device>;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
template <typename InputDomainType>
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
// the array.
return ExecObjectType(array, token);
return ExecObjectType(array, Device{}, token);
}
#ifdef VTKM_MSVC

@ -58,7 +58,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayOut, ContObjectType, Dev
using ValueType = typename ContObjectType::ValueType;
using StorageTag = typename ContObjectType::StorageTag;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag, Device>;
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
template <typename InputDomainType>
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
// the array.
return ExecObjectType(array, array.GetNumberOfValues(), token);
return ExecObjectType(array, array.GetNumberOfValues(), Device{}, token);
}
#ifdef VTKM_MSVC

@ -13,12 +13,14 @@
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/DeviceAdapter.h>
#include <vtkm/Deprecated.h>
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 <typename T, typename StorageTag, typename DeviceAdapterTag>
class ExecutionWholeArray
template <typename T, typename StorageTag, typename... MaybeDevice>
class ExecutionWholeArray;
template <typename T, typename StorageTag>
class ExecutionWholeArray<T, StorageTag>
{
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 <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
/// content to be a parameter in an execution environment
/// function. This can be used to allow worklets to have a shared search
/// structure
///
template <typename T, typename StorageTag, typename DeviceAdapterTag>
class ExecutionWholeArrayConst
template <typename T, typename StorageTag, typename... MaybeDevice>
class ExecutionWholeArrayConst;
template <typename T, typename StorageTag>
class ExecutionWholeArrayConst<T, StorageTag>
{
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 <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