diff --git a/vtkm/exec/AtomicArray.h b/vtkm/cont/AtomicArray.h similarity index 61% rename from vtkm/exec/AtomicArray.h rename to vtkm/cont/AtomicArray.h index 68ea4ba53..39adde447 100644 --- a/vtkm/exec/AtomicArray.h +++ b/vtkm/cont/AtomicArray.h @@ -17,17 +17,18 @@ // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ -#ifndef vtk_m_exec_AtomicArray_h -#define vtk_m_exec_AtomicArray_h +#ifndef vtk_m_cont_AtomicArray_h +#define vtk_m_cont_AtomicArray_h #include #include #include #include +#include namespace vtkm { -namespace exec +namespace cont { /// \brief A type list containing types that can be used with an AtomicArray. @@ -36,46 +37,6 @@ struct AtomicArrayTypeListTag : vtkm::ListTagBase { }; -template -class AtomicArrayExecutionObject -{ -public: - using ValueType = T; - - VTKM_CONT - AtomicArrayExecutionObject() - : AtomicImplementation((vtkm::cont::ArrayHandle())) - { - } - - template - VTKM_CONT AtomicArrayExecutionObject(vtkm::cont::ArrayHandle handle) - : AtomicImplementation(handle) - { - } - - VTKM_SUPPRESS_EXEC_WARNINGS - VTKM_EXEC - T Add(vtkm::Id index, const T& value) const - { - return this->AtomicImplementation.Add(index, value); - } - - // - // Compare and Swap is an atomic exchange operation. If the value at - // the index is equal to oldValue, then newValue is written to the index. - // The operation was successful if return value is equal to oldValue - // - VTKM_SUPPRESS_EXEC_WARNINGS - VTKM_EXEC - T CompareAndSwap(vtkm::Id index, const T& newValue, const T& oldValue) const - { - return this->AtomicImplementation.CompareAndSwap(index, newValue, oldValue); - } - -private: - vtkm::cont::DeviceAdapterAtomicArrayImplementation AtomicImplementation; -}; /// 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 @@ -98,16 +59,16 @@ public: using ValueType = T; template - VTKM_CONT AtomicArrayExecutionObject PrepareForExecution(Device) const + VTKM_CONT vtkm::exec::AtomicArrayExecutionObject PrepareForExecution(Device) const { - AtomicArrayExecutionObject execObject; + vtkm::exec::AtomicArrayExecutionObject execObject; if (isHandle) { - execObject = AtomicArrayExecutionObject(this->Handle); + execObject = vtkm::exec::AtomicArrayExecutionObject(this->Handle); } else { - execObject = AtomicArrayExecutionObject(); + execObject = vtkm::exec::AtomicArrayExecutionObject(); } return execObject; } @@ -131,4 +92,4 @@ private: } } // namespace vtkm::exec -#endif //vtk_m_exec_AtomicArray_h +#endif //vtk_m_cont_AtomicArray_h diff --git a/vtkm/cont/CMakeLists.txt b/vtkm/cont/CMakeLists.txt index 61df9f5d6..5061755ac 100644 --- a/vtkm/cont/CMakeLists.txt +++ b/vtkm/cont/CMakeLists.txt @@ -46,6 +46,7 @@ set(headers ArrayHandleConcatenate.h ArrayRangeCompute.h AssignerMultiBlock.h + AtomicArray.h BoundingIntervalHierarchyNode.h BoundingIntervalHierarchy.h BoundsCompute.h diff --git a/vtkm/cont/arg/TransportTagAtomicArray.h b/vtkm/cont/arg/TransportTagAtomicArray.h index 16923f428..578803c38 100644 --- a/vtkm/cont/arg/TransportTagAtomicArray.h +++ b/vtkm/cont/arg/TransportTagAtomicArray.h @@ -27,7 +27,7 @@ #include -#include +#include namespace vtkm { @@ -54,7 +54,7 @@ struct Transport { using ExecObjectType = vtkm::exec::AtomicArrayExecutionObject; - using ExecType = vtkm::exec::AtomicArray; + using ExecType = vtkm::cont::AtomicArray; template VTKM_CONT ExecObjectType operator()(vtkm::cont::ArrayHandle array, diff --git a/vtkm/cont/arg/TypeCheckTagAtomicArray.h b/vtkm/cont/arg/TypeCheckTagAtomicArray.h index 3e500a822..9eb653d21 100644 --- a/vtkm/cont/arg/TypeCheckTagAtomicArray.h +++ b/vtkm/cont/arg/TypeCheckTagAtomicArray.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace vtkm { @@ -40,7 +40,7 @@ namespace arg /// that is valid for atomic access. There are many restrictions on the /// type of data that can be used for an atomic array. /// -template +template struct TypeCheckTagAtomicArray { VTKM_IS_LIST_TAG(TypeList); @@ -57,7 +57,7 @@ struct TypeCheck, vtkm::cont::ArrayHandle> { static constexpr bool value = (vtkm::ListContains::value && - vtkm::ListContains::value); + vtkm::ListContains::value); }; } } diff --git a/vtkm/cont/arg/testing/UnitTestTransportWholeArray.cxx b/vtkm/cont/arg/testing/UnitTestTransportWholeArray.cxx index 1d33bcfb6..8fc5185ca 100644 --- a/vtkm/cont/arg/testing/UnitTestTransportWholeArray.cxx +++ b/vtkm/cont/arg/testing/UnitTestTransportWholeArray.cxx @@ -196,7 +196,7 @@ void TryArrayOutTransport(Device) { vtkm::testing::Testing::TryTypes(TryWholeArrayType(), vtkm::TypeListTagCommon()); vtkm::testing::Testing::TryTypes(TryAtomicArrayType(), - vtkm::exec::AtomicArrayTypeListTag()); + vtkm::cont::AtomicArrayTypeListTag()); } void TestWholeArrayTransport() diff --git a/vtkm/cont/testing/TestingDeviceAdapter.h b/vtkm/cont/testing/TestingDeviceAdapter.h index edfe1f3fa..e5d8b9be9 100644 --- a/vtkm/cont/testing/TestingDeviceAdapter.h +++ b/vtkm/cont/testing/TestingDeviceAdapter.h @@ -42,7 +42,7 @@ #include -#include +#include #include #include @@ -270,7 +270,7 @@ public: struct AtomicKernel { VTKM_CONT - AtomicKernel(const vtkm::exec::AtomicArray& array) + AtomicKernel(const vtkm::cont::AtomicArray& array) : AArray(array.PrepareForExecution(DeviceAdapterTag())) { } @@ -290,7 +290,7 @@ public: struct AtomicCASKernel { VTKM_CONT - AtomicCASKernel(const vtkm::exec::AtomicArray& array) + AtomicCASKernel(const vtkm::cont::AtomicArray& array) : AArray(array.PrepareForExecution(DeviceAdapterTag())) { } @@ -2094,7 +2094,7 @@ private: vtkm::cont::ArrayHandle atomicElement = vtkm::cont::make_ArrayHandle(singleElement); - vtkm::exec::AtomicArray atomic(atomicElement); + vtkm::cont::AtomicArray atomic(atomicElement); Algorithm::Schedule(AtomicKernel(atomic), SHORT_ARRAY_SIZE); vtkm::Int32 expected = vtkm::Int32(atomicCount); vtkm::Int32 actual = atomicElement.GetPortalControl().Get(0); @@ -2108,7 +2108,7 @@ private: vtkm::cont::ArrayHandle atomicElement = vtkm::cont::make_ArrayHandle(singleElement); - vtkm::exec::AtomicArray atomic(atomicElement); + vtkm::cont::AtomicArray atomic(atomicElement); Algorithm::Schedule(AtomicKernel(atomic), SHORT_ARRAY_SIZE); vtkm::Int64 expected = vtkm::Int64(atomicCount); vtkm::Int64 actual = atomicElement.GetPortalControl().Get(0); @@ -2122,7 +2122,7 @@ private: vtkm::cont::ArrayHandle atomicElement = vtkm::cont::make_ArrayHandle(singleElement); - vtkm::exec::AtomicArray atomic(atomicElement); + vtkm::cont::AtomicArray atomic(atomicElement); Algorithm::Schedule(AtomicCASKernel(atomic), SHORT_ARRAY_SIZE); vtkm::Int32 expected = vtkm::Int32(atomicCount); vtkm::Int32 actual = atomicElement.GetPortalControl().Get(0); @@ -2136,7 +2136,7 @@ private: vtkm::cont::ArrayHandle atomicElement = vtkm::cont::make_ArrayHandle(singleElement); - vtkm::exec::AtomicArray atomic(atomicElement); + vtkm::cont::AtomicArray atomic(atomicElement); Algorithm::Schedule(AtomicCASKernel(atomic), SHORT_ARRAY_SIZE); vtkm::Int64 expected = vtkm::Int64(atomicCount); vtkm::Int64 actual = atomicElement.GetPortalControl().Get(0); diff --git a/vtkm/exec/AtomicArrayExecutionObject.h b/vtkm/exec/AtomicArrayExecutionObject.h new file mode 100644 index 000000000..8532d3ffe --- /dev/null +++ b/vtkm/exec/AtomicArrayExecutionObject.h @@ -0,0 +1,75 @@ +//============================================================================ +// 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. +// +// Copyright 2015 National Technology & Engineering Solutions of Sandia, LLC (NTESS). +// Copyright 2015 UT-Battelle, LLC. +// Copyright 2015 Los Alamos National Security. +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National +// Laboratory (LANL), the U.S. Government retains certain rights in +// this software. +//============================================================================ +#ifndef vtk_m_exec_AtomicArrayExecutionObject_h +#define vtk_m_exec_AtomicArrayExecutionObject_h + +#include +#include +#include + +namespace vtkm +{ +namespace exec +{ + +template +class AtomicArrayExecutionObject +{ +public: + using ValueType = T; + + VTKM_CONT + AtomicArrayExecutionObject() + : AtomicImplementation((vtkm::cont::ArrayHandle())) + { + } + + template + VTKM_CONT AtomicArrayExecutionObject(vtkm::cont::ArrayHandle handle) + : AtomicImplementation(handle) + { + } + + VTKM_SUPPRESS_EXEC_WARNINGS + VTKM_EXEC + T Add(vtkm::Id index, const T& value) const + { + return this->AtomicImplementation.Add(index, value); + } + + // + // Compare and Swap is an atomic exchange operation. If the value at + // the index is equal to oldValue, then newValue is written to the index. + // The operation was successful if return value is equal to oldValue + // + VTKM_SUPPRESS_EXEC_WARNINGS + VTKM_EXEC + T CompareAndSwap(vtkm::Id index, const T& newValue, const T& oldValue) const + { + return this->AtomicImplementation.CompareAndSwap(index, newValue, oldValue); + } + +private: + vtkm::cont::DeviceAdapterAtomicArrayImplementation AtomicImplementation; +}; +} +} // namespace vtkm::exec + +#endif //vtk_m_exec_AtomicArrayExecutionObject_h diff --git a/vtkm/exec/CMakeLists.txt b/vtkm/exec/CMakeLists.txt index 82946bbf9..bc701d6a7 100644 --- a/vtkm/exec/CMakeLists.txt +++ b/vtkm/exec/CMakeLists.txt @@ -19,8 +19,8 @@ ##============================================================================ set(headers - AtomicArray.h BoundingIntervalHierarchyExec.h + AtomicArrayExecutionObject.h CellDerivative.h CellEdge.h CellFace.h diff --git a/vtkm/rendering/Wireframer.h b/vtkm/rendering/Wireframer.h index 4a78045e6..6a9e43f7c 100644 --- a/vtkm/rendering/Wireframer.h +++ b/vtkm/rendering/Wireframer.h @@ -26,8 +26,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -159,7 +159,7 @@ class EdgePlotter : public vtkm::worklet::WorkletMapField public: using AtomicPackedFrameBufferHandle = vtkm::exec::AtomicArrayExecutionObject; - using AtomicPackedFrameBuffer = vtkm::exec::AtomicArray; + using AtomicPackedFrameBuffer = vtkm::cont::AtomicArray; using ControlSignature = void(FieldIn, WholeArrayIn, WholeArrayIn); using ExecutionSignature = void(_1, _2, _3); diff --git a/vtkm/rendering/raytracing/BoundingVolumeHierarchy.cxx b/vtkm/rendering/raytracing/BoundingVolumeHierarchy.cxx index 4b674ed0b..5145018fc 100644 --- a/vtkm/rendering/raytracing/BoundingVolumeHierarchy.cxx +++ b/vtkm/rendering/raytracing/BoundingVolumeHierarchy.cxx @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include @@ -306,7 +306,7 @@ public: IdArrayHandle& rightChildren, vtkm::Int32 leafCount, Float4ArrayHandle flatBVH, - const vtkm::exec::AtomicArray& counters) + const vtkm::cont::AtomicArray& counters) : Parents(parents.PrepareForInput(Device())) , LeftChildren(leftChildren.PrepareForInput(Device())) , RightChildren(rightChildren.PrepareForInput(Device())) @@ -774,7 +774,7 @@ VTKM_CONT void LinearBVHBuilder::RunOnDevice(LinearBVH& linearBVH, Device device vtkm::Int32 zero = 0; vtkm::worklet::DispatcherMapField, Device>(MemSet(zero)) .Invoke(counters); - vtkm::exec::AtomicArray atomicCounters(counters); + vtkm::cont::AtomicArray atomicCounters(counters); vtkm::worklet::DispatcherMapField, Device>( diff --git a/vtkm/worklet/testing/UnitTestWorkletMapFieldWholeArray.cxx b/vtkm/worklet/testing/UnitTestWorkletMapFieldWholeArray.cxx index cb7137241..060a34a05 100644 --- a/vtkm/worklet/testing/UnitTestWorkletMapFieldWholeArray.cxx +++ b/vtkm/worklet/testing/UnitTestWorkletMapFieldWholeArray.cxx @@ -163,7 +163,7 @@ void TestWorkletMapFieldExecArg() std::cout << "--- Worklet accepting atomics." << std::endl; vtkm::testing::Testing::TryTypes(map_whole_array::DoTestAtomicArrayWorklet(), - vtkm::exec::AtomicArrayTypeListTag()); + vtkm::cont::AtomicArrayTypeListTag()); } } // anonymous namespace