From ea01995bd6e8599614708eee14a821f9a803e0c1 Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Fri, 16 Jul 2021 16:25:22 +0000 Subject: [PATCH 1/3] [SYCL][LIBCLC] Add subgroup builtins for AMDGCN --- libclc/amdgcn-amdhsa/libspirv/SOURCES | 4 +++ .../workitem/get_max_sub_group_size.cl | 28 +++++++++++++++++++ .../libspirv/workitem/get_num_sub_groups.cl | 18 ++++++++++++ .../libspirv/workitem/get_sub_group_id.cl | 20 +++++++++++++ .../libspirv/workitem/get_sub_group_size.cl | 22 +++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl diff --git a/libclc/amdgcn-amdhsa/libspirv/SOURCES b/libclc/amdgcn-amdhsa/libspirv/SOURCES index e291cd7d1653..95c036198792 100644 --- a/libclc/amdgcn-amdhsa/libspirv/SOURCES +++ b/libclc/amdgcn-amdhsa/libspirv/SOURCES @@ -7,3 +7,7 @@ math/sin.cl math/sqrt.cl math/atan.cl math/cbrt.cl +workitem/get_max_sub_group_size.cl +workitem/get_num_sub_groups.cl +workitem/get_sub_group_id.cl +workitem/get_sub_group_size.cl diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl new file mode 100644 index 000000000000..394405a0c193 --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +// FIXME: Remove the following workaround once the clang change is released. +// This is for backward compatibility with older clang which does not define +// __AMDGCN_WAVEFRONT_SIZE. It does not consider -mwavefrontsize64. +// See: +// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.h#L414 +// and: +// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.cpp#L421 +#ifndef __AMDGCN_WAVEFRONT_SIZE +#if __gfx1010__ || __gfx1011__ || __gfx1012__ || __gfx1030__ || __gfx1031__ +#define __AMDGCN_WAVEFRONT_SIZE 32 +#else +#define __AMDGCN_WAVEFRONT_SIZE 64 +#endif +#endif + +_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupMaxSize() { + return __AMDGCN_WAVEFRONT_SIZE; +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl new file mode 100644 index 000000000000..275f21d144ec --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl @@ -0,0 +1,18 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_CLC_DEF _CLC_OVERLOAD uint __spirv_NumSubgroups() { + size_t size_x = __spirv_WorkgroupSize_x(); + size_t size_y = __spirv_WorkgroupSize_y(); + size_t size_z = __spirv_WorkgroupSize_z(); + uint sg_size = __spirv_SubgroupMaxSize(); + uint linear_size = size_z * size_y * size_x; + return (linear_size + sg_size - 1) / sg_size; +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl new file mode 100644 index 000000000000..6b6095d51141 --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_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(); + size_t size_z = __spirv_WorkgroupSize_z(); + uint sg_size = __spirv_SubgroupMaxSize(); + return (id_z * size_y * size_x + id_y * size_x + id_x) / sg_size; +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl new file mode 100644 index 000000000000..99f7c67fc02d --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupSize() { + if (__spirv_SubgroupId() != __spirv_NumSubgroups() - 1) { + return __spirv_SubgroupMaxSize(); + } + size_t size_x = __spirv_WorkgroupSize_x(); + size_t size_y = __spirv_WorkgroupSize_y(); + size_t size_z = __spirv_WorkgroupSize_z(); + uint linear_size = size_z * size_y * size_x; + uint uniform_groups = __spirv_NumSubgroups() - 1; + uint uniform_size = __spirv_SubgroupMaxSize() * uniform_groups; + return linear_size - uniform_size; +} From de6fedec740133ca263db5408f5687427d8ff88b Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Thu, 29 Jul 2021 09:02:50 +0100 Subject: [PATCH 2/3] Update libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl Co-authored-by: Alexey Bader --- libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl index 275f21d144ec..1487ba91b18e 100644 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl @@ -13,6 +13,6 @@ _CLC_DEF _CLC_OVERLOAD uint __spirv_NumSubgroups() { size_t size_y = __spirv_WorkgroupSize_y(); size_t size_z = __spirv_WorkgroupSize_z(); uint sg_size = __spirv_SubgroupMaxSize(); - uint linear_size = size_z * size_y * size_x; - return (linear_size + sg_size - 1) / sg_size; + size_t linear_size = size_z * size_y * size_x; + return (uint)((linear_size + sg_size - 1) / sg_size); } From 913e05baaafd2b945540d41335399200f4f94d8b Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Thu, 29 Jul 2021 09:03:04 +0100 Subject: [PATCH 3/3] Update libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl Co-authored-by: Alexey Bader --- .../amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl index 99f7c67fc02d..5a9d35aa0e73 100644 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl @@ -15,8 +15,8 @@ _CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupSize() { size_t size_x = __spirv_WorkgroupSize_x(); size_t size_y = __spirv_WorkgroupSize_y(); size_t size_z = __spirv_WorkgroupSize_z(); - uint linear_size = size_z * size_y * size_x; - uint uniform_groups = __spirv_NumSubgroups() - 1; - uint uniform_size = __spirv_SubgroupMaxSize() * uniform_groups; + size_t linear_size = size_z * size_y * size_x; + size_t uniform_groups = __spirv_NumSubgroups() - 1; + size_t uniform_size = __spirv_SubgroupMaxSize() * uniform_groups; return linear_size - uniform_size; }