//============================================================================ // 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS). // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 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_cont_internal_DeviceAdapterTag_h #define vtk_m_cont_internal_DeviceAdapterTag_h #include #include #include #include #include #include #define VTKM_DEVICE_ADAPTER_ERROR -2 #define VTKM_DEVICE_ADAPTER_UNDEFINED -1 #define VTKM_DEVICE_ADAPTER_SERIAL 1 #define VTKM_DEVICE_ADAPTER_CUDA 2 #define VTKM_DEVICE_ADAPTER_TBB 3 #define VTKM_DEVICE_ADAPTER_OPENMP 4 //VTKM_DEVICE_ADAPTER_TestAlgorithmGeneral 7 #define VTKM_MAX_DEVICE_ADAPTER_ID 8 #define VTKM_DEVICE_ADAPTER_ANY 127 namespace vtkm { namespace cont { using DeviceAdapterNameType = std::string; struct DeviceAdapterId { constexpr bool operator==(DeviceAdapterId other) const { return this->Value == other.Value; } constexpr bool operator!=(DeviceAdapterId other) const { return this->Value != other.Value; } constexpr bool operator<(DeviceAdapterId other) const { return this->Value < other.Value; } constexpr bool IsValueValid() const { return this->Value > 0 && this->Value < VTKM_MAX_DEVICE_ADAPTER_ID; } constexpr vtkm::Int8 GetValue() const { return this->Value; } VTKM_CONT_EXPORT DeviceAdapterNameType GetName() const; protected: friend DeviceAdapterId make_DeviceAdapterId(vtkm::Int8 id); friend DeviceAdapterId make_DeviceAdapterIdFromName(const std::string& name); constexpr explicit DeviceAdapterId(vtkm::Int8 id) : Value(id) { } private: vtkm::Int8 Value; }; inline DeviceAdapterId make_DeviceAdapterIdFromName(const std::string& name) { vtkm::Int8 deviceId(VTKM_DEVICE_ADAPTER_ERROR); if (name == "SERIAL") { deviceId = VTKM_DEVICE_ADAPTER_SERIAL; } else if (name == "CUDA") { deviceId = VTKM_DEVICE_ADAPTER_CUDA; } else if (name == "TBB") { deviceId = VTKM_DEVICE_ADAPTER_TBB; } else if (name == "OPENMP") { deviceId = VTKM_DEVICE_ADAPTER_OPENMP; } return DeviceAdapterId(deviceId); } inline DeviceAdapterId make_DeviceAdapterId(vtkm::Int8 id) { return DeviceAdapterId(id); } template struct DeviceAdapterTraits; } } /// Creates a tag named vtkm::cont::DeviceAdapterTagName and associated MPL /// structures to use this tag. Always use this macro (in the base namespace) /// when creating a device adapter. #define VTKM_VALID_DEVICE_ADAPTER(Name, Id) \ namespace vtkm \ { \ namespace cont \ { \ struct VTKM_ALWAYS_EXPORT DeviceAdapterTag##Name : DeviceAdapterId \ { \ constexpr DeviceAdapterTag##Name() \ : DeviceAdapterId(Id) \ { \ } \ static constexpr bool IsEnabled = true; \ }; \ template <> \ struct DeviceAdapterTraits \ { \ static DeviceAdapterNameType GetName() { return DeviceAdapterNameType(#Name); } \ }; \ } \ } /// Marks the tag named vtkm::cont::DeviceAdapterTagName and associated /// structures as invalid to use. Always use this macro (in the base namespace) /// when creating a device adapter. #define VTKM_INVALID_DEVICE_ADAPTER(Name, Id) \ namespace vtkm \ { \ namespace cont \ { \ struct VTKM_ALWAYS_EXPORT DeviceAdapterTag##Name : DeviceAdapterId \ { \ constexpr DeviceAdapterTag##Name() \ : DeviceAdapterId(Id) \ { \ } \ static constexpr bool IsEnabled = false; \ }; \ template <> \ struct DeviceAdapterTraits \ { \ static DeviceAdapterNameType GetName() { return DeviceAdapterNameType(#Name); } \ }; \ } \ } // Represents when using TryExecute that the functor // can be executed on any device instead of a specific // one VTKM_VALID_DEVICE_ADAPTER(Any, VTKM_DEVICE_ADAPTER_ANY) VTKM_INVALID_DEVICE_ADAPTER(Undefined, VTKM_DEVICE_ADAPTER_UNDEFINED) /// Checks that the argument is a proper device adapter tag. This is a handy /// concept check for functions and classes to make sure that a template /// argument is actually a device adapter tag. (You can get weird errors /// elsewhere in the code when a mistake is made.) /// #define VTKM_IS_DEVICE_ADAPTER_TAG(tag) \ static_assert(std::is_base_of::value && \ !std::is_same::value, \ "Provided type is not a valid VTK-m device adapter tag.") #endif //vtk_m_cont_internal_DeviceAdapterTag_h