vtk-m2/vtkm/cont/testing/UnitTestRuntimeDeviceInformation.cxx
Kenneth Moreland 163d591795 Add DEVICE_SOURCES to vtkm_unit_tests
The `vtkm_unit_tests` function in the CMake build now allows you to specify
which files need to be compiled with a device compiler using the
`DEVICE_SOURCES` argument. Previously, the only way to specify that unit
tests needed to be compiled with a device compiler was to use the
`ALL_BACKENDS` argument, which would automatically compile everything with
the device compiler as well as test the code on all backends.
`ALL_BACKENDS` is still supported, but it no longer changes the sources to
be compiled with the device compiler.
2022-07-08 06:28:51 -06:00

114 lines
3.7 KiB
C++

//============================================================================
// 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.
//============================================================================
#include <vtkm/cont/RuntimeDeviceInformation.h>
#include <vtkm/cont/DeviceAdapterTag.h>
#include <vtkm/cont/testing/Testing.h>
namespace
{
template <bool>
struct DoesExist;
template <typename DeviceAdapterTag>
void detect_if_exists(DeviceAdapterTag tag)
{
using DeviceAdapterTraits = vtkm::cont::DeviceAdapterTraits<DeviceAdapterTag>;
std::cout << "testing runtime support for " << DeviceAdapterTraits::GetName() << std::endl;
DoesExist<tag.IsEnabled> exist;
exist.Exist(tag);
}
template <>
struct DoesExist<false>
{
template <typename DeviceAdapterTag>
void Exist(DeviceAdapterTag) const
{
//runtime information for this device should return false
vtkm::cont::RuntimeDeviceInformation runtime;
VTKM_TEST_ASSERT(runtime.Exists(DeviceAdapterTag()) == false,
"A backend with zero compile time support, can't have runtime support");
}
void Exist(vtkm::cont::DeviceAdapterTagCuda) const
{
//Since we are in a C++ compilation unit the Device Adapter
//trait should be false. But CUDA could still be enabled.
//That is why we check VTKM_ENABLE_CUDA.
vtkm::cont::RuntimeDeviceInformation runtime;
#ifdef VTKM_ENABLE_CUDA
VTKM_TEST_ASSERT(runtime.Exists(vtkm::cont::DeviceAdapterTagCuda()) == true,
"with cuda backend enabled, runtime support should be enabled");
#else
VTKM_TEST_ASSERT(runtime.Exists(vtkm::cont::DeviceAdapterTagCuda()) == false,
"with cuda backend disabled, runtime support should be disabled");
#endif
}
#ifdef VTKM_KOKKOS_CUDA
void Exist(vtkm::cont::DeviceAdapterTagKokkos) const
{
//Since we are in a C++ compilation unit the Device Adapter
//trait should be false. But Kokkos could still be enabled.
//That is why we check VTKM_ENABLE_KOKKOS.
vtkm::cont::RuntimeDeviceInformation runtime;
#ifdef VTKM_ENABLE_KOKKOS
VTKM_TEST_ASSERT(runtime.Exists(vtkm::cont::DeviceAdapterTagKokkos()) == true,
"with kokkos backend enabled, runtime support should be enabled");
#else
VTKM_TEST_ASSERT(runtime.Exists(vtkm::cont::DeviceAdapterTagKokkos()) == false,
"with kokkos backend disabled, runtime support should be disabled");
#endif
}
#endif
};
template <>
struct DoesExist<true>
{
template <typename DeviceAdapterTag>
void Exist(DeviceAdapterTag) const
{
//runtime information for this device should return true
vtkm::cont::RuntimeDeviceInformation runtime;
VTKM_TEST_ASSERT(runtime.Exists(DeviceAdapterTag()) == true,
"A backend with compile time support, should have runtime support");
}
};
void Detection()
{
using SerialTag = ::vtkm::cont::DeviceAdapterTagSerial;
using OpenMPTag = ::vtkm::cont::DeviceAdapterTagOpenMP;
using TBBTag = ::vtkm::cont::DeviceAdapterTagTBB;
using CudaTag = ::vtkm::cont::DeviceAdapterTagCuda;
using KokkosTag = ::vtkm::cont::DeviceAdapterTagKokkos;
//Verify that for each device adapter we compile code for, that it
//has valid runtime support.
detect_if_exists(SerialTag());
detect_if_exists(OpenMPTag());
detect_if_exists(CudaTag());
detect_if_exists(TBBTag());
detect_if_exists(KokkosTag());
}
} // anonymous namespace
int UnitTestRuntimeDeviceInformation(int argc, char* argv[])
{
return vtkm::cont::testing::Testing::Run(Detection, argc, argv);
}