alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
memFence.hpp
Go to the documentation of this file.
1/* Copyright 2025 Mehmet Yusufoglu, René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
12#include "alpaka/onAcc/Acc.hpp"
15
16// Top-level guard needed because including sycl headers is needed
17#if ALPAKA_LANG_SYCL
18# include <sycl/sycl.hpp>
19
20# include <type_traits>
21
22namespace alpaka::onAcc::internalCompute
23{
24 template<alpaka::concepts::Api T_Api, concepts::Scope T_Scope, concepts::MemoryOrder T_Order>
25 requires(std::is_base_of_v<api::GenericSycl<T_Api>, T_Api>)
26 struct MemoryFence::Op<T_Api, T_Scope, T_Order>
27 {
28 constexpr void operator()(onAcc::concepts::Acc auto const&, T_Scope const, T_Order const order) const
29 {
30 if constexpr(std::is_same_v<T_Scope, scope::Block>)
31 {
32 sycl::atomic_fence(MemOrderSycl::get(order), sycl::memory_scope::work_group);
33 }
34 else if constexpr(std::is_same_v<T_Scope, scope::Device>)
35 {
36 sycl::atomic_fence(MemOrderSycl::get(order), sycl::memory_scope::device);
37 }
38 else if constexpr(std::is_same_v<T_Scope, scope::System>)
39 {
40 // System fences map to device scope for SYCL backends
41 sycl::atomic_fence(MemOrderSycl::get(order), sycl::memory_scope::system);
42 }
43 }
44 };
45} // namespace alpaka::onAcc::internalCompute
46#endif // ALPAKA_LANG_SYCL