Skip to content

Commit

Permalink
[SYCL] Enable SYCL integration header support with kernel arg optimiz…
Browse files Browse the repository at this point in the history
…ation table
  • Loading branch information
srividya-sundaram committed Aug 2, 2020
1 parent 3b7e3d7 commit b800ac2
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 130 deletions.
9 changes: 5 additions & 4 deletions clang/include/clang/Sema/Sema.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
77 changes: 48 additions & 29 deletions clang/lib/Sema/SemaSYCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1765,14 +1765,16 @@ 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);
if (CAT)
ArgTy = CAT->getElementType();
Size = SemaRef.getASTContext().getTypeSizeInChars(ArgTy).getQuantity();
Header.addParamDesc(Kind, static_cast<unsigned>(Size),
static_cast<unsigned>(CurOffset));
static_cast<unsigned>(CurOffset), 1);
}

public:
Expand All @@ -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 =
Expand All @@ -1792,7 +1804,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
int Dims = static_cast<int>(
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;
}

Expand All @@ -1804,20 +1817,21 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
int Dims = static_cast<int>(
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;
}
Expand Down Expand Up @@ -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";
}
Expand Down Expand Up @@ -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() {
Expand Down
73 changes: 39 additions & 34 deletions clang/test/CodeGenSYCL/integration_header.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<class first_kernel> {
// CHECK: template <> struct KernelInfo<::second_namespace::second_kernel<char>> {
// CHECK: template <> struct KernelInfo<::third_kernel<1, int, ::point<X>>> {
Expand Down
24 changes: 10 additions & 14 deletions clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<class kernel_A> {

#include <sycl.hpp>
Expand Down
20 changes: 9 additions & 11 deletions clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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: };

Expand Down
26 changes: 12 additions & 14 deletions clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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: };

Expand Down
Loading

0 comments on commit b800ac2

Please sign in to comment.