Skip to content

Commit d3568af

Browse files
authored
[libclc][libspirv] Add generic implementation of __spirv_LocalInvocationIndex (#16783)
This allows the builtin to be called in implementation of other builtins.
1 parent 113b467 commit d3568af

File tree

6 files changed

+29
-24
lines changed

6 files changed

+29
-24
lines changed

libclc/libspirv/include/libspirv/spirv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include <libspirv/workitem/get_global_size.h>
5959
#include <libspirv/workitem/get_group_id.h>
6060
#include <libspirv/workitem/get_local_id.h>
61+
#include <libspirv/workitem/get_local_linear_id.h>
6162
#include <libspirv/workitem/get_local_size.h>
6263
#include <libspirv/workitem/get_max_sub_group_size.h>
6364
#include <libspirv/workitem/get_num_groups.h>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//===----------------------------------------------------------------------===//
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+
_CLC_DECL _CLC_OVERLOAD size_t __spirv_LocalInvocationIndex();

libclc/libspirv/lib/amdgcn-amdhsa/group/collectives.cl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -365,17 +365,6 @@ __CLC_GROUP_COLLECTIVE__DF16(_Z20__spirv_GroupFMulKHRjjDF16_,
365365
#undef __CLC_ADD
366366
#undef __CLC_MUL
367367

368-
long __clc__get_linear_local_id() {
369-
size_t id_x = __spirv_LocalInvocationId_x();
370-
size_t id_y = __spirv_LocalInvocationId_y();
371-
size_t id_z = __spirv_LocalInvocationId_z();
372-
size_t size_x = __spirv_WorkgroupSize_x();
373-
size_t size_y = __spirv_WorkgroupSize_y();
374-
size_t size_z = __spirv_WorkgroupSize_z();
375-
uint sg_size = __spirv_SubgroupMaxSize();
376-
return (id_z * size_y * size_x + id_y * size_x + id_x);
377-
}
378-
379368
long __clc__2d_to_linear_local_id(ulong2 id) {
380369
size_t size_x = __spirv_WorkgroupSize_x();
381370
size_t size_y = __spirv_WorkgroupSize_y();
@@ -396,7 +385,7 @@ long __clc__3d_to_linear_local_id(ulong3 id) {
396385
return _Z28__spirv_SubgroupShuffleINTELI##TYPE_MANGLED##ET_S0_j( \
397386
x, local_id); \
398387
} \
399-
bool source = (__clc__get_linear_local_id() == local_id); \
388+
bool source = (__spirv_LocalInvocationIndex() == local_id); \
400389
__local TYPE *scratch = __CLC_APPEND(__clc__get_group_scratch_, TYPE)(); \
401390
if (source) { \
402391
*scratch = x; \

libclc/libspirv/lib/generic/SOURCES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,5 +205,6 @@ shared/vload.cl
205205
shared/vstore.cl
206206
workitem/get_global_id.cl
207207
workitem/get_global_size.cl
208+
workitem/get_local_linear_id.cl
208209
workitem/get_num_sub_groups.cl
209210
workitem/get_sub_group_size.cl
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//===----------------------------------------------------------------------===//
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+
#include <libspirv/spirv.h>
10+
11+
_CLC_DEF _CLC_OVERLOAD size_t __spirv_LocalInvocationIndex() {
12+
return __spirv_LocalInvocationId_z() * __spirv_WorkgroupSize_y() *
13+
__spirv_WorkgroupSize_x() +
14+
__spirv_LocalInvocationId_y() * __spirv_WorkgroupSize_x() +
15+
__spirv_LocalInvocationId_x();
16+
}

libclc/libspirv/lib/ptx-nvidiacl/group/collectives.cl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -624,17 +624,6 @@ __CLC_GROUP_COLLECTIVE__DF16(_Z20__spirv_GroupFMulKHRjjDF16_,
624624
#undef __CLC_ADD
625625
#undef __CLC_MUL
626626

627-
long __clc__get_linear_local_id() {
628-
size_t id_x = __spirv_LocalInvocationId_x();
629-
size_t id_y = __spirv_LocalInvocationId_y();
630-
size_t id_z = __spirv_LocalInvocationId_z();
631-
size_t size_x = __spirv_WorkgroupSize_x();
632-
size_t size_y = __spirv_WorkgroupSize_y();
633-
size_t size_z = __spirv_WorkgroupSize_z();
634-
uint sg_size = __spirv_SubgroupMaxSize();
635-
return (id_z * size_y * size_x + id_y * size_x + id_x);
636-
}
637-
638627
long __clc__2d_to_linear_local_id(ulong2 id) {
639628
size_t size_x = __spirv_WorkgroupSize_x();
640629
size_t size_y = __spirv_WorkgroupSize_y();
@@ -654,7 +643,7 @@ long __clc__3d_to_linear_local_id(ulong3 id) {
654643
if (scope == Subgroup) { \
655644
return __clc__SubgroupShuffle(x, local_id); \
656645
} \
657-
bool source = (__clc__get_linear_local_id() == local_id); \
646+
bool source = (__spirv_LocalInvocationIndex() == local_id); \
658647
__local TYPE *scratch = __CLC_APPEND(__clc__get_group_scratch_, TYPE)(); \
659648
if (source) { \
660649
*scratch = x; \

0 commit comments

Comments
 (0)