Skip to content

Commit 2a78464

Browse files
committed
[libspirv] Use clc workitem functions for libspirv workitem
llvm-diff changes: * libspirv-amdgcn--amdhsa.bc has no change. * libspirv-nvptx64--nvidiacl.bc has instruction order changes. * libspirv-native_cpu.bc has new symbols _Z25__spirv_BuiltInSubgroupIdv and __mux_get_sub_group_id.
1 parent c7ff661 commit 2a78464

24 files changed

+188
-66
lines changed

libclc/libspirv/lib/amdgcn-amdhsa/SOURCES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,14 @@ math/sinh.cl
5858
math/tan.cl
5959
math/tanh.cl
6060
workitem/get_global_size.cl
61+
workitem/get_local_linear_id.cl
6162
workitem/get_local_size.cl
6263
workitem/get_num_groups.cl
64+
workitem/get_num_sub_groups.cl
6365
workitem/get_max_sub_group_size.cl
6466
workitem/get_sub_group_id.cl
6567
workitem/get_sub_group_local_id.cl
68+
workitem/get_sub_group_size.cl
6669
misc/sub_group_shuffle.cl
6770
async/wait_group_events.cl
6871
assert/__assert_fail.ll
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_BuiltInLocalInvocationIndex() {
12+
return __spirv_BuiltInLocalInvocationId(2) * __spirv_BuiltInWorkgroupSize(1) *
13+
__spirv_BuiltInWorkgroupSize(0) +
14+
__spirv_BuiltInLocalInvocationId(1) * __spirv_BuiltInWorkgroupSize(0) +
15+
__spirv_BuiltInLocalInvocationId(0);
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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 uint __spirv_BuiltInNumSubgroups() {
12+
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
13+
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
14+
size_t size_z = __spirv_BuiltInWorkgroupSize(2);
15+
uint sg_size = __spirv_BuiltInSubgroupMaxSize();
16+
size_t linear_size = size_z * size_y * size_x;
17+
return (uint)((linear_size + sg_size - 1) / sg_size);
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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 uint __spirv_BuiltInSubgroupSize() {
12+
if (__spirv_BuiltInSubgroupId() != __spirv_BuiltInNumSubgroups() - 1) {
13+
return __spirv_BuiltInSubgroupMaxSize();
14+
}
15+
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
16+
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
17+
size_t size_z = __spirv_BuiltInWorkgroupSize(2);
18+
size_t linear_size = size_z * size_y * size_x;
19+
size_t uniform_groups = __spirv_BuiltInNumSubgroups() - 1;
20+
size_t uniform_size = __spirv_BuiltInSubgroupMaxSize() * uniform_groups;
21+
return linear_size - uniform_size;
22+
}

libclc/libspirv/lib/generic/SOURCES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,5 @@ workitem/get_global_id.cl
179179
workitem/get_global_size.cl
180180
workitem/get_local_linear_id.cl
181181
workitem/get_num_sub_groups.cl
182+
workitem/get_sub_group_id.cl
182183
workitem/get_sub_group_size.cl

libclc/libspirv/lib/generic/workitem/get_local_linear_id.cl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include <clc/workitem/clc_get_local_linear_id.h>
910
#include <libspirv/spirv.h>
1011

11-
_CLC_DEF _CLC_OVERLOAD size_t __spirv_BuiltInLocalInvocationIndex() {
12-
return __spirv_BuiltInLocalInvocationId(2) * __spirv_BuiltInWorkgroupSize(1) *
13-
__spirv_BuiltInWorkgroupSize(0) +
14-
__spirv_BuiltInLocalInvocationId(1) * __spirv_BuiltInWorkgroupSize(0) +
15-
__spirv_BuiltInLocalInvocationId(0);
12+
_CLC_OVERLOAD _CLC_DEF size_t __spirv_BuiltInLocalInvocationIndex() {
13+
return __clc_get_local_linear_id();
1614
}

libclc/libspirv/lib/generic/workitem/get_num_sub_groups.cl

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include <clc/workitem/clc_get_num_sub_groups.h>
910
#include <libspirv/spirv.h>
1011

1112
_CLC_DEF _CLC_OVERLOAD uint __spirv_BuiltInNumSubgroups() {
12-
size_t size_x = __spirv_BuiltInWorkgroupSize(0);
13-
size_t size_y = __spirv_BuiltInWorkgroupSize(1);
14-
size_t size_z = __spirv_BuiltInWorkgroupSize(2);
15-
uint sg_size = __spirv_BuiltInSubgroupMaxSize();
16-
size_t linear_size = size_z * size_y * size_x;
17-
return (uint)((linear_size + sg_size - 1) / sg_size);
13+
return __clc_get_num_sub_groups();
1814
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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 <clc/workitem/clc_get_sub_group_id.h>
10+
#include <libspirv/spirv.h>
11+
12+
_CLC_OVERLOAD _CLC_DEF uint __spirv_BuiltInSubgroupId() {
13+
return __clc_get_sub_group_id();
14+
}

libclc/libspirv/lib/native_cpu/SOURCES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ atomic/atomic_max.ll
1515
atomic/atomic_min.ll
1616
workitem/get_global_id.cl
1717
workitem/get_global_size.cl
18+
workitem/get_local_linear_id.cl
1819
workitem/get_num_sub_groups.cl
20+
workitem/get_sub_group_id.cl
1921
workitem/get_sub_group_size.cl
2022
cl_khr_int64_extended_atomics/minmax_helpers.ll
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_BuiltInLocalInvocationIndex() {
12+
return __spirv_BuiltInLocalInvocationId(2) * __spirv_BuiltInWorkgroupSize(1) *
13+
__spirv_BuiltInWorkgroupSize(0) +
14+
__spirv_BuiltInLocalInvocationId(1) * __spirv_BuiltInWorkgroupSize(0) +
15+
__spirv_BuiltInLocalInvocationId(0);
16+
}

0 commit comments

Comments
 (0)