From 88c27080b3698269619f5d163f84e4b35e9bc4c2 Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Tue, 28 Jul 2020 15:57:54 -0700 Subject: [PATCH 1/7] [SYCL] Kernel parameters optimization --- clang/include/clang/Sema/Sema.h | 3 + clang/lib/Sema/SemaSYCL.cpp | 26 ++++++++- clang/test/CodeGenSYCL/integration_header.cpp | 55 +++++++++++-------- .../CodeGenSYCL/kernel-param-acc-array-ih.cpp | 14 ++++- .../kernel-param-member-acc-array-ih.cpp | 14 ++++- .../CodeGenSYCL/kernel-param-pod-array-ih.cpp | 20 +++++-- .../test/CodeGenSYCL/struct_kernel_param.cpp | 14 ++--- clang/test/CodeGenSYCL/usm-int-header.cpp | 6 +- clang/test/CodeGenSYCL/wrapped-accessor.cpp | 14 ++++- sycl/include/CL/sycl/detail/kernel_desc.hpp | 2 + 10 files changed, 125 insertions(+), 43 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 193ec66715336..b05f332a55382 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -359,6 +359,9 @@ class SYCLIntegrationHeader { // Offset of the captured parameter value in the lambda or function object. unsigned Offset = 0; + // bool to mark kernel parameters that are used + bool KernelParamUsed; + KernelParamDesc() = default; }; diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 8cbd33b279e8f..8c393778bf2a1 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2653,6 +2653,25 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { } O << "};\n\n"; + O << "// array representing kernel parameters used in all kernels defined in " + "the\n"; + O << "// corresponding source\n"; + O << "static constexpr\n"; + O << "const bool kernel_param_used[] = {\n"; + O << " //PARAM_USED_TABLE_BEGIN " + << "\n"; + O << " //kernel_name_1 " + << "\n"; + O << " true, true, true " + << "\n"; + O << " //kernel_name_2 " + << "\n"; + O << " true, true, true " + << "\n"; + O << " //PARAM_USED_TABLE_END " + << "\n"; + O << " } \n\n"; + O << "// array representing signatures of all kernels defined in the\n"; O << "// corresponding source\n"; O << "static constexpr\n"; @@ -2662,10 +2681,13 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { auto &K = KernelDescs[I]; O << " //--- " << K.Name << "\n"; - for (const auto &P : K.Params) { + for (unsigned I = 0; I < K.Params.size(); I++) { + auto &P = K.Params[I]; std::string TyStr = paramKind2Str(P.Kind); O << " { kernel_param_kind_t::" << TyStr << ", "; - O << P.Info << ", " << P.Offset << " },\n"; + O << P.Info << ", " << P.Offset << ", " + << "kernel_param_used[" << I << "]" + << " },\n"; } O << "\n"; } diff --git a/clang/test/CodeGenSYCL/integration_header.cpp b/clang/test/CodeGenSYCL/integration_header.cpp index c63e64a37f117..e7fe4621f01e4 100644 --- a/clang/test/CodeGenSYCL/integration_header.cpp +++ b/clang/test/CodeGenSYCL/integration_header.cpp @@ -24,39 +24,50 @@ // CHECK-NEXT: "_ZTSZ4mainE16accessor_in_base" // CHECK-NEXT: }; // +// CHECK: static constexpr +// CHECK-NEXT: const bool kernel_param_used[] = { +// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN +// CHECK-NEXT: //kernel_name_1 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //kernel_name_2 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //PARAM_USED_TABLE_END +// CHECK-NEXT: } + + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[3] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24, kernel_param_used[4] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40, kernel_param_used[5] }, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, kernel_param_used[2] }, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, kernel_param_used[2] }, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS13fourth_kernelIJN15template_arg_ns14namespaced_argILi1EEEEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, kernel_param_used[3] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24, kernel_param_used[4] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36, kernel_param_used[5] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40, kernel_param_used[6] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52, kernel_param_used[7] }, // CHECK-EMPTY: // CHECK-NEXT: }; // diff --git a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp index 8c2cfb2a1bd8b..e9dfd44bf636d 100644 --- a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp @@ -17,11 +17,21 @@ // CHECK-NEXT: "_ZTSZ4mainE8kernel_A" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool kernel_param_used[] = { +// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN +// CHECK-NEXT: //kernel_name_1 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //kernel_name_2 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //PARAM_USED_TABLE_END +// CHECK-NEXT: } + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE8kernel_A -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[1] }, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp index f5f679f7d3650..784cc716cb6a4 100644 --- a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp @@ -17,11 +17,21 @@ // CHECK-NEXT: "_ZTSZ4mainE8kernel_C" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool kernel_param_used[] = { +// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN +// CHECK-NEXT: //kernel_name_1 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //kernel_name_2 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //PARAM_USED_TABLE_END +// CHECK-NEXT: } + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[1] }, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp index d4a5c8d5995a0..fb4c35ddc0a53 100755 --- a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp @@ -16,14 +16,24 @@ // CHECK-NEXT: "_ZTSZ4mainE8kernel_B" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool kernel_param_used[] = { +// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN +// CHECK-NEXT: //kernel_name_1 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //kernel_name_2 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //PARAM_USED_TABLE_END +// CHECK-NEXT: } + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, kernel_param_used[3] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, kernel_param_used[4] }, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/struct_kernel_param.cpp b/clang/test/CodeGenSYCL/struct_kernel_param.cpp index a00f147b0dee0..44d8611906e16 100644 --- a/clang/test/CodeGenSYCL/struct_kernel_param.cpp +++ b/clang/test/CodeGenSYCL/struct_kernel_param.cpp @@ -3,13 +3,13 @@ // CHECK: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, kernel_param_used[3] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24, kernel_param_used[4] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28, kernel_param_used[5] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32, kernel_param_used[6] }, // CHECK-EMPTY: // CHECK-NEXT:}; diff --git a/clang/test/CodeGenSYCL/usm-int-header.cpp b/clang/test/CodeGenSYCL/usm-int-header.cpp index 5b3ffa00050fa..eab136ce56688 100644 --- a/clang/test/CodeGenSYCL/usm-int-header.cpp +++ b/clang/test/CodeGenSYCL/usm-int-header.cpp @@ -2,8 +2,10 @@ // RUN: %clang_cc1 -I %S/Inputs -fsycl -fsycl -fsycl-is-device -fsycl-int-header=%t.h %s -o %t.out // RUN: FileCheck -input-file=%t.h %s --check-prefix=INT-HEADER -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0 }, -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8 }, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0, kernel_param_used[0] }, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8, kernel_param_used[1] }, + + //==--usm-int-header.cpp - USM kernel param aspace and int header test -----==// // diff --git a/clang/test/CodeGenSYCL/wrapped-accessor.cpp b/clang/test/CodeGenSYCL/wrapped-accessor.cpp index 0355a2a17b15b..29ac0ea5415e9 100644 --- a/clang/test/CodeGenSYCL/wrapped-accessor.cpp +++ b/clang/test/CodeGenSYCL/wrapped-accessor.cpp @@ -14,10 +14,22 @@ // CHECK-NEXT: "_ZTSZ4mainE14wrapped_access" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool kernel_param_used[] = { +// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN +// CHECK-NEXT: //kernel_name_1 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //kernel_name_2 +// CHECK-NEXT: true, true, true +// CHECK-NEXT: //PARAM_USED_TABLE_END +// CHECK-NEXT: } + + + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/sycl/include/CL/sycl/detail/kernel_desc.hpp b/sycl/include/CL/sycl/detail/kernel_desc.hpp index 120fb9dc4e96c..425c64689925f 100644 --- a/sycl/include/CL/sycl/detail/kernel_desc.hpp +++ b/sycl/include/CL/sycl/detail/kernel_desc.hpp @@ -42,6 +42,8 @@ struct kernel_param_desc_t { // offset of the captured value of the parameter in the lambda or function // object int offset; + // bool to mark kernel parameters that are used + bool kernelParamUsed; }; // Translates specialization constant type to its name. From cc960311380347723ae5f43f3c74478ace307b4a Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Tue, 28 Jul 2020 16:19:40 -0700 Subject: [PATCH 2/7] Remove extra lines --- clang/include/clang/Sema/Sema.h | 4 +--- clang/test/CodeGenSYCL/integration_header.cpp | 1 - clang/test/CodeGenSYCL/usm-int-header.cpp | 2 -- clang/test/CodeGenSYCL/wrapped-accessor.cpp | 2 -- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index b05f332a55382..bc7ac79785e3f 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -358,10 +358,8 @@ class SYCLIntegrationHeader { int Info = 0; // Offset of the captured parameter value in the lambda or function object. unsigned Offset = 0; - // bool to mark kernel parameters that are used - bool KernelParamUsed; - + bool KernelParamUsed; KernelParamDesc() = default; }; diff --git a/clang/test/CodeGenSYCL/integration_header.cpp b/clang/test/CodeGenSYCL/integration_header.cpp index e7fe4621f01e4..f44ec6f09be76 100644 --- a/clang/test/CodeGenSYCL/integration_header.cpp +++ b/clang/test/CodeGenSYCL/integration_header.cpp @@ -34,7 +34,6 @@ // CHECK-NEXT: //PARAM_USED_TABLE_END // CHECK-NEXT: } - // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel diff --git a/clang/test/CodeGenSYCL/usm-int-header.cpp b/clang/test/CodeGenSYCL/usm-int-header.cpp index eab136ce56688..b82287c820ab5 100644 --- a/clang/test/CodeGenSYCL/usm-int-header.cpp +++ b/clang/test/CodeGenSYCL/usm-int-header.cpp @@ -5,8 +5,6 @@ // INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0, kernel_param_used[0] }, // INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8, kernel_param_used[1] }, - - //==--usm-int-header.cpp - USM kernel param aspace and int header test -----==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. diff --git a/clang/test/CodeGenSYCL/wrapped-accessor.cpp b/clang/test/CodeGenSYCL/wrapped-accessor.cpp index 29ac0ea5415e9..09ffd8c16b95b 100644 --- a/clang/test/CodeGenSYCL/wrapped-accessor.cpp +++ b/clang/test/CodeGenSYCL/wrapped-accessor.cpp @@ -24,8 +24,6 @@ // CHECK-NEXT: //PARAM_USED_TABLE_END // CHECK-NEXT: } - - // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access From 0b6a546f3d9ca5131c77d490103eec39d079d58d Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Wed, 29 Jul 2020 16:17:14 -0700 Subject: [PATCH 3/7] wip --- clang/lib/Sema/SemaSYCL.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 8c393778bf2a1..4bb4d304753d3 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2660,14 +2660,11 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { O << "const bool kernel_param_used[] = {\n"; O << " //PARAM_USED_TABLE_BEGIN " << "\n"; - O << " //kernel_name_1 " - << "\n"; - O << " true, true, true " - << "\n"; - O << " //kernel_name_2 " - << "\n"; - O << " true, true, true " - << "\n"; + for (unsigned I = 0; I < KernelDescs.size(); I++) { + auto &K = KernelDescs[I]; + O << " //--- " << K.Name << "\n"; + // bool value for each param + } O << " //PARAM_USED_TABLE_END " << "\n"; O << " } \n\n"; From b800ac247db8587f6f40577b94d8f9fb12c7653e Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Thu, 30 Jul 2020 13:57:42 -0700 Subject: [PATCH 4/7] [SYCL] Enable SYCL integration header support with kernel arg optimization table --- clang/include/clang/Sema/Sema.h | 9 ++- clang/lib/Sema/SemaSYCL.cpp | 77 ++++++++++++------- clang/test/CodeGenSYCL/integration_header.cpp | 73 ++++++++++-------- .../CodeGenSYCL/kernel-param-acc-array-ih.cpp | 24 +++--- .../kernel-param-member-acc-array-ih.cpp | 20 +++-- .../CodeGenSYCL/kernel-param-pod-array-ih.cpp | 26 +++---- .../test/CodeGenSYCL/struct_kernel_param.cpp | 34 +++++--- clang/test/CodeGenSYCL/usm-int-header.cpp | 4 +- clang/test/CodeGenSYCL/wrapped-accessor.cpp | 18 ++--- sycl/include/CL/sycl/detail/kernel_desc.hpp | 4 +- 10 files changed, 159 insertions(+), 130 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 4add79bd53003..49ddc2f7eae13 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -336,7 +336,8 @@ class SYCLIntegrationHeader { /// Adds a kernel parameter descriptor to current kernel invocation /// descriptor. - void addParamDesc(kernel_param_kind_t Kind, int Info, unsigned Offset); + void addParamDesc(kernel_param_kind_t Kind, int Info, unsigned Offset, + unsigned NumOpenCLParams); /// Signals that addition of parameter descriptors to current kernel /// invocation descriptor has finished. @@ -358,9 +359,9 @@ class SYCLIntegrationHeader { int Info = 0; // Offset of the captured parameter value in the lambda or function object. unsigned Offset = 0; - // bool to mark kernel parameters that are used - bool KernelParamUsed; - KernelParamDesc() = default; + // NumOpenCLParams to capture number of parameters in Accessor/Sampler init + // method. + unsigned NumOpenCLParams = 1; }; // Kernel invocation descriptor diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 89ce06b20c408..1b3ffd2a27fc7 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1765,6 +1765,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { void addParam(const FieldDecl *FD, QualType ArgTy, SYCLIntegrationHeader::kernel_param_kind_t Kind) { + assert(Kind != SYCLIntegrationHeader::kind_accessor && + "Kernel parameter should not be an Accessor"); uint64_t Size; const ConstantArrayType *CAT = SemaRef.getASTContext().getAsConstantArrayType(ArgTy); @@ -1772,7 +1774,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { ArgTy = CAT->getElementType(); Size = SemaRef.getASTContext().getTypeSizeInChars(ArgTy).getQuantity(); Header.addParamDesc(Kind, static_cast(Size), - static_cast(CurOffset)); + static_cast(CurOffset), 1); } public: @@ -1783,6 +1785,16 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.startKernel(Name, NameType, StableName, KernelObj->getLocation()); } + unsigned getNumOpenCLParams(const CXXRecordDecl *SamplerOrAccessorTy) { + assert(SamplerOrAccessorTy && + "Sampler/Accessor type must be a C++ record type"); + CXXMethodDecl *InitMethod = + getMethodByName(SamplerOrAccessorTy, InitMethodName); + assert(InitMethod && "sampler/accessor must have __init method"); + unsigned NumOpenCLParams; + return NumOpenCLParams = InitMethod->param_size(); + } + bool handleSyclAccessorType(const CXXBaseSpecifier &BC, QualType FieldTy) final { const auto *AccTy = @@ -1792,7 +1804,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { int Dims = static_cast( AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); int Info = getAccessTarget(AccTy) | (Dims << 11); - Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset); + Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset, + getNumOpenCLParams(AccTy)); return true; } @@ -1804,20 +1817,21 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { int Dims = static_cast( AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); int Info = getAccessTarget(AccTy) | (Dims << 11); - Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset); + Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset, + getNumOpenCLParams(AccTy)); return true; } - + bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { const auto *SamplerTy = FieldTy->getAsCXXRecordDecl(); assert(SamplerTy && "Sampler type must be a C++ record type"); CXXMethodDecl *InitMethod = getMethodByName(SamplerTy, InitMethodName); assert(InitMethod && "sampler must have __init method"); - // sampler __init method has only one argument + assert((InitMethod->param_size() == 1) && + "sampler __init method should have only one argument"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); assert(SamplerArg && "sampler __init method must have sampler parameter"); - addParam(FD, SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler); return true; } @@ -2686,34 +2700,42 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { "the\n"; O << "// corresponding source\n"; O << "static constexpr\n"; - O << "const bool kernel_param_used[] = {\n"; - O << " //PARAM_USED_TABLE_BEGIN " - << "\n"; - for (unsigned I = 0; I < KernelDescs.size(); I++) { - auto &K = KernelDescs[I]; + O << "const bool param_omit_table[] = {\n"; + O << " // OMIT_TABLE_BEGIN\n"; + for (const KernelDesc &K : KernelDescs) { O << " //--- " << K.Name << "\n"; - // bool value for each param + O << " "; + for (const KernelParamDesc &P : K.Params) + for (unsigned J = 0; J < P.NumOpenCLParams; J++) + O << "false, "; + O << "\n"; } - O << " //PARAM_USED_TABLE_END " - << "\n"; - O << " } \n\n"; + O << " // OMIT_TABLE_END\n"; + O << " }; \n\n"; O << "// array representing signatures of all kernels defined in the\n"; O << "// corresponding source\n"; O << "static constexpr\n"; O << "const kernel_param_desc_t kernel_signatures[] = {\n"; - for (unsigned I = 0; I < KernelDescs.size(); I++) { - auto &K = KernelDescs[I]; + unsigned CurIndex = 0; + for (const KernelDesc &K : KernelDescs) { O << " //--- " << K.Name << "\n"; - - for (unsigned I = 0; I < K.Params.size(); I++) { - auto &P = K.Params[I]; + for (const KernelParamDesc &P : K.Params) { std::string TyStr = paramKind2Str(P.Kind); O << " { kernel_param_kind_t::" << TyStr << ", "; - O << P.Info << ", " << P.Offset << ", " - << "kernel_param_used[" << I << "]" - << " },\n"; + O << P.Info << ", " << P.Offset << ", "; + O << "param_omit_table[" << CurIndex << "]"; + for (unsigned X = 1; X < P.NumOpenCLParams; X++) { + ++CurIndex; + if (X < P.NumOpenCLParams) + O << " | "; + O << "(param_omit_table[" << CurIndex << "]" + << " << " << X << ")"; + } + ++CurIndex; + O << "}"; + O << ",\n"; } O << "\n"; } @@ -2808,14 +2830,11 @@ void SYCLIntegrationHeader::startKernel(StringRef KernelName, } void SYCLIntegrationHeader::addParamDesc(kernel_param_kind_t Kind, int Info, - unsigned Offset) { + unsigned Offset, + unsigned NumOpenCLParams) { auto *K = getCurKernelDesc(); assert(K && "no kernels"); - K->Params.push_back(KernelParamDesc()); - KernelParamDesc &PD = K->Params.back(); - PD.Kind = Kind; - PD.Info = Info; - PD.Offset = Offset; + K->Params.push_back({Kind, Info, Offset, NumOpenCLParams}); } void SYCLIntegrationHeader::endKernel() { diff --git a/clang/test/CodeGenSYCL/integration_header.cpp b/clang/test/CodeGenSYCL/integration_header.cpp index b7e2d0ec40ce9..2169e1137e8ab 100644 --- a/clang/test/CodeGenSYCL/integration_header.cpp +++ b/clang/test/CodeGenSYCL/integration_header.cpp @@ -24,52 +24,57 @@ // CHECK-NEXT: "_ZTSZ4mainE16accessor_in_base" // CHECK-NEXT: }; // -// CHECK: static constexpr -// CHECK-NEXT: const bool kernel_param_used[] = { -// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN -// CHECK-NEXT: //kernel_name_1 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //kernel_name_2 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //PARAM_USED_TABLE_END -// CHECK-NEXT: } - +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE +// CHECK-NEXT: false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE +// CHECK-NEXT: false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTS13fourth_kernelIJN15template_arg_ns14namespaced_argILi1EEEEE +// CHECK-NEXT: false, false, false, false, false, +// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, kernel_param_used[2] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[3] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24, kernel_param_used[4] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40, kernel_param_used[5] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[0]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4, param_omit_table[1]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, param_omit_table[2]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[3] | (param_omit_table[4] << 1) | (param_omit_table[5] << 2) | (param_omit_table[6] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24, param_omit_table[7] | (param_omit_table[8] << 1) | (param_omit_table[9] << 2) | (param_omit_table[10] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40, param_omit_table[11]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[12]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[13] | (param_omit_table[14] << 1) | (param_omit_table[15] << 2) | (param_omit_table[16] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, param_omit_table[17]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, kernel_param_used[2] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[18]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[19] | (param_omit_table[20] << 1) | (param_omit_table[21] << 2) | (param_omit_table[22] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, param_omit_table[23]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS13fourth_kernelIJN15template_arg_ns14namespaced_argILi1EEEEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[24]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[25] | (param_omit_table[26] << 1) | (param_omit_table[27] << 2) | (param_omit_table[28] << 3)}, // CHECK-EMPTY: -// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8, kernel_param_used[2] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, kernel_param_used[3] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24, kernel_param_used[4] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36, kernel_param_used[5] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40, kernel_param_used[6] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52, kernel_param_used[7] }, +// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[29]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, param_omit_table[30]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8, param_omit_table[31] | (param_omit_table[32] << 1) | (param_omit_table[33] << 2) | (param_omit_table[34] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, param_omit_table[35]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24, param_omit_table[36] | (param_omit_table[37] << 1) | (param_omit_table[38] << 2) | (param_omit_table[39] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36, param_omit_table[40]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40, param_omit_table[41] | (param_omit_table[42] << 1) | (param_omit_table[43] << 2) | (param_omit_table[44] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52, param_omit_table[45] | (param_omit_table[46] << 1) | (param_omit_table[47] << 2) | (param_omit_table[48] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; -// + // CHECK: template <> struct KernelInfo { // CHECK: template <> struct KernelInfo<::second_namespace::second_kernel> { // CHECK: template <> struct KernelInfo<::third_kernel<1, int, ::point>> { diff --git a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp index bd4a9da6af9ec..c7edccb6f0b27 100644 --- a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp @@ -16,30 +16,26 @@ // CHECK-NEXT: const char* const kernel_names[] = { // CHECK-NEXT: "_ZTSZ4mainE8kernel_A" // CHECK-NEXT: }; - +// // CHECK: static constexpr -// CHECK-NEXT: const bool kernel_param_used[] = { -// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN -// CHECK-NEXT: //kernel_name_1 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //kernel_name_2 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //PARAM_USED_TABLE_END -// CHECK-NEXT: } - +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_A +// CHECK-NEXT: false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; +// // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE8kernel_A -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[1] }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[4] | (param_omit_table[5] << 1) | (param_omit_table[6] << 2) | (param_omit_table[7] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; - // CHECK: static constexpr // CHECK-NEXT: const unsigned kernel_signature_start[] = { // CHECK-NEXT: 0 // _ZTSZ4mainE8kernel_A // CHECK-NEXT: }; - // CHECK: template <> struct KernelInfo { #include diff --git a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp index 484abdd5e3382..e6096bc2397ae 100644 --- a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp @@ -18,20 +18,18 @@ // CHECK-NEXT: }; // CHECK: static constexpr -// CHECK-NEXT: const bool kernel_param_used[] = { -// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN -// CHECK-NEXT: //kernel_name_1 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //kernel_name_2 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //PARAM_USED_TABLE_END -// CHECK-NEXT: } +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C +// CHECK-NEXT: false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, kernel_param_used[1] }, +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[4] | (param_omit_table[5] << 1) | (param_omit_table[6] << 2) | (param_omit_table[7] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp index b81b99f3a9afd..f215b3a8417f0 100755 --- a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp @@ -17,23 +17,21 @@ // CHECK-NEXT: }; // CHECK: static constexpr -// CHECK-NEXT: const bool kernel_param_used[] = { -// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN -// CHECK-NEXT: //kernel_name_1 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //kernel_name_2 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //PARAM_USED_TABLE_END -// CHECK-NEXT: } +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B +// CHECK-NEXT: false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, kernel_param_used[2] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, kernel_param_used[3] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, kernel_param_used[4] }, +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[0]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, param_omit_table[1]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, param_omit_table[2]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, param_omit_table[3]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, param_omit_table[4]}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/struct_kernel_param.cpp b/clang/test/CodeGenSYCL/struct_kernel_param.cpp index 44d8611906e16..54c86555e2ea1 100644 --- a/clang/test/CodeGenSYCL/struct_kernel_param.cpp +++ b/clang/test/CodeGenSYCL/struct_kernel_param.cpp @@ -1,17 +1,31 @@ // RUN: %clang_cc1 -I %S/Inputs -fsycl -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -fsycl-int-header=%t.h %s -o %t.out // RUN: FileCheck -input-file=%t.h %s -// CHECK: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, kernel_param_used[1] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, kernel_param_used[2] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, kernel_param_used[3] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24, kernel_param_used[4] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28, kernel_param_used[5] }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32, kernel_param_used[6] }, +// CHECK: static constexpr +// CHECK-NEXT: const char* const kernel_names[] = { +// CHECK-NEXT: "_ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel" +// CHECK-NEXT: }; + +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; + +// CHECK: static constexpr +// CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { +// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, param_omit_table[4]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, param_omit_table[5]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, param_omit_table[6]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24, param_omit_table[7]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28, param_omit_table[8]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32, param_omit_table[9]}, // CHECK-EMPTY: -// CHECK-NEXT:}; +// CHECK-NEXT: }; // This test checks if compiler accepts structures as kernel parameters. diff --git a/clang/test/CodeGenSYCL/usm-int-header.cpp b/clang/test/CodeGenSYCL/usm-int-header.cpp index a5c5c7fe4433a..5702bb3398389 100644 --- a/clang/test/CodeGenSYCL/usm-int-header.cpp +++ b/clang/test/CodeGenSYCL/usm-int-header.cpp @@ -2,8 +2,8 @@ // RUN: %clang_cc1 -I %S/Inputs -fsycl -fsycl -fsycl-is-device -fsycl-int-header=%t.h %s -o %t.out // RUN: FileCheck -input-file=%t.h %s --check-prefix=INT-HEADER -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0, kernel_param_used[0] }, -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8, kernel_param_used[1] }, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0, param_omit_table[0]}, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8, param_omit_table[1]}, //==--usm-int-header.cpp - USM kernel param aspace and int header test -----==// // diff --git a/clang/test/CodeGenSYCL/wrapped-accessor.cpp b/clang/test/CodeGenSYCL/wrapped-accessor.cpp index 0fab440298002..8f20ae624dc53 100644 --- a/clang/test/CodeGenSYCL/wrapped-accessor.cpp +++ b/clang/test/CodeGenSYCL/wrapped-accessor.cpp @@ -15,19 +15,17 @@ // CHECK-NEXT: }; // CHECK: static constexpr -// CHECK-NEXT: const bool kernel_param_used[] = { -// CHECK-NEXT: //PARAM_USED_TABLE_BEGIN -// CHECK-NEXT: //kernel_name_1 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //kernel_name_2 -// CHECK-NEXT: true, true, true -// CHECK-NEXT: //PARAM_USED_TABLE_END -// CHECK-NEXT: } +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access +// CHECK-NEXT: false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, kernel_param_used[0] }, +// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/sycl/include/CL/sycl/detail/kernel_desc.hpp b/sycl/include/CL/sycl/detail/kernel_desc.hpp index 425c64689925f..3bf9b02d69a84 100644 --- a/sycl/include/CL/sycl/detail/kernel_desc.hpp +++ b/sycl/include/CL/sycl/detail/kernel_desc.hpp @@ -42,8 +42,8 @@ struct kernel_param_desc_t { // offset of the captured value of the parameter in the lambda or function // object int offset; - // bool to mark kernel parameters that are used - bool kernelParamUsed; + // bitfield to mark kernel parameters that will be omitted + unsigned char kernel_param_omitted : 1; }; // Translates specialization constant type to its name. From f41a03f2c76ad5105c1a591cfc2409ebb0d5b4d7 Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Sat, 1 Aug 2020 19:25:46 -0700 Subject: [PATCH 5/7] clang-format-fix --- clang/lib/Sema/SemaSYCL.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 1b3ffd2a27fc7..fd14c769bde94 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1821,7 +1821,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { getNumOpenCLParams(AccTy)); return true; } - + bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { const auto *SamplerTy = FieldTy->getAsCXXRecordDecl(); assert(SamplerTy && "Sampler type must be a C++ record type"); @@ -2705,7 +2705,7 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { for (const KernelDesc &K : KernelDescs) { O << " //--- " << K.Name << "\n"; O << " "; - for (const KernelParamDesc &P : K.Params) + for (const KernelParamDesc &P : K.Params) for (unsigned J = 0; J < P.NumOpenCLParams; J++) O << "false, "; O << "\n"; From adb0a54bb41e69c0dedc6952dd677a7d334cc8dc Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Mon, 3 Aug 2020 06:47:35 -0700 Subject: [PATCH 6/7] Review fixes --- clang/lib/Sema/SemaSYCL.cpp | 23 ++++++++------------- sycl/include/CL/sycl/detail/kernel_desc.hpp | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index fd14c769bde94..7efd3fc29d120 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1774,7 +1774,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { ArgTy = CAT->getElementType(); Size = SemaRef.getASTContext().getTypeSizeInChars(ArgTy).getQuantity(); Header.addParamDesc(Kind, static_cast(Size), - static_cast(CurOffset), 1); + static_cast(CurOffset), + /*NumOpenCLParams=*/1); } public: @@ -1785,14 +1786,11 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.startKernel(Name, NameType, StableName, KernelObj->getLocation()); } - unsigned getNumOpenCLParams(const CXXRecordDecl *SamplerOrAccessorTy) { - assert(SamplerOrAccessorTy && - "Sampler/Accessor type must be a C++ record type"); - CXXMethodDecl *InitMethod = - getMethodByName(SamplerOrAccessorTy, InitMethodName); - assert(InitMethod && "sampler/accessor must have __init method"); - unsigned NumOpenCLParams; - return NumOpenCLParams = InitMethod->param_size(); + unsigned getNumOpenCLParams(const CXXRecordDecl *AccessorTy) { + assert(AccessorTy && "Accessor type must be a C++ record type"); + CXXMethodDecl *InitMethod = getMethodByName(AccessorTy, InitMethodName); + assert(InitMethod && "accessor must have __init method"); + return InitMethod->param_size(); } bool handleSyclAccessorType(const CXXBaseSpecifier &BC, @@ -2726,14 +2724,11 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { O << " { kernel_param_kind_t::" << TyStr << ", "; O << P.Info << ", " << P.Offset << ", "; O << "param_omit_table[" << CurIndex << "]"; + ++CurIndex; for (unsigned X = 1; X < P.NumOpenCLParams; X++) { + O << " | (param_omit_table[" << CurIndex << "] << " << X << ")"; ++CurIndex; - if (X < P.NumOpenCLParams) - O << " | "; - O << "(param_omit_table[" << CurIndex << "]" - << " << " << X << ")"; } - ++CurIndex; O << "}"; O << ",\n"; } diff --git a/sycl/include/CL/sycl/detail/kernel_desc.hpp b/sycl/include/CL/sycl/detail/kernel_desc.hpp index 3bf9b02d69a84..1b6fcd194d1c4 100644 --- a/sycl/include/CL/sycl/detail/kernel_desc.hpp +++ b/sycl/include/CL/sycl/detail/kernel_desc.hpp @@ -43,7 +43,7 @@ struct kernel_param_desc_t { // object int offset; // bitfield to mark kernel parameters that will be omitted - unsigned char kernel_param_omitted : 1; + unsigned char kernel_param_omitted; }; // Translates specialization constant type to its name. From 45a33b03fade0c8b4032cb2372cf20bc0f14ff3e Mon Sep 17 00:00:00 2001 From: Srividya Sundaram Date: Mon, 3 Aug 2020 08:34:07 -0700 Subject: [PATCH 7/7] Update comment --- clang/include/clang/Sema/Sema.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 49ddc2f7eae13..b7cbc56e5c988 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -359,7 +359,7 @@ class SYCLIntegrationHeader { int Info = 0; // Offset of the captured parameter value in the lambda or function object. unsigned Offset = 0; - // NumOpenCLParams to capture number of parameters in Accessor/Sampler init + // NumOpenCLParams to capture number of parameters in Accessor __init // method. unsigned NumOpenCLParams = 1; };