Skip to content

Commit 36dc9cb

Browse files
Merge remote-tracking branch 'upstream/sycl' into konrad/AddSyncToCBRelease
2 parents b8d1666 + 5ac8577 commit 36dc9cb

File tree

137 files changed

+4270
-1236
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+4270
-1236
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,12 +1637,14 @@ def SYCLType: InheritableAttr {
16371637
let Subjects = SubjectList<[CXXRecord, Enum], ErrorDiag>;
16381638
let LangOpts = [SYCLIsDevice, SilentlyIgnoreSYCLIsHost];
16391639
let Args = [EnumArgument<"Type", "SYCLType", /*is_string=*/true,
1640-
["accessor", "local_accessor", "work_group_memory", "dynamic_work_group_memory",
1640+
["accessor", "local_accessor", "dynamic_local_accessor",
1641+
"work_group_memory", "dynamic_work_group_memory",
16411642
"specialization_id", "kernel_handler", "buffer_location",
16421643
"no_alias", "accessor_property_list", "group",
16431644
"private_memory", "aspect", "annotated_ptr", "annotated_arg",
16441645
"stream", "sampler", "host_pipe", "multi_ptr"],
1645-
["accessor", "local_accessor", "work_group_memory", "dynamic_work_group_memory",
1646+
["accessor", "local_accessor", "dynamic_local_accessor",
1647+
"work_group_memory", "dynamic_work_group_memory",
16461648
"specialization_id", "kernel_handler", "buffer_location",
16471649
"no_alias", "accessor_property_list", "group",
16481650
"private_memory", "aspect", "annotated_ptr", "annotated_arg",

clang/include/clang/Sema/SemaSYCL.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class SYCLIntegrationHeader {
6464
kind_stream,
6565
kind_work_group_memory,
6666
kind_dynamic_work_group_memory,
67-
kind_last = kind_dynamic_work_group_memory
67+
kind_dynamic_accessor,
68+
kind_last = kind_dynamic_accessor
6869
};
6970

7071
public:

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ bool SemaSYCL::isSyclType(QualType Ty, SYCLTypeAttr::SYCLType TypeName) {
9494

9595
static bool isSyclAccessorType(QualType Ty) {
9696
return SemaSYCL::isSyclType(Ty, SYCLTypeAttr::accessor) ||
97-
SemaSYCL::isSyclType(Ty, SYCLTypeAttr::local_accessor);
97+
SemaSYCL::isSyclType(Ty, SYCLTypeAttr::local_accessor) ||
98+
SemaSYCL::isSyclType(Ty, SYCLTypeAttr::dynamic_local_accessor);
9899
}
99100

100101
// FIXME: Accessor property lists should be modified to use compile-time
@@ -1151,7 +1152,8 @@ static QualType GetSYCLKernelObjectType(const FunctionDecl *KernelCaller) {
11511152
/// \return the target of given SYCL accessor type
11521153
static target getAccessTarget(QualType FieldTy,
11531154
const ClassTemplateSpecializationDecl *AccTy) {
1154-
if (SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::local_accessor))
1155+
if (SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::local_accessor) ||
1156+
SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::dynamic_local_accessor))
11551157
return local;
11561158

11571159
return static_cast<target>(
@@ -4815,7 +4817,13 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
48154817
int Dims = static_cast<int>(
48164818
AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue());
48174819
int Info = getAccessTarget(FieldTy, AccTy) | (Dims << 11);
4818-
Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info,
4820+
4821+
SYCLIntegrationHeader::kernel_param_kind_t ParamKind =
4822+
SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::dynamic_local_accessor)
4823+
? SYCLIntegrationHeader::kind_dynamic_accessor
4824+
: SYCLIntegrationHeader::kind_accessor;
4825+
4826+
Header.addParamDesc(ParamKind, Info,
48194827
CurOffset +
48204828
offsetOf(RD, BC.getType()->getAsCXXRecordDecl()));
48214829
} else if (SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::work_group_memory)) {
@@ -4841,8 +4849,12 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
48414849
AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue());
48424850
int Info = getAccessTarget(FieldTy, AccTy) | (Dims << 11);
48434851

4844-
Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info,
4845-
CurOffset + offsetOf(FD, FieldTy));
4852+
SYCLIntegrationHeader::kernel_param_kind_t ParamKind =
4853+
SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::dynamic_local_accessor)
4854+
? SYCLIntegrationHeader::kind_dynamic_accessor
4855+
: SYCLIntegrationHeader::kind_accessor;
4856+
4857+
Header.addParamDesc(ParamKind, Info, CurOffset + offsetOf(FD, FieldTy));
48464858
} else if (SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::stream)) {
48474859
addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream);
48484860
} else if (SemaSYCL::isSyclType(FieldTy, SYCLTypeAttr::work_group_memory)) {
@@ -6056,6 +6068,7 @@ static const char *paramKind2Str(KernelParamKind K) {
60566068
CASE(pointer);
60576069
CASE(work_group_memory);
60586070
CASE(dynamic_work_group_memory);
6071+
CASE(dynamic_accessor);
60596072
}
60606073
return "<ERROR>";
60616074

clang/test/CodeGenSYCL/Inputs/sycl.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ local_accessor: public accessor<dataT,
440440
#ifdef __SYCL_DEVICE_ONLY__
441441
void __init(__attribute__((opencl_local)) dataT *Ptr, range<dimensions> AccessRange,
442442
range<dimensions> MemRange, id<dimensions> Offset) {}
443+
444+
template <typename, int>
445+
friend class dynamic_local_accessor;
443446
#endif
444447
};
445448

@@ -693,6 +696,23 @@ __SYCL_TYPE(dynamic_work_group_memory) dynamic_work_group_memory {
693696
work_group_memory<DataT> LocalMem;
694697
};
695698

699+
template <typename DataT, int Dimensions>
700+
class __attribute__((sycl_special_class))
701+
__SYCL_TYPE(dynamic_local_accessor) dynamic_local_accessor {
702+
public:
703+
dynamic_local_accessor() = default;
704+
705+
void __init(__attribute__((opencl_local)) DataT *Ptr,
706+
range<Dimensions> AccessRange, range<Dimensions> range,
707+
id<Dimensions> id) {
708+
this->LocalMem.__init(Ptr, AccessRange, range, id);
709+
}
710+
local_accessor<DataT, Dimensions> get() const { return LocalMem; }
711+
712+
private:
713+
local_accessor<DataT, Dimensions> LocalMem;
714+
};
715+
696716
template <typename T, int dimensions = 1,
697717
typename AllocatorT = int /*fake type as AllocatorT is not used*/>
698718
class buffer {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown -disable-llvm-passes -emit-llvm %s -o %t.ll
2+
// RUN: FileCheck < %t.ll %s --check-prefix CHECK-IR
3+
// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown -fsycl-int-header=%t.h %s
4+
// RUN: FileCheck < %t.h %s --check-prefix CHECK-INT-HEADER
5+
//
6+
// Tests for dynamic_local_accessor kernel parameter using the dummy implementation in Inputs/sycl.hpp.
7+
// The first two RUN commands verify that the init call is generated with the correct arguments in LLVM IR
8+
// and the second two RUN commands verify the contents of the integration header produced by the frontend.
9+
//
10+
// CHECK-IR: define dso_local spir_kernel void @
11+
// CHECK-IR-SAME: ptr addrspace(3) noundef align 4 [[PTR:%[a-zA-Z0-9_]+]]
12+
//
13+
// CHECK-IR: [[PTR]].addr = alloca ptr addrspace(3), align 8
14+
// CHECK-IR: [[PTR]].addr.ascast = addrspacecast ptr [[PTR]].addr to ptr addrspace(4)
15+
// CHECK-IR: store ptr addrspace(3) [[PTR]], ptr addrspace(4) [[PTR]].addr.ascast, align 8
16+
// CHECK-IR: [[PTR_LOAD:%[a-zA-Z0-9_]+]] = load ptr addrspace(3), ptr addrspace(4) [[PTR]].addr.ascast, align 8
17+
//
18+
// CHECK-IR: call spir_func void @{{.*}}__init{{.*}}(ptr addrspace(4) noundef align 4 dereferenceable_or_null(24) %{{[a-zA-Z0-9_]+}}, ptr addrspace(3) noundef %{{[a-zA-Z0-9_]+}}, ptr noundef byval(%"struct.sycl::_V1::range") align 4 %agg.{{[a-zA-Z0-9_]+}}.ascast.ascast, ptr noundef byval(%"struct.sycl::_V1::range") align 4 %agg.{{[a-zA-Z0-9_]+}}.ascast.ascast, ptr noundef byval(%"struct.sycl::_V1::id") align 4 %agg.{{[a-zA-Z0-9_]+}}.ascast.ascast) #{{[0-9_]+}}
19+
//
20+
// CHECK-INT-HEADER: const kernel_param_desc_t kernel_signatures[] = {
21+
// CHECK-INT-HEADER-NEXT: //--- _ZTSZZ4mainENKUlRN4sycl3_V17handlerEE_clES2_EUlNS0_4itemILi1EEEE_
22+
// CHECK-INT-HEADER-NEXT: { kernel_param_kind_t::kind_dynamic_accessor, 4064, 0 },
23+
// CHECK-INT-HEADER-EMPTY:
24+
// CHECK-INT-HEADER-NEXT: { kernel_param_kind_t::kind_invalid, -987654321, -987654321 },
25+
// CHECK-INT-HEADER-NEXT: };
26+
27+
#include "Inputs/sycl.hpp"
28+
29+
int main() {
30+
sycl::queue Q;
31+
sycl::dynamic_local_accessor<int, 1> DynLocalAcc;
32+
Q.submit([&](sycl::handler &CGH) {
33+
sycl::range<1> ndr;
34+
CGH.parallel_for(ndr, [=](sycl::item<1> it) {
35+
auto LocalAcc = DynLocalAcc.get();
36+
auto* Ptr = &LocalAcc;
37+
});
38+
});
39+
return 0;
40+
}

devops/scripts/benchmarks/html/scripts.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,18 @@ function getLayerTags(metadata) {
681681

682682
function processLayerComparisonsData(benchmarkRuns) {
683683
const groupedResults = {};
684+
const labelsByGroup = {};
685+
686+
benchmarkRuns.forEach(run => {
687+
run.results.forEach(result => {
688+
if (result.explicit_group) {
689+
if (!labelsByGroup[result.explicit_group]) {
690+
labelsByGroup[result.explicit_group] = new Set();
691+
}
692+
labelsByGroup[result.explicit_group].add(result.label);
693+
}
694+
});
695+
});
684696

685697
benchmarkRuns.forEach(run => {
686698
run.results.forEach(result => {
@@ -691,13 +703,7 @@ function processLayerComparisonsData(benchmarkRuns) {
691703
if (!metadata) return;
692704

693705
// Get all benchmark labels in this group
694-
const labelsInGroup = new Set(
695-
benchmarkRuns.flatMap(r =>
696-
r.results
697-
.filter(res => res.explicit_group === result.explicit_group)
698-
.map(res => res.label)
699-
)
700-
);
706+
const labelsInGroup = labelsByGroup[result.explicit_group];
701707

702708
// Check if this group compares different layers
703709
const uniqueLayers = new Set();

libclc/CMakeLists.txt

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -413,23 +413,27 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
413413
DIRS ${opencl_dirs}
414414
)
415415

416-
set( libspirv_lib_files )
417-
set( libspirv_gen_files )
418-
419-
if( NOT ARCH STREQUAL spirv AND NOT ARCH STREQUAL spirv64 )
420-
if( ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
421-
list( APPEND libspirv_gen_files clspv-convert.cl )
422-
elseif ( NOT ENABLE_RUNTIME_SUBNORMAL )
423-
list( APPEND libspirv_gen_files spirv-convert.cl )
424-
list( APPEND libspirv_lib_files libspirv/lib/generic/subnormal_use_default.ll )
416+
set( BUILD_LIBSPIRV_${t} FALSE )
417+
if ( t STREQUAL amdgcn--amdhsa OR t STREQUAL nvptx64--nvidiacl OR t STREQUAL native_cpu )
418+
set( libspirv_lib_files )
419+
set( libspirv_gen_files )
420+
set( BUILD_LIBSPIRV_${t} TRUE )
421+
422+
if( NOT ARCH STREQUAL spirv AND NOT ARCH STREQUAL spirv64 )
423+
if( ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
424+
list( APPEND libspirv_gen_files clspv-convert.cl )
425+
elseif ( NOT ENABLE_RUNTIME_SUBNORMAL )
426+
list( APPEND libspirv_gen_files spirv-convert.cl )
427+
list( APPEND libspirv_lib_files libspirv/lib/generic/subnormal_use_default.ll )
428+
endif()
425429
endif()
426-
endif()
427430

428-
libclc_configure_lib_source(
429-
libspirv_lib_files
430-
LIB_ROOT_DIR libspirv
431-
DIRS ${libspirv_dirs} ${DARCH} ${DARCH}-${OS} ${DARCH}-${VENDOR}-${OS}
432-
)
431+
libclc_configure_lib_source(
432+
libspirv_lib_files
433+
LIB_ROOT_DIR libspirv
434+
DIRS ${libspirv_dirs} ${DARCH} ${DARCH}-${OS} ${DARCH}-${VENDOR}-${OS}
435+
)
436+
endif()
433437

434438
foreach( d ${${t}_devices} )
435439
get_libclc_device_info(
@@ -568,28 +572,30 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
568572
GEN_FILES ${clc_gen_files}
569573
)
570574

571-
set( spirv_build_flags ${build_flags} )
572-
list( APPEND spirv_build_flags
573-
-I${CMAKE_CURRENT_SOURCE_DIR}/generic/include
574-
-I${CMAKE_CURRENT_SOURCE_DIR}/libspirv/include/
575-
# FIXME: Fix libspirv to not require disabling this noisy warning
576-
-Wno-bitwise-conditional-parentheses
577-
)
578-
579-
add_libclc_builtin_set(
580-
ARCH ${ARCH}
581-
ARCH_SUFFIX libspirv-${arch_suffix}
582-
TRIPLE ${clang_triple}
583-
TARGET_ENV libspirv-
584-
COMPILE_FLAGS ${spirv_build_flags}
585-
OPT_FLAGS ${opt_flags}
586-
LIB_FILES ${libspirv_lib_files}
587-
GEN_FILES ${libspirv_gen_files}
588-
ALIASES ${${d}_aliases}
589-
PARENT_TARGET libspirv-builtins
590-
# Link in the CLC builtins and internalize their symbols
591-
INTERNAL_LINK_DEPENDENCIES builtins.link.clc-${arch_suffix}
592-
)
575+
if( BUILD_LIBSPIRV_${t} )
576+
set( spirv_build_flags ${build_flags} )
577+
list( APPEND spirv_build_flags
578+
-I${CMAKE_CURRENT_SOURCE_DIR}/generic/include
579+
-I${CMAKE_CURRENT_SOURCE_DIR}/libspirv/include/
580+
# FIXME: Fix libspirv to not require disabling this noisy warning
581+
-Wno-bitwise-conditional-parentheses
582+
)
583+
584+
add_libclc_builtin_set(
585+
ARCH ${ARCH}
586+
ARCH_SUFFIX libspirv-${arch_suffix}
587+
TRIPLE ${clang_triple}
588+
TARGET_ENV libspirv-
589+
COMPILE_FLAGS ${spirv_build_flags}
590+
OPT_FLAGS ${opt_flags}
591+
LIB_FILES ${libspirv_lib_files}
592+
GEN_FILES ${libspirv_gen_files}
593+
ALIASES ${${d}_aliases}
594+
PARENT_TARGET libspirv-builtins
595+
# Link in the CLC builtins and internalize their symbols
596+
INTERNAL_LINK_DEPENDENCIES builtins.link.clc-${arch_suffix}
597+
)
598+
endif()
593599

594600
set( opencl_build_flags ${build_flags} )
595601
list( APPEND opencl_build_flags

libclc/libspirv/include/libspirv/image/image.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#if defined(__opencl_c_images)
10+
911
_CLC_OVERLOAD _CLC_DECL float __spirv_ImageRead__Rfloat(image2d_t image,
1012
int2 coord);
1113
_CLC_OVERLOAD _CLC_DECL float __spirv_ImageRead__Rfloat(image2d_t image,
@@ -113,3 +115,5 @@ _CLC_OVERLOAD _CLC_DECL void __spirv_ImageWrite(image2d_t image, int4 coord,
113115
_CLC_OVERLOAD _CLC_DECL void __spirv_ImageWrite(image3d_t image, int4 coord,
114116
half4 texel);
115117
#endif
118+
119+
#endif

libclc/libspirv/include/libspirv/spirv_types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ typedef struct {
5050
float real, imag;
5151
} complex_float;
5252

53+
#ifdef cl_khr_fp64
5354
typedef struct {
5455
double real, imag;
5556
} complex_double;
57+
#endif
5658

59+
#ifdef cl_khr_fp16
5760
typedef struct {
5861
half real, imag;
5962
} complex_half;
63+
#endif
6064

6165
#endif // CLC_SPIRV_TYPES

0 commit comments

Comments
 (0)