Skip to content

Commit dcd5954

Browse files
author
Alexander Batashev
authored
1 parent 97ec125 commit dcd5954

File tree

8 files changed

+123
-13
lines changed

8 files changed

+123
-13
lines changed

sycl/include/CL/sycl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <CL/sycl/accessor.hpp>
2020
#include <CL/sycl/aspects.hpp>
2121
#include <CL/sycl/atomic.hpp>
22+
#include <CL/sycl/atomic_fence.hpp>
2223
#include <CL/sycl/backend.hpp>
2324
#include <CL/sycl/buffer.hpp>
2425
#include <CL/sycl/builtins.hpp>

sycl/include/CL/sycl/ONEAPI/atomic_fence.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace detail {
2323
using namespace cl::sycl::detail;
2424
}
2525

26+
__SYCL2020_DEPRECATED("use sycl::atomic_fence instead")
2627
static inline void atomic_fence(memory_order order, memory_scope scope) {
2728
#ifdef __SYCL_DEVICE_ONLY__
2829
auto SPIRVOrder = detail::spirv::getMemorySemanticsMask(order);

sycl/include/CL/sycl/atomic.hpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <CL/__spirv/spirv_ops.hpp>
1212
#include <CL/sycl/access/access.hpp>
1313
#include <CL/sycl/detail/helpers.hpp>
14+
#include <CL/sycl/memory_enums.hpp>
1415

1516
#ifndef __SYCL_DEVICE_ONLY__
1617
#include <atomic>
@@ -26,8 +27,6 @@
2627
__SYCL_INLINE_NAMESPACE(cl) {
2728
namespace sycl {
2829

29-
enum class memory_order : int { relaxed = 0 };
30-
3130
// Forward declaration
3231
template <typename pointerT, access::address_space addressSpace>
3332
class multi_ptr;
@@ -82,9 +81,6 @@ static inline std::memory_order
8281
getStdMemoryOrder(__spv::MemorySemanticsMask::Flag) {
8382
return std::memory_order_relaxed;
8483
}
85-
static inline std::memory_order getStdMemoryOrder(::cl::sycl::memory_order) {
86-
return std::memory_order_relaxed;
87-
}
8884
} // namespace detail
8985
} // namespace sycl
9086
} // __SYCL_INLINE_NAMESPACE(cl)

sycl/include/CL/sycl/atomic_fence.hpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//==--------- atomic_fence.hpp - SYCL 2020 atomic_fence --------------------==//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#pragma once
10+
11+
#include <CL/__spirv/spirv_ops.hpp>
12+
#include <CL/sycl/detail/spirv.hpp>
13+
#include <CL/sycl/memory_enums.hpp>
14+
15+
#ifndef __SYCL_DEVICE_ONLY__
16+
#include <atomic>
17+
#endif
18+
19+
__SYCL_INLINE_NAMESPACE(cl) {
20+
namespace sycl {
21+
22+
static inline void atomic_fence(memory_order order, memory_scope scope) {
23+
#ifdef __SYCL_DEVICE_ONLY__
24+
auto SPIRVOrder = detail::spirv::getMemorySemanticsMask(order);
25+
auto SPIRVScope = detail::spirv::getScope(scope);
26+
__spirv_MemoryBarrier(SPIRVScope, static_cast<uint32_t>(SPIRVOrder));
27+
#else
28+
(void)scope;
29+
auto StdOrder = detail::getStdMemoryOrder(order);
30+
atomic_thread_fence(StdOrder);
31+
#endif
32+
}
33+
34+
} // namespace sycl
35+
} // __SYCL_INLINE_NAMESPACE(cl)

sycl/include/CL/sycl/detail/spirv.hpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <CL/sycl/detail/helpers.hpp>
1616
#include <CL/sycl/detail/type_traits.hpp>
1717
#include <CL/sycl/id.hpp>
18+
#include <CL/sycl/memory_enums.hpp>
1819

1920
#ifdef __SYCL_DEVICE_ONLY__
2021
__SYCL_INLINE_NAMESPACE(cl) {
@@ -216,24 +217,28 @@ EnableIfGenericBroadcast<T> GroupBroadcast(T x, id<Dimensions> local_id) {
216217

217218
// Single happens-before means semantics should always apply to all spaces
218219
// Although consume is unsupported, forwarding to acquire is valid
219-
static inline constexpr __spv::MemorySemanticsMask::Flag
220-
getMemorySemanticsMask(ONEAPI::memory_order Order) {
220+
template <typename T>
221+
static inline constexpr typename std::enable_if<
222+
std::is_same<T, sycl::ONEAPI::memory_order>::value ||
223+
std::is_same<T, sycl::memory_order>::value,
224+
__spv::MemorySemanticsMask::Flag>::type
225+
getMemorySemanticsMask(T Order) {
221226
__spv::MemorySemanticsMask::Flag SpvOrder = __spv::MemorySemanticsMask::None;
222227
switch (Order) {
223-
case ONEAPI::memory_order::relaxed:
228+
case T::relaxed:
224229
SpvOrder = __spv::MemorySemanticsMask::None;
225230
break;
226-
case ONEAPI::memory_order::__consume_unsupported:
227-
case ONEAPI::memory_order::acquire:
231+
case T::__consume_unsupported:
232+
case T::acquire:
228233
SpvOrder = __spv::MemorySemanticsMask::Acquire;
229234
break;
230-
case ONEAPI::memory_order::release:
235+
case T::release:
231236
SpvOrder = __spv::MemorySemanticsMask::Release;
232237
break;
233-
case ONEAPI::memory_order::acq_rel:
238+
case T::acq_rel:
234239
SpvOrder = __spv::MemorySemanticsMask::AcquireRelease;
235240
break;
236-
case ONEAPI::memory_order::seq_cst:
241+
case T::seq_cst:
237242
SpvOrder = __spv::MemorySemanticsMask::SequentiallyConsistent;
238243
break;
239244
}

sycl/include/CL/sycl/memory_enums.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,51 @@ __SYCL_INLINE_NAMESPACE(cl) {
1414
namespace sycl {
1515
using ONEAPI::memory_scope;
1616

17+
enum class memory_order : int {
18+
relaxed = 0,
19+
acquire = 1,
20+
__consume_unsupported =
21+
2, // helps optimizer when mapping to std::memory_order
22+
release = 3,
23+
acq_rel = 4,
24+
seq_cst = 5
25+
};
26+
1727
#if __cplusplus >= 201703L
1828
inline constexpr auto memory_scope_work_item = memory_scope::work_item;
1929
inline constexpr auto memory_scope_sub_group = memory_scope::sub_group;
2030
inline constexpr auto memory_scope_work_group = memory_scope::work_group;
2131
inline constexpr auto memory_scope_device = memory_scope::device;
2232
inline constexpr auto memory_scope_system = memory_scope::system;
33+
34+
inline constexpr auto memory_order_relaxed = memory_order::relaxed;
35+
inline constexpr auto memory_order_acquire = memory_order::acquire;
36+
inline constexpr auto memory_order_release = memory_order::release;
37+
inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;
38+
inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;
2339
#endif
40+
41+
#ifndef __SYCL_DEVICE_ONLY__
42+
namespace detail {
43+
44+
static constexpr std::memory_order getStdMemoryOrder(sycl::memory_order order) {
45+
switch (order) {
46+
case memory_order::relaxed:
47+
return std::memory_order_relaxed;
48+
case memory_order::__consume_unsupported:
49+
return std::memory_order_consume;
50+
case memory_order::acquire:
51+
return std::memory_order_acquire;
52+
case memory_order::release:
53+
return std::memory_order_release;
54+
case memory_order::acq_rel:
55+
return std::memory_order_acq_rel;
56+
case memory_order::seq_cst:
57+
return std::memory_order_seq_cst;
58+
}
59+
}
60+
61+
} // namespace detail
62+
#endif // __SYCL_DEVICE_ONLY__
2463
} // namespace sycl
2564
} // __SYCL_INLINE_NAMESPACE(cl)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %clangxx -fsycl-device-only -fsycl-unnamed-lambda -S -Xclang -emit-llvm %s -o - | FileCheck %s
2+
3+
#include <sycl/sycl.hpp>
4+
5+
int main() {
6+
sycl::queue Q;
7+
8+
Q.single_task([] {
9+
// CHECK: tail call spir_func void @_Z21__spirv_MemoryBarrierjj(i32 2, i32 896) #2
10+
sycl::atomic_fence(sycl::memory_order::relaxed,
11+
sycl::memory_scope::work_group);
12+
// CHECK: tail call spir_func void @_Z21__spirv_MemoryBarrierjj(i32 2, i32 898) #2
13+
sycl::atomic_fence(sycl::memory_order::acquire,
14+
sycl::memory_scope::work_group);
15+
// CHECK: tail call spir_func void @_Z21__spirv_MemoryBarrierjj(i32 2, i32 900) #2
16+
sycl::atomic_fence(sycl::memory_order::release,
17+
sycl::memory_scope::work_group);
18+
// CHECK: tail call spir_func void @_Z21__spirv_MemoryBarrierjj(i32 2, i32 904) #2
19+
sycl::atomic_fence(sycl::memory_order::acq_rel,
20+
sycl::memory_scope::work_group);
21+
// CHECK: tail call spir_func void @_Z21__spirv_MemoryBarrierjj(i32 2, i32 912) #2
22+
sycl::atomic_fence(sycl::memory_order::seq_cst,
23+
sycl::memory_scope::work_group);
24+
});
25+
Q.wait();
26+
27+
return 0;
28+
}

sycl/test/warnings/sycl_2020_deprecations.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// RUN: %clangxx %fsycl-host-only -fsyntax-only -sycl-std=1.2.1 -Xclang -verify -Xclang -verify-ignore-unexpected=note %s -o %t.out
55

66
#include <CL/sycl.hpp>
7+
#include <CL/sycl/ONEAPI/atomic_fence.hpp>
78

89
int main() {
910
cl_context ClCtx;
@@ -100,5 +101,9 @@ int main() {
100101
auto MCA = sycl::info::device::max_constant_args;
101102
(void)MCA;
102103

104+
// expected-warning@+1{{'atomic_fence' is deprecated: use sycl::atomic_fence instead}}
105+
sycl::ONEAPI::atomic_fence(sycl::ONEAPI::memory_order::relaxed,
106+
sycl::ONEAPI::memory_scope::work_group);
107+
103108
return 0;
104109
}

0 commit comments

Comments
 (0)