Skip to content

Commit 43acfef

Browse files
authored
Add support for SPV_INTEL_subgroup_requirements (#2317)
Spec: intel/llvm#11301 More accurately, this PR adds support for the named subgroup related features of SPV_INTEL_subgroup_requirements to support implementation of sycl_ext_named_sub_group_sizes (also see intel/llvm#12335). The features related to subgroup lane mapping are not added yet.
1 parent a31a0a6 commit 43acfef

File tree

10 files changed

+98
-2
lines changed

10 files changed

+98
-2
lines changed

include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,4 @@ EXT(SPV_INTEL_fpga_argument_interfaces)
6969
EXT(SPV_INTEL_fpga_latency_control)
7070
EXT(SPV_INTEL_fp_max_error)
7171
EXT(SPV_INTEL_cache_controls)
72+
EXT(SPV_INTEL_subgroup_requirements)

lib/SPIRV/PreprocessMetadata.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,19 @@ void PreprocessMetadataBase::visit(Module *M) {
167167

168168
// !{void (i32 addrspace(1)*)* @kernel, i32 35, i32 size}
169169
if (MDNode *ReqdSubgroupSize = Kernel.getMetadata(kSPIR2MD::SubgroupSize)) {
170+
// A primary named subgroup size is encoded as
171+
// the metadata intel_reqd_sub_group_size with value 0.
172+
auto Val = getMDOperandAsInt(ReqdSubgroupSize, 0);
173+
if (Val == 0)
174+
EM.addOp()
175+
.add(&Kernel)
176+
.add(spv::internal::ExecutionModeNamedSubgroupSizeINTEL)
177+
.add(/* PrimarySubgroupSizeINTEL = */ 0U)
178+
.done();
170179
EM.addOp()
171180
.add(&Kernel)
172181
.add(spv::ExecutionModeSubgroupSize)
173-
.add(getMDOperandAsInt(ReqdSubgroupSize, 0))
182+
.add(Val)
174183
.done();
175184
}
176185

lib/SPIRV/SPIRVReader.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4240,6 +4240,18 @@ bool SPIRVToLLVM::transMetadata() {
42404240
ConstantAsMetadata::get(getUInt32(M, EM->getLiterals()[0]));
42414241
F->setMetadata(kSPIR2MD::SubgroupSize, MDNode::get(*Context, SizeMD));
42424242
}
4243+
// Generate metadata for intel_reqd_sub_group_size
4244+
if (BF->getExecutionMode(internal::ExecutionModeNamedSubgroupSizeINTEL)) {
4245+
// For now, there is only one named sub group size: primary, which is
4246+
// represented as a value of 0 as the argument of the OpExecutionMode.
4247+
assert(BF->getExecutionMode(internal::ExecutionModeNamedSubgroupSizeINTEL)
4248+
->getLiterals()[0] == 0 &&
4249+
"Invalid named sub group size");
4250+
// On the LLVM IR side, this is represented as the metadata
4251+
// intel_reqd_sub_group_size with value 0.
4252+
auto *SizeMD = ConstantAsMetadata::get(getUInt32(M, 0));
4253+
F->setMetadata(kSPIR2MD::SubgroupSize, MDNode::get(*Context, SizeMD));
4254+
}
42434255
// Generate metadata for max_work_group_size
42444256
if (auto *EM = BF->getExecutionMode(ExecutionModeMaxWorkgroupSizeINTEL)) {
42454257
F->setMetadata(kSPIR2MD::MaxWGSize,

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5835,6 +5835,12 @@ bool LLVMToSPIRVBase::transExecutionMode() {
58355835
BF->addExecutionMode(BM->add(new SPIRVExecutionMode(
58365836
OpExecutionMode, BF, static_cast<ExecutionMode>(EMode))));
58375837
} break;
5838+
case spv::internal::ExecutionModeNamedSubgroupSizeINTEL: {
5839+
if (!BM->isAllowedToUseExtension(
5840+
ExtensionID::SPV_INTEL_subgroup_requirements))
5841+
break;
5842+
AddSingleArgExecutionMode(static_cast<ExecutionMode>(EMode));
5843+
} break;
58385844
default:
58395845
llvm_unreachable("invalid execution mode");
58405846
}

lib/SPIRV/libSPIRV/SPIRVEntry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ void SPIRVExecutionMode::decode(std::istream &I) {
660660
case ExecutionModeSchedulerTargetFmaxMhzINTEL:
661661
case ExecutionModeRegisterMapInterfaceINTEL:
662662
case ExecutionModeStreamingInterfaceINTEL:
663+
case spv::internal::ExecutionModeNamedSubgroupSizeINTEL:
663664
WordLiterals.resize(1);
664665
break;
665666
default:

lib/SPIRV/libSPIRV/SPIRVEntry.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,8 @@ class SPIRVCapability : public SPIRVEntryNoId<OpCapability> {
885885
return ExtensionID::SPV_INTEL_vector_compute;
886886
case internal::CapabilityFastCompositeINTEL:
887887
return ExtensionID::SPV_INTEL_fast_composite;
888+
case internal::CapabilitySubgroupRequirementsINTEL:
889+
return ExtensionID::SPV_INTEL_subgroup_requirements;
888890
default:
889891
return {};
890892
}

lib/SPIRV/libSPIRV/SPIRVEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ template <> inline void SPIRVMap<SPIRVExecutionModeKind, SPIRVCapVec>::init() {
291291
{CapabilityFPGAKernelAttributesINTEL});
292292
ADD_VEC_INIT(ExecutionModeNamedBarrierCountINTEL,
293293
{CapabilityVectorComputeINTEL});
294+
ADD_VEC_INIT(internal::ExecutionModeNamedSubgroupSizeINTEL,
295+
{internal::CapabilitySubgroupRequirementsINTEL});
294296
}
295297

296298
template <> inline void SPIRVMap<SPIRVMemoryModelKind, SPIRVCapVec>::init() {

lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
668668
"CooperativeMatrixInvocationInstructionsINTEL");
669669
add(internal::CapabilityCooperativeMatrixCheckedInstructionsINTEL,
670670
"CooperativeMatrixCheckedInstructionsINTEL");
671+
add(internal::CapabilitySubgroupRequirementsINTEL,
672+
"SubgroupRequirementsINTEL");
671673
}
672674
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
673675

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,15 @@ enum InternalCapability {
117117
ICapabilityJointMatrixBF16ComponentTypeINTEL = 6437,
118118
ICapabilityJointMatrixPackedInt2ComponentTypeINTEL = 6438,
119119
ICapabilityJointMatrixPackedInt4ComponentTypeINTEL = 6439,
120-
ICapabilityCacheControlsINTEL = 6441
120+
ICapabilityCacheControlsINTEL = 6441,
121+
ICapabilitySubgroupRequirementsINTEL = 6445
121122
};
122123

123124
enum InternalFunctionControlMask { IFunctionControlOptNoneINTELMask = 0x10000 };
124125

125126
enum InternalExecutionMode {
126127
IExecModeFastCompositeKernelINTEL = 6088,
128+
IExecModeNamedSubgroupSizeINTEL = 6446
127129
};
128130

129131
constexpr LinkageType LinkageTypeInternal =
@@ -211,6 +213,8 @@ _SPIRV_OP(Capability, TensorFloat32RoundingINTEL)
211213
_SPIRV_OP(Op, RoundFToTF32INTEL)
212214

213215
_SPIRV_OP(Capability, CacheControlsINTEL)
216+
217+
_SPIRV_OP(Capability, SubgroupRequirementsINTEL)
214218
#undef _SPIRV_OP
215219

216220
constexpr SourceLanguage SourceLanguagePython =
@@ -296,6 +300,9 @@ constexpr FunctionControlMask FunctionControlOptNoneINTELMask =
296300
constexpr ExecutionMode ExecutionModeFastCompositeKernelINTEL =
297301
static_cast<ExecutionMode>(IExecModeFastCompositeKernelINTEL);
298302

303+
constexpr ExecutionMode ExecutionModeNamedSubgroupSizeINTEL =
304+
static_cast<ExecutionMode>(IExecModeNamedSubgroupSizeINTEL);
305+
299306
} // namespace internal
300307
} // namespace spv
301308

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
; RUN: llvm-as < %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_requirements -o %t.spv
3+
; RUN: llvm-spirv %t.spv -to-text -o %t.spt
4+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
5+
6+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
7+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
; RUN: llvm-spirv %t.bc -o %t2.spv
10+
; RUN: llvm-spirv %t2.spv -to-text -o %t2.spt
11+
; RUN: FileCheck < %t2.spt %s --check-prefix=CHECK-SPIRV-2
12+
13+
; RUN: llvm-spirv -r %t2.spv -o %t2.rev.bc
14+
; RUN: llvm-dis < %t2.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
15+
16+
; CHECK-SPIRV: Capability SubgroupRequirementsINTEL
17+
; CHECK-SPIRV: Extension "SPV_INTEL_subgroup_requirements"
18+
; CHECK-SPIRV: EntryPoint 6 [[kernel:[0-9]+]] "_ZTSZ4mainE7Kernel1"
19+
; CHECK-SPIRV: ExecutionMode [[kernel]] 6446 0
20+
21+
; CHECK-LLVM: spir_kernel void @_ZTSZ4mainE7Kernel1() {{.*}} !intel_reqd_sub_group_size ![[MD:[0-9]+]]
22+
; CHECK-LLVM: ![[MD]] = !{i32 0}
23+
24+
; CHECK-SPIRV-2-NOT: Capability SubgroupRequirementsINTEL
25+
; CHECK-SPIRV-2-NOT: Extension "SPV_INTEL_subgroup_requirements"
26+
; CHECK-SPIRV-2: EntryPoint 6 [[kernel:[0-9]+]] "_ZTSZ4mainE7Kernel1"
27+
; CHECK-SPIRV-2: ExecutionMode [[kernel]] 35 0
28+
29+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
30+
target triple = "spir64-unknown-unknown"
31+
32+
$_ZTSZ4mainE7Kernel1 = comdat any
33+
34+
; Function Attrs: mustprogress norecurse nounwind
35+
define weak_odr dso_local spir_kernel void @_ZTSZ4mainE7Kernel1() local_unnamed_addr #0 comdat !srcloc !5 !kernel_arg_buffer_location !6 !sycl_fixed_targets !6 !sycl_kernel_omit_args !6 !intel_reqd_sub_group_size !7 {
36+
entry:
37+
ret void
38+
}
39+
40+
attributes #0 = { mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "sycl-module-id"="ex.cpp" "sycl-optlevel"="2" "sycl-sub-group-size"="0" "uniform-work-group-size"="true" }
41+
42+
!llvm.module.flags = !{!0, !1}
43+
!opencl.spir.version = !{!2}
44+
!spirv.Source = !{!3}
45+
!llvm.ident = !{!4}
46+
47+
!0 = !{i32 1, !"wchar_size", i32 4}
48+
!1 = !{i32 7, !"frame-pointer", i32 2}
49+
!2 = !{i32 1, i32 2}
50+
!3 = !{i32 4, i32 100000}
51+
!4 = !{!"clang version 18.0.0git (/ws/llvm/clang 8fd29b3c2aa9f9ce163be557b51de39c95aaf230)"}
52+
!5 = !{i32 358}
53+
!6 = !{}
54+
!7 = !{i32 0}

0 commit comments

Comments
 (0)