//============================================================================ // 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. //============================================================================ #ifndef vtk_m_cont_AtomicArray_h #define vtk_m_cont_AtomicArray_h #include #include #include #include #include #include namespace vtkm { namespace cont { /// \brief A type list containing types that can be used with an AtomicArray. /// /// @cond NONE using AtomicArrayTypeList = vtkm::List; /// @endcond /// A class that can be used to atomically operate on an array of values safely /// across multiple instances of the same worklet. This is useful when you have /// an algorithm that needs to accumulate values in parallel, but writing out a /// value per worklet might be memory prohibitive. /// /// To construct an AtomicArray you will need to pass in an /// vtkm::cont::ArrayHandle that is used as the underlying storage for the /// AtomicArray /// /// Supported Operations: get / add / compare and swap (CAS). See /// AtomicArrayExecutionObject for details. /// /// Supported Types: 32 / 64 bit signed/unsigned integers. /// /// template class AtomicArray : public vtkm::cont::ExecutionObjectBase { static constexpr bool ValueTypeIsValid = vtkm::ListHas::value; VTKM_STATIC_ASSERT_MSG(ValueTypeIsValid, "AtomicArray used with unsupported ValueType."); public: using ValueType = T; VTKM_CONT AtomicArray() : Handle(vtkm::cont::ArrayHandle()) { } VTKM_CONT AtomicArray(vtkm::cont::ArrayHandle handle) : Handle(handle) { } VTKM_CONT vtkm::exec::AtomicArrayExecutionObject PrepareForExecution( vtkm::cont::DeviceAdapterId device, vtkm::cont::Token& token) const { return vtkm::exec::AtomicArrayExecutionObject(this->Handle, device, token); } private: /// @cond NONE vtkm::cont::ArrayHandle Handle; /// @endcond }; } } // namespace vtkm::exec #endif //vtk_m_cont_AtomicArray_h