Skip to content

Commit d4a9254

Browse files
authored
[SYCL][ESIMD] Use intrinsic for named_barrier_signal (#12982)
We don't want to use raw_send here. I manually tested this on PVC with the required driver version. --------- Signed-off-by: Sarnie, Nick <[email protected]>
1 parent 865ed57 commit d4a9254

File tree

6 files changed

+15
-54
lines changed

6 files changed

+15
-54
lines changed

llvm/lib/SYCLLowerIR/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ if (NOT TARGET LLVMGenXIntrinsics)
1414
if (NOT DEFINED LLVMGenXIntrinsics_SOURCE_DIR)
1515
set(LLVMGenXIntrinsics_GIT_REPO https://github.com/intel/vc-intrinsics.git)
1616

17-
# Date: Dec 14, 2023
18-
# Add support for XeHPCVG platform
19-
set(LLVMGenXIntrinsics_GIT_TAG da892e1982b6c25b9a133f85b4ac97142d8a3def)
17+
# Date: 13 Feb 2024
18+
# Add an intrinsic for named barrier arrive/signal operation
19+
set(LLVMGenXIntrinsics_GIT_TAG f9c34404d0ea9abad83875a10bd48d88cea90ebd)
2020

2121
message(STATUS "vc-intrinsics repo is missing. Will try to download it from ${LLVMGenXIntrinsics_GIT_REPO}")
2222
include(FetchContent)

llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,7 @@ class ESIMDIntrinDescTable {
494494
{"dpasw", {"dpasw", {a(0), a(1), a(2), t(0)}}},
495495
{"dpasw_nosrc0", {"dpasw.nosrc0", {a(0), a(1), t(0)}}},
496496
{"nbarrier", {"nbarrier", {a(0), a(1), a(2)}}},
497-
{"raw_send_nbarrier_signal",
498-
{"raw.send.noresult", {a(0), ai1(4), a(1), a(2), a(3)}}},
497+
{"nbarrier_arrive", {"nbarrier.arrive", {a(0), a(1), a(2), a(3)}}},
499498
{"lsc_load_slm",
500499
{"lsc.load.slm",
501500
{ai1(0), c8(lsc_subopcode::load), t8(1), t8(2), t16(3), t32(4), t8(5),

llvm/test/SYCLLowerIR/esimd_lower_nbarriers.ll

Lines changed: 0 additions & 21 deletions
This file was deleted.

sycl/include/sycl/ext/intel/experimental/esimd/detail/memory_intrin.hpp

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,18 @@ __ESIMD_INTRIN void __esimd_nbarrier(uint8_t mode, uint8_t id,
4141
/// @param count - number of named barriers
4242
__ESIMD_INTRIN void __esimd_nbarrier_init(uint8_t count) __ESIMD_INTRIN_END;
4343

44-
/// Raw send signal to perform signal operation on named barriers
44+
/// Perform signal operation on named barriers
4545
/// Available only on PVC
46-
/// @tparam Ty - message element type
46+
/// @param id - barrier id
4747
///
48-
/// @tparam N - message length
48+
/// @param thread_role - thread role
4949
///
50-
/// @param is_sendc - is sendc
50+
/// @param num_producers - number of producers
5151
///
52-
/// @param extended_descriptor - extended message descriptor
53-
///
54-
/// @param descriptor - message descriptor
55-
///
56-
/// @param msg_var - source operand of send message
57-
///
58-
/// @param pred - predicate for enabled channels
59-
template <typename Ty, int N>
60-
__ESIMD_INTRIN void __esimd_raw_send_nbarrier_signal(
61-
uint32_t is_sendc, uint32_t extended_descriptor, uint32_t descriptor,
62-
__ESIMD_DNS::vector_type_t<Ty, N> msg_var,
63-
uint16_t pred = 1) __ESIMD_INTRIN_END;
52+
/// @param num_consumers - number of consumers
53+
__ESIMD_INTRIN void
54+
__esimd_nbarrier_arrive(uint8_t id, uint8_t thread_role, uint8_t num_producers,
55+
uint8_t num_consumers) __ESIMD_INTRIN_END;
6456

6557
/// 2D USM pointer block load.
6658
/// Supported platforms: PVC

sycl/include/sycl/ext/intel/experimental/esimd/memory.hpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -393,19 +393,10 @@ __ESIMD_API void named_barrier_signal(uint8_t barrier_id,
393393
uint8_t producer_consumer_mode,
394394
uint32_t num_producers,
395395
uint32_t num_consumers) {
396-
constexpr uint32_t gateway = 3;
397-
constexpr uint32_t barrier = 4;
398-
constexpr uint32_t descriptor = 1 << 25 | // Message length: 1 register
399-
0 << 12 | // Fence Data Ports: No fence
400-
barrier; // Barrier subfunction
401-
402-
__ESIMD_DNS::vector_type_t<uint32_t, 8> payload = 0;
403-
payload[2] = (num_consumers & 0xff) << 24 | (num_producers & 0xff) << 16 |
404-
producer_consumer_mode << 14 | (barrier_id & 0b11111) << 0;
405396
__esimd_fence(__ESIMD_NS::fence_mask::global_coherent_fence |
406397
__ESIMD_NS::fence_mask::local_barrier);
407-
__esimd_raw_send_nbarrier_signal<uint32_t, 8>(
408-
0 /*sendc*/, gateway, descriptor, payload, 1 /*pred*/);
398+
__esimd_nbarrier_arrive(barrier_id, producer_consumer_mode, num_producers,
399+
num_consumers);
409400
}
410401

411402
/// Create explicit scoreboard dependency to avoid device code motion

sycl/test/esimd/nbarriers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void caller(int x) {
1616
named_barrier_init<7>();
1717
named_barrier_wait(2);
1818
// CHECK: call spir_func void @_Z13__esimd_fenceh(i8 noundef zeroext 33)
19-
// CHECK-NEXT: call spir_func void @_Z32__esimd_raw_send_nbarrier_signal{{.*}}
19+
// CHECK-NEXT: call spir_func void @_Z23__esimd_nbarrier_arrive{{.*}}
2020
named_barrier_signal(0, 0, 4, 4);
2121
});
2222
}

0 commit comments

Comments
 (0)