Skip to content

Commit 19c9eb1

Browse files
YixingZhang007jsji
authored andcommitted
Add support for offset load/store (#2804)
Add a new form of load/store operations for cooperative matrices that accepts two separate arguments: the row index and the column index. Unlike the original approach requiring a pointer to the matrix base, this new form of load/store operations is expected to yield better optimized code on 2dblock read/write instructions on PVC. CapabilityCooperativeMatrixOffsetInstructionsINTEL = 6238 OpCooperativeMatrixLoadOffsetINTEL = 6239 OpCooperativeMatrixStoreOffsetINTEL = 6240 Spec: #12497 Original commit: KhronosGroup/SPIRV-LLVM-Translator@193661c352de3ca
1 parent da8e07e commit 19c9eb1

File tree

7 files changed

+185
-0
lines changed

7 files changed

+185
-0
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3738,6 +3738,7 @@ Instruction *SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI,
37383738
case internal::OpJointMatrixLoadINTEL:
37393739
case OpCooperativeMatrixLoadKHR:
37403740
case internal::OpCooperativeMatrixLoadCheckedINTEL:
3741+
case internal::OpCooperativeMatrixLoadOffsetINTEL:
37413742
case internal::OpTaskSequenceCreateINTEL:
37423743
case internal::OpConvertHandleToImageINTEL:
37433744
case internal::OpConvertHandleToSampledImageINTEL:

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEnum.h

+2
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ template <> inline void SPIRVMap<SPIRVCapabilityKind, SPIRVCapVec>::init() {
221221
{CapabilityCooperativeMatrixKHR});
222222
ADD_VEC_INIT(internal::CapabilityCooperativeMatrixCheckedInstructionsINTEL,
223223
{CapabilityCooperativeMatrixKHR});
224+
ADD_VEC_INIT(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL,
225+
{CapabilityCooperativeMatrixKHR});
224226
}
225227

226228
template <> inline void SPIRVMap<SPIRVExecutionModelKind, SPIRVCapVec>::init() {

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

+20
Original file line numberDiff line numberDiff line change
@@ -3705,6 +3705,26 @@ _SPIRV_OP(CooperativeMatrixStoreChecked, false, 8, true, 8)
37053705
_SPIRV_OP(CooperativeMatrixConstructChecked, true, 8)
37063706
#undef _SPIRV_OP
37073707

3708+
class SPIRVCooperativeMatrixOffsetInstructionsINTELInstBase
3709+
: public SPIRVInstTemplateBase {
3710+
protected:
3711+
std::optional<ExtensionID> getRequiredExtension() const override {
3712+
return ExtensionID::SPV_INTEL_joint_matrix;
3713+
}
3714+
SPIRVCapVec getRequiredCapability() const override {
3715+
return getVec(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL);
3716+
}
3717+
};
3718+
3719+
#define _SPIRV_OP(x, ...) \
3720+
typedef SPIRVInstTemplate< \
3721+
SPIRVCooperativeMatrixOffsetInstructionsINTELInstBase, \
3722+
internal::Op##x##INTEL, __VA_ARGS__> \
3723+
SPIRV##x##INTEL;
3724+
_SPIRV_OP(CooperativeMatrixLoadOffset, true, 8, true, 5)
3725+
_SPIRV_OP(CooperativeMatrixStoreOffset, false, 7, true, 6)
3726+
#undef _SPIRV_OP
3727+
37083728
class SPIRVCooperativeMatrixInvocationInstructionsINTELInstBase
37093729
: public SPIRVInstTemplateBase {
37103730
protected:

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

+2
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
685685
"CooperativeMatrixInvocationInstructionsINTEL");
686686
add(internal::CapabilityCooperativeMatrixCheckedInstructionsINTEL,
687687
"CooperativeMatrixCheckedInstructionsINTEL");
688+
add(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL,
689+
"CooperativeMatrixOffsetInstructionsINTEL");
688690
add(internal::CapabilitySubgroupRequirementsINTEL,
689691
"SubgroupRequirementsINTEL");
690692
add(internal::CapabilityTaskSequenceINTEL, "TaskSequenceINTEL");

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ _SPIRV_OP_INTERNAL(CooperativeMatrixStoreCheckedINTEL,
2424
internal::OpCooperativeMatrixStoreCheckedINTEL)
2525
_SPIRV_OP_INTERNAL(CooperativeMatrixConstructCheckedINTEL,
2626
internal::OpCooperativeMatrixConstructCheckedINTEL)
27+
_SPIRV_OP_INTERNAL(CooperativeMatrixLoadOffsetINTEL,
28+
internal::OpCooperativeMatrixLoadOffsetINTEL)
29+
_SPIRV_OP_INTERNAL(CooperativeMatrixStoreOffsetINTEL,
30+
internal::OpCooperativeMatrixStoreOffsetINTEL)
2731
_SPIRV_OP_INTERNAL(CooperativeMatrixApplyFunctionINTEL,
2832
internal::OpCooperativeMatrixApplyFunctionINTEL)
2933
_SPIRV_OP_INTERNAL(ComplexFMulINTEL, internal::ComplexFMulINTEL)

llvm-spirv/lib/SPIRV/libSPIRV/spirv_internal.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ enum InternalOp {
7777
IOpCooperativeMatrixLoadCheckedINTEL = 6193,
7878
IOpCooperativeMatrixStoreCheckedINTEL = 6194,
7979
IOpCooperativeMatrixConstructCheckedINTEL = 6195,
80+
IOpCooperativeMatrixLoadOffsetINTEL = 6239,
81+
IOpCooperativeMatrixStoreOffsetINTEL = 6240,
8082
IOpJointMatrixWorkItemLengthINTEL = 6410,
8183
IOpTypeTaskSequenceINTEL = 6199,
8284
IOpComplexFMulINTEL = 6415,
@@ -114,6 +116,7 @@ enum InternalCapability {
114116
ICapGlobalVariableDecorationsINTEL = 6146,
115117
ICapabilityTaskSequenceINTEL = 6162,
116118
ICapabilityCooperativeMatrixCheckedInstructionsINTEL = 6192,
119+
ICapabilityCooperativeMatrixOffsetInstructionsINTEL = 6238,
117120
ICapabilityCooperativeMatrixPrefetchINTEL = 6411,
118121
ICapabilityComplexFloatMulDivINTEL = 6414,
119122
ICapabilityTensorFloat32RoundingINTEL = 6425,
@@ -187,6 +190,10 @@ _SPIRV_OP(Op, CooperativeMatrixLoadCheckedINTEL)
187190
_SPIRV_OP(Op, CooperativeMatrixStoreCheckedINTEL)
188191
_SPIRV_OP(Op, CooperativeMatrixConstructCheckedINTEL)
189192

193+
_SPIRV_OP(Capability, CooperativeMatrixOffsetInstructionsINTEL)
194+
_SPIRV_OP(Op, CooperativeMatrixLoadOffsetINTEL)
195+
_SPIRV_OP(Op, CooperativeMatrixStoreOffsetINTEL)
196+
190197
_SPIRV_OP(Capability, CooperativeMatrixInvocationInstructionsINTEL)
191198
_SPIRV_OP(Op, CooperativeMatrixApplyFunctionINTEL)
192199

0 commit comments

Comments
 (0)