Skip to content

[SYCL] Use SPIR-V built-in function call for all targets and add BuiltIn to the name #19359

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: sycl
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions libclc/libspirv/include/libspirv/async/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
#define CLC_ASYNC_COMMON

#define SET_GROUP_SIZE_AND_ID(SIZE, ID) \
SIZE = __spirv_WorkgroupSize_x() * __spirv_WorkgroupSize_y() * \
__spirv_WorkgroupSize_z(); \
ID = (__spirv_WorkgroupSize_y() * __spirv_WorkgroupSize_x() * \
__spirv_LocalInvocationId_z()) + \
(__spirv_WorkgroupSize_x() * __spirv_LocalInvocationId_y()) + \
__spirv_LocalInvocationId_x();
SIZE = __spirv_BuiltInWorkgroupSize(0) * __spirv_BuiltInWorkgroupSize(1) * \
__spirv_BuiltInWorkgroupSize(2); \
ID = (__spirv_BuiltInWorkgroupSize(1) * __spirv_BuiltInWorkgroupSize(0) * \
__spirv_BuiltInLocalInvocationId(2)) + \
(__spirv_BuiltInWorkgroupSize(0) * \
__spirv_BuiltInLocalInvocationId(1)) + \
__spirv_BuiltInLocalInvocationId(0);

// Macro used by all data types, for generic and nvidia, for async copy when
// arch < sm80
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalOffset_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalOffset_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalOffset_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInGlobalOffset(int);
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalSize_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalSize_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_GlobalSize_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInGlobalSize(int);
4 changes: 1 addition & 3 deletions libclc/libspirv/include/libspirv/workitem/get_group_id.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupId_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupId_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupId_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInWorkgroupId(int);
4 changes: 1 addition & 3 deletions libclc/libspirv/include/libspirv/workitem/get_local_id.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_LocalInvocationId_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_LocalInvocationId_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_LocalInvocationId_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInLocalInvocationId(int);
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_LocalInvocationIndex();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInLocalInvocationIndex();
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupSize_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupSize_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_WorkgroupSize_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInWorkgroupSize(int);
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupMaxSize();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupMaxSize();
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DECL _CLC_OVERLOAD size_t __spirv_NumWorkgroups_x();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_NumWorkgroups_y();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_NumWorkgroups_z();
_CLC_DECL _CLC_OVERLOAD size_t __spirv_BuiltInNumWorkgroups(int);
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DEF _CLC_OVERLOAD uint __spirv_NumSubgroups();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInNumSubgroups();
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupId();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupId();
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupLocalInvocationId();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupLocalInvocationId();
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
//
//===----------------------------------------------------------------------===//

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupSize();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupSize();
20 changes: 8 additions & 12 deletions libclc/libspirv/lib/amdgcn-amdhsa/assert/__assert_fail.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,9 @@ declare i64 @__ockl_fprintf_stderr_begin() local_unnamed_addr
declare i64 @__ockl_fprintf_append_string_n(i64, i8* readonly, i64, i32) local_unnamed_addr
declare i64 @__ockl_fprintf_append_args(i64, i32, i64, i64, i64, i64, i64, i64, i64, i32) local_unnamed_addr

declare dso_local i64 @_Z28__spirv_GlobalInvocationId_xv() local_unnamed_addr
declare dso_local i64 @_Z28__spirv_GlobalInvocationId_yv() local_unnamed_addr
declare dso_local i64 @_Z28__spirv_GlobalInvocationId_zv() local_unnamed_addr
declare dso_local i64 @_Z33__spirv_BuiltInGlobalInvocationIdi(i32) local_unnamed_addr

declare dso_local i64 @_Z27__spirv_LocalInvocationId_xv() local_unnamed_addr
declare dso_local i64 @_Z27__spirv_LocalInvocationId_yv() local_unnamed_addr
declare dso_local i64 @_Z27__spirv_LocalInvocationId_zv() local_unnamed_addr
declare dso_local i64 @_Z32__spirv_BuiltInLocalInvocationIdi(i32) local_unnamed_addr

define dso_local hidden noundef i64 @__strlen_assert(i8* noundef %str) local_unnamed_addr {
entry:
Expand Down Expand Up @@ -50,12 +46,12 @@ entry:
%msg.3 = call i64 @__ockl_fprintf_append_args(i64 %msg.2, i32 1, i64 %line.i64, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
%len.func = call i64 @__strlen_assert(i8* %function)
%msg.4 = call i64 @__ockl_fprintf_append_string_n(i64 %msg.3, i8* readonly %function, i64 %len.func, i32 0)
%gidx = tail call i64 @_Z28__spirv_GlobalInvocationId_xv()
%gidy = tail call i64 @_Z28__spirv_GlobalInvocationId_yv()
%gidz = tail call i64 @_Z28__spirv_GlobalInvocationId_zv()
%lidx = tail call i64 @_Z27__spirv_LocalInvocationId_xv()
%lidy = tail call i64 @_Z27__spirv_LocalInvocationId_yv()
%lidz = tail call i64 @_Z27__spirv_LocalInvocationId_zv()
%gidx = tail call i64 @_Z33__spirv_BuiltInGlobalInvocationIdi(i32 0)
%gidy = tail call i64 @_Z33__spirv_BuiltInGlobalInvocationIdi(i32 1)
%gidz = tail call i64 @_Z33__spirv_BuiltInGlobalInvocationIdi(i32 2)
%lidx = tail call i64 @_Z32__spirv_BuiltInLocalInvocationIdi(i32 0)
%lidy = tail call i64 @_Z32__spirv_BuiltInLocalInvocationIdi(i32 1)
%lidz = tail call i64 @_Z32__spirv_BuiltInLocalInvocationIdi(i32 2)
%msg.5 = call i64 @__ockl_fprintf_append_args(i64 %msg.4, i32 6, i64 %gidx, i64 %gidy, i64 %gidz, i64 %lidx, i64 %lidy, i64 %lidz, i64 0, i32 0)
%len.assertion = call i64 @__strlen_assert(i8* %assertion)
%msg.6 = call i64 @__ockl_fprintf_append_string_n(i64 %msg.4, i8* readonly %assertion, i64 %len.assertion, i32 1)
Expand Down
29 changes: 15 additions & 14 deletions libclc/libspirv/lib/amdgcn-amdhsa/group/collectives.cl
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ __clc__get_group_scratch_double() __asm("__clc__get_group_scratch_double");
#define __CLC_LOGICAL_AND(x, y) (x && y)

#define __CLC_SUBGROUP_COLLECTIVE_BODY(OP, TYPE, IDENTITY) \
uint sg_lid = __spirv_SubgroupLocalInvocationId(); \
uint sg_lid = __spirv_BuiltInSubgroupLocalInvocationId(); \
/* Can't use XOR/butterfly shuffles; some lanes may be inactive */ \
for (int o = 1; o < __spirv_SubgroupMaxSize(); o *= 2) { \
for (int o = 1; o < __spirv_BuiltInSubgroupMaxSize(); o *= 2) { \
TYPE contribution = __spirv_SubgroupShuffleUpINTEL(x, x, o); \
bool inactive = (sg_lid < o); \
contribution = (inactive) ? IDENTITY : contribution; \
Expand All @@ -62,7 +62,8 @@ __clc__get_group_scratch_double() __asm("__clc__get_group_scratch_double");
/* For Reduce, broadcast result from highest active lane */ \
TYPE result; \
if (op == Reduce) { \
result = __spirv_SubgroupShuffleINTEL(x, __spirv_SubgroupSize() - 1); \
result = \
__spirv_SubgroupShuffleINTEL(x, __spirv_BuiltInSubgroupSize() - 1); \
*carry = result; \
} /* For InclusiveScan, use results as computed */ \
else if (op == InclusiveScan) { \
Expand Down Expand Up @@ -171,18 +172,18 @@ __CLC_SUBGROUP_COLLECTIVE(LogicalAndKHR, __CLC_LOGICAL_AND, bool, true)

#define __CLC_GROUP_COLLECTIVE_INNER(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) \
_CLC_DEF _CLC_OVERLOAD _CLC_CONVERGENT TYPE __CLC_APPEND( \
__spirv_Group, SPIRV_NAME)(int scope, int op, TYPE x) { \
__spirv_Group, SPIRV_NAME)(int scope, int op, TYPE x) { \
TYPE carry = IDENTITY; \
/* Perform GroupOperation within sub-group */ \
TYPE sg_x = __CLC_APPEND(__clc__Subgroup, CLC_NAME)(op, x, &carry); \
if (scope == Subgroup) { \
return sg_x; \
} \
__local TYPE *scratch = __CLC_APPEND(__clc__get_group_scratch_, TYPE)(); \
uint sg_id = __spirv_SubgroupId(); \
uint num_sg = __spirv_NumSubgroups(); \
uint sg_lid = __spirv_SubgroupLocalInvocationId(); \
uint sg_size = __spirv_SubgroupSize(); \
uint sg_id = __spirv_BuiltInSubgroupId(); \
uint num_sg = __spirv_BuiltInNumSubgroups(); \
uint sg_lid = __spirv_BuiltInSubgroupLocalInvocationId(); \
uint sg_size = __spirv_BuiltInSubgroupSize(); \
/* Share carry values across sub-groups */ \
if (sg_lid == sg_size - 1) { \
scratch[sg_id] = carry; \
Expand Down Expand Up @@ -329,15 +330,15 @@ __CLC_GROUP_COLLECTIVE(LogicalAndKHR, __CLC_LOGICAL_AND, bool, true)
#undef __CLC_MUL

long __clc__2d_to_linear_local_id(ulong2 id) {
size_t size_x = __spirv_WorkgroupSize_x();
size_t size_y = __spirv_WorkgroupSize_y();
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
return (id.y * size_x + id.x);
}

long __clc__3d_to_linear_local_id(ulong3 id) {
size_t size_x = __spirv_WorkgroupSize_x();
size_t size_y = __spirv_WorkgroupSize_y();
size_t size_z = __spirv_WorkgroupSize_z();
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
size_t size_z = __spirv_BuiltInWorkgroupSize(2);
return (id.z * size_y * size_x + id.y * size_x + id.x);
}

Expand All @@ -347,7 +348,7 @@ long __clc__3d_to_linear_local_id(ulong3 id) {
if (scope == Subgroup) { \
return __spirv_SubgroupShuffleINTEL(x, local_id); \
} \
bool source = (__spirv_LocalInvocationIndex() == local_id); \
bool source = (__spirv_BuiltInLocalInvocationIndex() == local_id); \
__local TYPE *scratch = __CLC_APPEND(__clc__get_group_scratch_, TYPE)(); \
if (source) { \
*scratch = x; \
Expand Down
4 changes: 2 additions & 2 deletions libclc/libspirv/lib/amdgcn-amdhsa/misc/sub_group_shuffle.cl
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@

#include <libspirv/spirv.h>

#define SELF __spirv_SubgroupLocalInvocationId();
#define SUBGROUP_SIZE __spirv_SubgroupMaxSize()
#define SELF __spirv_BuiltInSubgroupLocalInvocationId();
#define SUBGROUP_SIZE __spirv_BuiltInSubgroupMaxSize()

// Shuffle
_CLC_OVERLOAD _CLC_DEF int
Expand Down
43 changes: 25 additions & 18 deletions libclc/libspirv/lib/amdgcn-amdhsa/workitem/get_global_offset.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,35 @@
; Function Attrs: nounwind readnone speculatable
declare i32 addrspace(5)* @llvm.amdgcn.implicit.offset()

define hidden i64 @_Z22__spirv_GlobalOffset_xv() nounwind alwaysinline {
define hidden i64 @_Z27__spirv_BuiltInGlobalOffseti(i32 %dim) nounwind alwaysinline {
entry:
switch i32 %dim, label %return [
i32 0, label %sw.bb
i32 1, label %sw.bb1
i32 2, label %sw.bb3
]

sw.bb: ; preds = %entry
%0 = tail call i32 addrspace(5)* @llvm.amdgcn.implicit.offset()
%1 = load i32, i32 addrspace(5)* %0, align 4
%zext = zext i32 %1 to i64
ret i64 %zext
}
br label %return

define hidden i64 @_Z22__spirv_GlobalOffset_yv() nounwind alwaysinline {
entry:
%0 = tail call i32 addrspace(5)* @llvm.amdgcn.implicit.offset()
%arrayidx = getelementptr inbounds i32, i32 addrspace(5)* %0, i64 1
%1 = load i32, i32 addrspace(5)* %arrayidx, align 4
%zext = zext i32 %1 to i64
ret i64 %zext
}
sw.bb1: ; preds = %entry
%2 = tail call i32 addrspace(5)* @llvm.amdgcn.implicit.offset()
%arrayidx = getelementptr inbounds i32, i32 addrspace(5)* %2, i64 1
%3 = load i32, i32 addrspace(5)* %arrayidx, align 4
%zext2 = zext i32 %3 to i64
br label %return

define hidden i64 @_Z22__spirv_GlobalOffset_zv() nounwind alwaysinline {
entry:
%0 = tail call i32 addrspace(5)* @llvm.amdgcn.implicit.offset()
%arrayidx = getelementptr inbounds i32, i32 addrspace(5)* %0, i64 2
%1 = load i32, i32 addrspace(5)* %arrayidx, align 4
%zext = zext i32 %1 to i64
ret i64 %zext
sw.bb3: ; preds = %entry
%4 = tail call i32 addrspace(5)* @llvm.amdgcn.implicit.offset()
%arrayidx2 = getelementptr inbounds i32, i32 addrspace(5)* %4, i64 2
%5 = load i32, i32 addrspace(5)* %arrayidx2, align 4
%zext3 = zext i32 %5 to i64
br label %return

return: ; preds = %entry, %sw.bb3, %sw.bb1, %sw.bb
%retval = phi i64 [ %zext, %sw.bb ], [ %zext2, %sw.bb1 ], [ %zext3, %sw.bb3 ], [ 0, %entry ]
ret i64 %retval
}
19 changes: 9 additions & 10 deletions libclc/libspirv/lib/amdgcn-amdhsa/workitem/get_global_size.cl
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,16 @@ CONST_AS uchar *
__clc_amdgcn_dispatch_ptr(void) __asm("llvm.amdgcn.dispatch.ptr");
#endif

_CLC_DEF _CLC_OVERLOAD size_t __spirv_GlobalSize_x() {
CONST_AS uint * ptr = (CONST_AS uint *) __dispatch_ptr();
_CLC_DEF _CLC_OVERLOAD size_t __spirv_BuiltInGlobalSize(int dim) {
CONST_AS uint *ptr = (CONST_AS uint *)__dispatch_ptr();
switch (dim) {
case 0:
return ptr[3];
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_GlobalSize_y() {
CONST_AS uint * ptr = (CONST_AS uint *) __dispatch_ptr();
case 1:
return ptr[4];
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_GlobalSize_z() {
CONST_AS uint * ptr = (CONST_AS uint *) __dispatch_ptr();
case 2:
return ptr[5];
default:
return 1;
}
}
19 changes: 9 additions & 10 deletions libclc/libspirv/lib/amdgcn-amdhsa/workitem/get_local_size.cl
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,16 @@ __clc_amdgcn_dispatch_ptr(void) __asm("llvm.amdgcn.dispatch.ptr");

// Mimic `EmitAMDGPUWorkGroupSize` in `clang/lib/CodeGen/CGBuiltin.cpp`.

_CLC_DEF _CLC_OVERLOAD size_t __spirv_WorkgroupSize_x() {
CONST_AS ushort * ptr = (CONST_AS ushort *) __dispatch_ptr();
_CLC_DEF _CLC_OVERLOAD size_t __spirv_BuiltInWorkgroupSize(int dim) {
CONST_AS ushort *ptr = (CONST_AS ushort *)__dispatch_ptr();
switch (dim) {
case 0:
return ptr[2];
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_WorkgroupSize_y() {
CONST_AS ushort * ptr = (CONST_AS ushort *) __dispatch_ptr();
case 1:
return ptr[3];
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_WorkgroupSize_z() {
CONST_AS ushort * ptr = (CONST_AS ushort *) __dispatch_ptr();
case 2:
return ptr[4];
default:
return 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
// 32.
extern constant unsigned char __oclc_wavefrontsize64;

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupMaxSize() {
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupMaxSize() {
if (__oclc_wavefrontsize64 == 1) {
return 64;
}
Expand Down
29 changes: 4 additions & 25 deletions libclc/libspirv/lib/amdgcn-amdhsa/workitem/get_num_groups.cl
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,11 @@

#include <libspirv/spirv.h>

_CLC_DEF _CLC_OVERLOAD size_t __spirv_NumWorkgroups_x() {
size_t global_size = __spirv_GlobalSize_x();
size_t local_size = __spirv_WorkgroupSize_x();
_CLC_DEF _CLC_OVERLOAD size_t __spirv_BuiltInNumWorkgroups(int dim) {
size_t global_size = __spirv_BuiltInGlobalSize(dim);
size_t local_size = __spirv_BuiltInWorkgroupSize(dim);
size_t num_groups = global_size / local_size;
if (global_size % local_size != 0) {
if (global_size % local_size != 0)
num_groups++;
}
return num_groups;
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_NumWorkgroups_y() {
size_t global_size = __spirv_GlobalSize_y();
size_t local_size = __spirv_WorkgroupSize_y();
size_t num_groups = global_size / local_size;
if (global_size % local_size != 0) {
num_groups++;
}
return num_groups;
}

_CLC_DEF _CLC_OVERLOAD size_t __spirv_NumWorkgroups_z() {
size_t global_size = __spirv_GlobalSize_z();
size_t local_size = __spirv_WorkgroupSize_z();
size_t num_groups = global_size / local_size;
if (global_size % local_size != 0) {
num_groups++;
}
return num_groups;
}
14 changes: 7 additions & 7 deletions libclc/libspirv/lib/amdgcn-amdhsa/workitem/get_sub_group_id.cl
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

#include <libspirv/spirv.h>

_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupId() {
size_t id_x = __spirv_LocalInvocationId_x();
size_t id_y = __spirv_LocalInvocationId_y();
size_t id_z = __spirv_LocalInvocationId_z();
size_t size_x = __spirv_WorkgroupSize_x();
size_t size_y = __spirv_WorkgroupSize_y();
uint sg_size = __spirv_SubgroupMaxSize();
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInSubgroupId() {
size_t id_x = __spirv_BuiltInLocalInvocationId(0);
size_t id_y = __spirv_BuiltInLocalInvocationId(1);
size_t id_z = __spirv_BuiltInLocalInvocationId(2);
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
uint sg_size = __spirv_BuiltInSubgroupMaxSize();
return (id_z * size_y * size_x + id_y * size_x + id_x) / sg_size;
}
Loading