From 284d479ee73ee1e30f938e5781b5199c623b1475 Mon Sep 17 00:00:00 2001 From: Mark Bolstad Date: Thu, 9 Mar 2023 09:26:45 -0700 Subject: [PATCH] Switch Kokkos atomic functions to use desul library Kokkos 4 switches from their interal library based off of desul to using desul directly. This removes VTK-m's dependency on the Kokkos internal implementation (Kokkos::Impl) to using desul directly. --- docs/changelog/kokkos-atomics-fix.md | 6 ++++++ vtkm/Atomic.h | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 docs/changelog/kokkos-atomics-fix.md diff --git a/docs/changelog/kokkos-atomics-fix.md b/docs/changelog/kokkos-atomics-fix.md new file mode 100644 index 000000000..1bffbec6d --- /dev/null +++ b/docs/changelog/kokkos-atomics-fix.md @@ -0,0 +1,6 @@ +Kokkos atomic functions switched to use desul library + +Kokkos 4 switches from their interal library based off of desul to using desul directly. +This removes VTK-m's dependency on the Kokkos internal implementation (Kokkos::Impl) to +using desul directly. + diff --git a/vtkm/Atomic.h b/vtkm/Atomic.h index c6ff4398c..31a769280 100644 --- a/vtkm/Atomic.h +++ b/vtkm/Atomic.h @@ -324,6 +324,11 @@ VTKM_EXEC_CONT inline void AtomicLoadFence(vtkm::MemoryOrder order) Kokkos::memory_fence(); } } +#ifdef KOKKOS_INTERNAL_NOT_PARALLEL +#define VTKM_DESUL_MEM_SCOPE desul::MemoryScopeCaller() +#else +#define VTKM_DESUL_MEM_SCOPE desul::MemoryScopeDevice() +#endif template VTKM_EXEC_CONT inline T AtomicLoadImpl(T* const addr, vtkm::MemoryOrder order) @@ -331,17 +336,17 @@ VTKM_EXEC_CONT inline T AtomicLoadImpl(T* const addr, vtkm::MemoryOrder order) switch (order) { case vtkm::MemoryOrder::Relaxed: - return Kokkos::Impl::atomic_load(addr, Kokkos::Impl::memory_order_relaxed); + return desul::atomic_load(addr, desul::MemoryOrderRelaxed(), VTKM_DESUL_MEM_SCOPE); case vtkm::MemoryOrder::Acquire: case vtkm::MemoryOrder::Release: // Release doesn't make sense. Use Acquire. case vtkm::MemoryOrder::AcquireAndRelease: // Release doesn't make sense. Use Acquire. - return Kokkos::Impl::atomic_load(addr, Kokkos::Impl::memory_order_acquire); + return desul::atomic_load(addr, desul::MemoryOrderAcquire(), VTKM_DESUL_MEM_SCOPE); case vtkm::MemoryOrder::SequentiallyConsistent: - return Kokkos::Impl::atomic_load(addr, Kokkos::Impl::memory_order_seq_cst); + return desul::atomic_load(addr, desul::MemoryOrderSeqCst(), VTKM_DESUL_MEM_SCOPE); } // Should never reach here, but avoid compiler warnings - return Kokkos::Impl::atomic_load(addr, Kokkos::Impl::memory_order_seq_cst); + return desul::atomic_load(addr, desul::MemoryOrderSeqCst(), VTKM_DESUL_MEM_SCOPE); } template @@ -350,15 +355,15 @@ VTKM_EXEC_CONT inline void AtomicStoreImpl(T* addr, T value, vtkm::MemoryOrder o switch (order) { case vtkm::MemoryOrder::Relaxed: - Kokkos::Impl::atomic_store(addr, value, Kokkos::Impl::memory_order_relaxed); + desul::atomic_store(addr, value, desul::MemoryOrderRelaxed(), VTKM_DESUL_MEM_SCOPE); break; case vtkm::MemoryOrder::Acquire: // Acquire doesn't make sense. Use Release. case vtkm::MemoryOrder::Release: case vtkm::MemoryOrder::AcquireAndRelease: // Acquire doesn't make sense. Use Release. - Kokkos::Impl::atomic_store(addr, value, Kokkos::Impl::memory_order_release); + desul::atomic_store(addr, value, desul::MemoryOrderRelease(), VTKM_DESUL_MEM_SCOPE); break; case vtkm::MemoryOrder::SequentiallyConsistent: - Kokkos::Impl::atomic_store(addr, value, Kokkos::Impl::memory_order_seq_cst); + desul::atomic_store(addr, value, desul::MemoryOrderSeqCst(), VTKM_DESUL_MEM_SCOPE); break; } }