Skip to content

Commit 193661c

Browse files
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: intel/llvm#12497
1 parent 112caf9 commit 193661c

File tree

7 files changed

+185
-0
lines changed

7 files changed

+185
-0
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3705,6 +3705,7 @@ Instruction *SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI,
37053705
case internal::OpJointMatrixLoadINTEL:
37063706
case OpCooperativeMatrixLoadKHR:
37073707
case internal::OpCooperativeMatrixLoadCheckedINTEL:
3708+
case internal::OpCooperativeMatrixLoadOffsetINTEL:
37083709
case internal::OpTaskSequenceCreateINTEL:
37093710
case internal::OpConvertHandleToImageINTEL:
37103711
case internal::OpConvertHandleToSampledImageINTEL:

lib/SPIRV/libSPIRV/SPIRVEnum.h

Lines changed: 2 additions & 0 deletions
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() {

lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3730,6 +3730,26 @@ _SPIRV_OP(CooperativeMatrixStoreChecked, false, 8, true, 8)
37303730
_SPIRV_OP(CooperativeMatrixConstructChecked, true, 8)
37313731
#undef _SPIRV_OP
37323732

3733+
class SPIRVCooperativeMatrixOffsetInstructionsINTELInstBase
3734+
: public SPIRVInstTemplateBase {
3735+
protected:
3736+
std::optional<ExtensionID> getRequiredExtension() const override {
3737+
return ExtensionID::SPV_INTEL_joint_matrix;
3738+
}
3739+
SPIRVCapVec getRequiredCapability() const override {
3740+
return getVec(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL);
3741+
}
3742+
};
3743+
3744+
#define _SPIRV_OP(x, ...) \
3745+
typedef SPIRVInstTemplate< \
3746+
SPIRVCooperativeMatrixOffsetInstructionsINTELInstBase, \
3747+
internal::Op##x##INTEL, __VA_ARGS__> \
3748+
SPIRV##x##INTEL;
3749+
_SPIRV_OP(CooperativeMatrixLoadOffset, true, 8, true, 5)
3750+
_SPIRV_OP(CooperativeMatrixStoreOffset, false, 7, true, 6)
3751+
#undef _SPIRV_OP
3752+
37333753
class SPIRVCooperativeMatrixInvocationInstructionsINTELInstBase
37343754
: public SPIRVInstTemplateBase {
37353755
protected:

lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
671671
"CooperativeMatrixInvocationInstructionsINTEL");
672672
add(internal::CapabilityCooperativeMatrixCheckedInstructionsINTEL,
673673
"CooperativeMatrixCheckedInstructionsINTEL");
674+
add(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL,
675+
"CooperativeMatrixOffsetInstructionsINTEL");
674676
add(internal::CapabilitySubgroupRequirementsINTEL,
675677
"SubgroupRequirementsINTEL");
676678
add(internal::CapabilityTaskSequenceINTEL, "TaskSequenceINTEL");

lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 4 additions & 0 deletions
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)

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 7 additions & 0 deletions
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)