Skip to content

Commit 4a6ecd3

Browse files
authored
Add support for SPIR-V extension: SPV_INTEL_media_block_io (#118024)
This changes implements SPV_INTEL_media_block_io extension in SPIR-V backend.
1 parent 5f99eb9 commit 4a6ecd3

File tree

9 files changed

+286
-11
lines changed

9 files changed

+286
-11
lines changed

llvm/docs/SPIRVUsage.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ list of supported SPIR-V extensions, sorted alphabetically by their extension na
165165
- Adds decorations that can be applied to global (module scope) variables.
166166
* - ``SPV_INTEL_global_variable_fpga_decorations``
167167
- Adds decorations that can be applied to global (module scope) variables to help code generation for FPGA devices.
168+
* - ``SPV_INTEL_media_block_io``
169+
- Adds additional subgroup block read and write functionality that allow applications to flexibly specify the width and height of the block to read from or write to a 2D image.
168170
* - ``SPV_INTEL_optnone``
169171
- Adds OptNoneINTEL value for Function Control mask that indicates a request to not optimize the function.
170172
* - ``SPV_INTEL_split_barrier``

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ struct IntelSubgroupsBuiltin {
9191
uint32_t Opcode;
9292
bool IsBlock;
9393
bool IsWrite;
94+
bool IsMedia;
9495
};
9596

9697
#define GET_IntelSubgroupsBuiltins_DECL
@@ -215,6 +216,8 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall) {
215216
// - "__spirv_ReadClockKHR"
216217
// - "__spirv_SubgroupBlockReadINTEL"
217218
// - "__spirv_SubgroupImageBlockReadINTEL"
219+
// - "__spirv_SubgroupImageMediaBlockReadINTEL"
220+
// - "__spirv_SubgroupImageMediaBlockWriteINTEL"
218221
// - "__spirv_Convert"
219222
// - "__spirv_UConvert"
220223
// - "__spirv_SConvert"
@@ -225,7 +228,9 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall) {
225228
static const std::regex SpvWithR(
226229
"(__spirv_(ImageSampleExplicitLod|ImageRead|ImageQuerySizeLod|UDotKHR|"
227230
"SDotKHR|SUDotKHR|SDotAccSatKHR|UDotAccSatKHR|SUDotAccSatKHR|"
228-
"ReadClockKHR|SubgroupBlockReadINTEL|SubgroupImageBlockReadINTEL|Convert|"
231+
"ReadClockKHR|SubgroupBlockReadINTEL|SubgroupImageBlockReadINTEL|"
232+
"SubgroupImageMediaBlockReadINTEL|SubgroupImageMediaBlockWriteINTEL|"
233+
"Convert|"
229234
"UConvert|SConvert|FConvert|SatConvert).*)_R.*");
230235
std::smatch Match;
231236
if (std::regex_match(BuiltinName, Match, SpvWithR) && Match.size() > 2)
@@ -1192,19 +1197,28 @@ static bool generateIntelSubgroupsInst(const SPIRV::IncomingCall *Call,
11921197
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
11931198
MachineFunction &MF = MIRBuilder.getMF();
11941199
const auto *ST = static_cast<const SPIRVSubtarget *>(&MF.getSubtarget());
1195-
if (!ST->canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1200+
const SPIRV::IntelSubgroupsBuiltin *IntelSubgroups =
1201+
SPIRV::lookupIntelSubgroupsBuiltin(Builtin->Name);
1202+
1203+
if (IntelSubgroups->IsMedia &&
1204+
!ST->canUseExtension(SPIRV::Extension::SPV_INTEL_media_block_io)) {
1205+
std::string DiagMsg = std::string(Builtin->Name) +
1206+
": the builtin requires the following SPIR-V "
1207+
"extension: SPV_INTEL_media_block_io";
1208+
report_fatal_error(DiagMsg.c_str(), false);
1209+
} else if (!IntelSubgroups->IsMedia &&
1210+
!ST->canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
11961211
std::string DiagMsg = std::string(Builtin->Name) +
11971212
": the builtin requires the following SPIR-V "
11981213
"extension: SPV_INTEL_subgroups";
11991214
report_fatal_error(DiagMsg.c_str(), false);
12001215
}
1201-
const SPIRV::IntelSubgroupsBuiltin *IntelSubgroups =
1202-
SPIRV::lookupIntelSubgroupsBuiltin(Builtin->Name);
12031216

12041217
uint32_t OpCode = IntelSubgroups->Opcode;
12051218
if (Call->isSpirvOp()) {
12061219
bool IsSet = OpCode != SPIRV::OpSubgroupBlockWriteINTEL &&
1207-
OpCode != SPIRV::OpSubgroupImageBlockWriteINTEL;
1220+
OpCode != SPIRV::OpSubgroupImageBlockWriteINTEL &&
1221+
OpCode != SPIRV::OpSubgroupImageMediaBlockWriteINTEL;
12081222
return buildOpFromWrapper(MIRBuilder, OpCode, Call,
12091223
IsSet ? GR->getSPIRVTypeID(Call->ReturnType)
12101224
: Register(0));

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,14 +1156,19 @@ class IntelSubgroupsBuiltin<string name, Op operation> {
11561156
string Name = name;
11571157
Op Opcode = operation;
11581158
bit IsBlock = !or(!eq(operation, OpSubgroupBlockReadINTEL),
1159-
!eq(operation, OpSubgroupBlockWriteINTEL));
1160-
bit IsWrite = !eq(operation, OpSubgroupBlockWriteINTEL);
1159+
!eq(operation, OpSubgroupBlockWriteINTEL),
1160+
!eq(operation, OpSubgroupImageMediaBlockReadINTEL),
1161+
!eq(operation, OpSubgroupImageMediaBlockWriteINTEL));
1162+
bit IsWrite = !or(!eq(operation, OpSubgroupBlockWriteINTEL),
1163+
!eq(operation, OpSubgroupImageMediaBlockWriteINTEL));
1164+
bit IsMedia = !or(!eq(operation, OpSubgroupImageMediaBlockReadINTEL),
1165+
!eq(operation, OpSubgroupImageMediaBlockWriteINTEL));
11611166
}
11621167

11631168
// Table gathering all the Intel sub group builtins.
11641169
def IntelSubgroupsBuiltins : GenericTable {
11651170
let FilterClass = "IntelSubgroupsBuiltin";
1166-
let Fields = ["Name", "Opcode", "IsBlock", "IsWrite"];
1171+
let Fields = ["Name", "Opcode", "IsBlock", "IsWrite", "IsMedia"];
11671172
}
11681173

11691174
// Function to lookup group builtins by their name and set.
@@ -1191,17 +1196,24 @@ foreach i = ["", "2", "4", "8"] in {
11911196
// cl_intel_subgroups_short
11921197
defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_read_ui", i), 1, 2, OpSubgroupBlockReadINTEL>;
11931198
defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_write_ui", i), 2, 3, OpSubgroupBlockWriteINTEL>;
1199+
// cl_intel_media_block_io
1200+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_read", i), 4, 4, OpSubgroupImageMediaBlockReadINTEL>;
1201+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_read_ui", i), 4, 4, OpSubgroupImageMediaBlockReadINTEL>;
1202+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_write", i), 5, 5, OpSubgroupImageMediaBlockWriteINTEL>;
1203+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_write_ui", i), 5, 5, OpSubgroupImageMediaBlockWriteINTEL>;
11941204
}
1195-
// cl_intel_subgroups_char, cl_intel_subgroups_short, cl_intel_subgroups_long
1205+
// cl_intel_subgroups_char, cl_intel_subgroups_short, cl_intel_subgroups_long, cl_intel_media_block_io
11961206
foreach i = ["", "2", "4", "8", "16"] in {
11971207
foreach j = ["c", "s", "l"] in {
11981208
defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_read_u", j, i), 1, 2, OpSubgroupBlockReadINTEL>;
11991209
defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_write_u", j, i), 2, 3, OpSubgroupBlockWriteINTEL>;
1210+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_read_u", j, i), 4, 4, OpSubgroupImageMediaBlockReadINTEL>;
1211+
defm : DemangledIntelSubgroupsBuiltin<!strconcat("media_block_write_u", j, i), 5, 5, OpSubgroupImageMediaBlockWriteINTEL>;
12001212
}
12011213
}
12021214
// OpSubgroupImageBlockReadINTEL and OpSubgroupImageBlockWriteINTEL are to be resolved later on (in code)
12031215

1204-
// Multiclass used to define builtin wrappers for the SPV_INTEL_subgroups extension.
1216+
// Multiclass used to define builtin wrappers for the SPV_INTEL_subgroups and the SPV_INTEL_media_block_io extensions.
12051217
multiclass DemangledIntelSubgroupsBuiltinWrapper<string name, bits<8> numArgs, Op operation> {
12061218
def : DemangledBuiltin<!strconcat("__spirv_", name), OpenCL_std, IntelSubgroups, numArgs, numArgs>;
12071219
def : IntelSubgroupsBuiltin<!strconcat("__spirv_", name), operation>;
@@ -1215,6 +1227,8 @@ defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupBlockReadINTEL", 1, OpSubg
12151227
defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupBlockWriteINTEL", 2, OpSubgroupBlockWriteINTEL>;
12161228
defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageBlockReadINTEL", 2, OpSubgroupImageBlockReadINTEL>;
12171229
defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageBlockWriteINTEL", 3, OpSubgroupImageBlockWriteINTEL>;
1230+
defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageMediaBlockReadINTEL", 4, OpSubgroupImageMediaBlockReadINTEL>;
1231+
defm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageMediaBlockWriteINTEL", 5, OpSubgroupImageMediaBlockWriteINTEL>;
12181232

12191233
//===----------------------------------------------------------------------===//
12201234
// Class defining a builtin for group operations within uniform control flow.

llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
4848
SPIRV::Extension::Extension::SPV_INTEL_split_barrier},
4949
{"SPV_INTEL_subgroups",
5050
SPIRV::Extension::Extension::SPV_INTEL_subgroups},
51+
{"SPV_INTEL_media_block_io",
52+
SPIRV::Extension::Extension::SPV_INTEL_media_block_io},
5153
{"SPV_KHR_uniform_group_instructions",
5254
SPIRV::Extension::Extension::SPV_KHR_uniform_group_instructions},
5355
{"SPV_KHR_no_integer_wrap_decoration",

llvm/lib/Target/SPIRV/SPIRVInstrInfo.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,12 @@ def OpSubgroupImageBlockReadINTEL: Op<5577, (outs ID:$res), (ins TYPE:$type, ID:
850850
def OpSubgroupImageBlockWriteINTEL: Op<5578, (outs), (ins ID:$image, ID:$coordinate, ID:$data),
851851
"OpSubgroupImageBlockWriteINTEL $image $coordinate $data">;
852852

853+
// SPV_INTEL_media_block_io
854+
def OpSubgroupImageMediaBlockReadINTEL: Op<5580, (outs ID:$res), (ins TYPE:$type, ID:$image, ID:$coordinate, ID:$width, ID:$height),
855+
"$res = OpSubgroupImageMediaBlockReadINTEL $type $image $coordinate $width $height">;
856+
def OpSubgroupImageMediaBlockWriteINTEL: Op<5581, (outs), (ins ID:$image, ID:$coordinate, ID:$width, ID:$height, ID:$data),
857+
"OpSubgroupImageMediaBlockWriteINTEL $image $coordinate $width $height $data">;
858+
853859
// - SPV_KHR_uniform_group_instructions
854860
def OpGroupIMulKHR: Op<6401, (outs ID:$res), (ins TYPE:$type, ID:$scope, i32imm:$groupOp, ID:$value),
855861
"$res = OpGroupIMulKHR $type $scope $groupOp $value">;

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,13 @@ void addInstrRequirements(const MachineInstr &MI,
13201320
Reqs.addCapability(SPIRV::Capability::SubgroupImageBlockIOINTEL);
13211321
}
13221322
break;
1323+
case SPIRV::OpSubgroupImageMediaBlockReadINTEL:
1324+
case SPIRV::OpSubgroupImageMediaBlockWriteINTEL:
1325+
if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_media_block_io)) {
1326+
Reqs.addExtension(SPIRV::Extension::SPV_INTEL_media_block_io);
1327+
Reqs.addCapability(SPIRV::Capability::SubgroupImageMediaBlockIOINTEL);
1328+
}
1329+
break;
13231330
case SPIRV::OpAssumeTrueKHR:
13241331
case SPIRV::OpExpectKHR:
13251332
if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume)) {

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ defm RayTracingNV : CapabilityOperand<5340, 0, 0, [], [Shader]>;
446446
defm SubgroupShuffleINTEL : CapabilityOperand<5568, 0, 0, [SPV_INTEL_subgroups], []>;
447447
defm SubgroupBufferBlockIOINTEL : CapabilityOperand<5569, 0, 0, [SPV_INTEL_subgroups], []>;
448448
defm SubgroupImageBlockIOINTEL : CapabilityOperand<5570, 0, 0, [SPV_INTEL_subgroups], []>;
449-
defm SubgroupImageMediaBlockIOINTEL : CapabilityOperand<5579, 0, 0, [], []>;
449+
defm SubgroupImageMediaBlockIOINTEL : CapabilityOperand<5579, 0, 0, [SPV_INTEL_media_block_io], []>;
450450
defm SubgroupAvcMotionEstimationINTEL : CapabilityOperand<5696, 0, 0, [], []>;
451451
defm SubgroupAvcMotionEstimationIntraINTEL : CapabilityOperand<5697, 0, 0, [], []>;
452452
defm SubgroupAvcMotionEstimationChromaINTEL : CapabilityOperand<5698, 0, 0, [], []>;

0 commit comments

Comments
 (0)