Remove device template argument from AtomicArrayExecutionObject

The actual code for AtomicArrayExecutionObject does not need to be
specialized by the device. The functionality is implemented by calling
the vtkm::Atomic* methods, which are properly implemented on each
device.
This commit is contained in:
Kenneth Moreland 2021-02-02 16:43:51 -07:00
parent 0b277b1ec8
commit 7df5c39358
5 changed files with 54 additions and 18 deletions

@ -73,12 +73,11 @@ public:
{
}
template <typename Device>
VTKM_CONT vtkm::exec::AtomicArrayExecutionObject<T, Device> PrepareForExecution(
Device,
VTKM_CONT vtkm::exec::AtomicArrayExecutionObject<T> PrepareForExecution(
vtkm::cont::DeviceAdapterId device,
vtkm::cont::Token& token) const
{
return vtkm::exec::AtomicArrayExecutionObject<T, Device>(this->Handle, token);
return vtkm::exec::AtomicArrayExecutionObject<T>(this->Handle, device, token);
}
template <typename Device>

@ -48,7 +48,7 @@ struct Transport<vtkm::cont::arg::TransportTagAtomicArray,
vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagBasic>,
Device>
{
using ExecObjectType = vtkm::exec::AtomicArrayExecutionObject<T, Device>;
using ExecObjectType = vtkm::exec::AtomicArrayExecutionObject<T>;
using ExecType = vtkm::cont::AtomicArray<T>;
template <typename InputDomainType>
@ -74,7 +74,7 @@ struct Transport<vtkm::cont::arg::TransportTagAtomicArray,
vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagVirtual>,
Device>
{
using ExecObjectType = vtkm::exec::AtomicArrayExecutionObject<T, Device>;
using ExecObjectType = vtkm::exec::AtomicArrayExecutionObject<T>;
using ExecType = vtkm::cont::AtomicArray<T>;
template <typename InputDomainType>

@ -311,7 +311,7 @@ public:
VTKM_CONT void SetErrorMessageBuffer(const vtkm::exec::internal::ErrorMessageBuffer&) {}
vtkm::exec::AtomicArrayExecutionObject<T, DeviceAdapterTag> AArray;
vtkm::exec::AtomicArrayExecutionObject<T> AArray;
};
template <typename T>
@ -335,7 +335,7 @@ public:
VTKM_CONT void SetErrorMessageBuffer(const vtkm::exec::internal::ErrorMessageBuffer&) {}
vtkm::exec::AtomicArrayExecutionObject<T, DeviceAdapterTag> AArray;
vtkm::exec::AtomicArrayExecutionObject<T> AArray;
};
class VirtualObjectTransferKernel

@ -51,8 +51,42 @@ struct MakeUnsigned<vtkm::Int64>
};
}
template <typename T, typename... MaybeDevice>
class AtomicArrayExecutionObject;
template <typename T, typename Device>
class AtomicArrayExecutionObject
class VTKM_DEPRECATED(1.6, "AtomicArrayExecutionObject no longer uses Device template parameter.")
AtomicArrayExecutionObject<T, Device> : public AtomicArrayExecutionObject<T>
{
using Superclass = AtomicArrayExecutionObject<T>;
public:
AtomicArrayExecutionObject() = default;
// This constructor is deprecated in VTK-m 1.6.
VTKM_DEPRECATED(1.6, "AtomicArrayExecutionObject no longer uses Device template parameter.")
AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle)
: Superclass(handle, Device{})
{
}
VTKM_DEPRECATED(1.6, "AtomicArrayExecutionObject no longer uses Device template parameter.")
AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle, vtkm::cont::Token& token)
: Superclass(handle, Device{}, token)
{
}
// How does this even work?
template <typename PortalType>
VTKM_DEPRECATED(1.6, "AtomicArrayExecutionObject no longer uses Device template parameter.")
AtomicArrayExecutionObject(const PortalType& portal)
: Superclass(portal)
{
}
};
template <typename T>
class AtomicArrayExecutionObject<T>
{
// Checks if PortalType has a GetIteratorBegin() method that returns a
// pointer.
@ -68,21 +102,25 @@ public:
AtomicArrayExecutionObject() = default;
// This constructor is deprecated in VTK-m 1.6.
VTKM_CONT AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle)
: Data{ handle.PrepareForInPlace(Device{}).GetIteratorBegin() }
VTKM_CONT VTKM_DEPRECATED(1.6, "AtomicArrayExecutionObject constructor needs token.")
AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle,
vtkm::cont::DeviceAdapterId device)
: Data{ handle.PrepareForInPlace(device).GetIteratorBegin() }
, NumberOfValues{ handle.GetNumberOfValues() }
{
using PortalType = decltype(handle.PrepareForInPlace(Device{}));
using PortalType = decltype(handle.PrepareForInPlace(device));
VTKM_STATIC_ASSERT_MSG(HasPointerAccess<PortalType>::value,
"Source portal must return a pointer from "
"GetIteratorBegin().");
}
VTKM_CONT AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle, vtkm::cont::Token& token)
: Data{ handle.PrepareForInPlace(Device{}, token).GetIteratorBegin() }
VTKM_CONT AtomicArrayExecutionObject(vtkm::cont::ArrayHandle<T> handle,
vtkm::cont::DeviceAdapterId device,
vtkm::cont::Token& token)
: Data{ handle.PrepareForInPlace(device, token).GetIteratorBegin() }
, NumberOfValues{ handle.GetNumberOfValues() }
{
using PortalType = decltype(handle.PrepareForInPlace(Device{}, token));
using PortalType = decltype(handle.PrepareForInPlace(device, token));
VTKM_STATIC_ASSERT_MSG(HasPointerAccess<PortalType>::value,
"Source portal must return a pointer from "
"GetIteratorBegin().");
@ -173,7 +211,7 @@ public:
/// an atomic multiplication may be implemented using compare-exchange as follows:
///
/// ```cpp
/// AtomicArrayExecutionObject<vtkm::Int32, ...> atomicArray = ...;
/// AtomicArrayExecutionObject<vtkm::Int32> atomicArray = ...;
///
/// // Compare-exchange multiplication:
/// vtkm::Int32 current = atomicArray.Get(idx); // Load the current value at idx

@ -147,8 +147,7 @@ template <typename DeviceTag>
class EdgePlotter : public vtkm::worklet::WorkletMapField
{
public:
using AtomicPackedFrameBufferHandle =
vtkm::exec::AtomicArrayExecutionObject<vtkm::Int64, DeviceTag>;
using AtomicPackedFrameBufferHandle = vtkm::exec::AtomicArrayExecutionObject<vtkm::Int64>;
using AtomicPackedFrameBuffer = vtkm::cont::AtomicArray<vtkm::Int64>;
using ControlSignature = void(FieldIn, WholeArrayIn, WholeArrayIn);