SPIR-V opcodes Constant latency Variable latency (* operand)
OpAtomicXor 254 0
OpAtomicOr 254 0
OpAtomicAnd 254 0
OpAtomicUMax 258 0
OpAtomicSMax 258 0
OpAtomicSMin 258 0
OpAtomicISub 254 0
OpFwidthCoarse 4 0
OpDPdyCoarse 4 0
OpDPdxCoarse 4 0
OpFwidthFine 4 0
OpDPdyFine 4 0
OpDPdxFine 4 0
OpFwidth 4 0
OpDPdy 4 0
OpDPdx 4 0
OpFUnordGreaterThanEqual 4 0
OpFOrdGreaterThanEqual 4 0
OpFUnordLessThanEqual 4 0
OpFOrdLessThanEqual 4 0
OpFUnordGreaterThan 4 0
OpFOrdGreaterThan 4 0
OpFUnordLessThan 4 0
OpFOrdLessThan 4 0
OpFUnordNotEqual 4 0
OpFOrdNotEqual 4 0
OpFUnordEqual 4 0
OpFOrdEqual 4 0
OpSLessThanEqual 4 0
OpULessThanEqual 4 0
OpSLessThan 4 0
OpULessThan 4 0
OpSGreaterThanEqual 4 0
OpUGreaterThanEqual 4 0
OpSGreaterThan 4 0
OpUGreaterThan 4 0
OpINotEqual 4 0
OpIEqual 4 0
OpSelect 2 0
OpLogicalNot 4 0
OpLogicalAnd 4 0
OpLogicalOr 4 0
OpLogicalNotEqual 4 0
OpLogicalEqual 4 0
OpUnordered 4 0
OpOrdered 4 0
OpLessOrGreater 4 0
OpSignBitSet 4 0
OpIsNormal 4 0
OpIsFinite 4 0
OpIsInf 4 0
OpIsNan 4 0
OpAll 4 0
OpAny 4 0
OpBitCount 4 0
OpBitReverse 4 0
OpBitFieldUExtract 4 0
OpBitFieldSExtract 4 0
OpBitFieldInsert 4 0
OpNot 4 0
OpBitwiseAnd 4 0
OpBitwiseXor 4 0
OpBitwiseOr 4 0
OpShiftLeftLogical 4 0
OpShiftRightArithmetic 4 0
OpShiftRightLogical 4 0
OpAtomicFlagClear 254 0
OpSMulExtended 4 0
OpAtomicFlagTestAndSet 254 0
OpUMulExtended 4 0
OpISubBorrow 4 0
OpMatrixTimesVector 16 0
OpVectorTimesMatrix 16 0
OpMatrixTimesScalar 16 0
OpVectorTimesScalar 4 0
OpUMod 4 0
OpFDiv 4 0
OpSDiv 4 0
OpUDiv 4 0
OpFMul 4 0
OpIMul 4 0
OpFSub 4 0
OpISub 4 0
OpFAdd 4 0
OpIAdd 4 0
OpFNegate 4 0
OpSNegate 4 0
OpCompositeExtract 3 0
OpCompositeConstruct 3 0
OpVectorShuffle 3 0
OpVectorInsertDynamic 3 0
OpVectorExtractDynamic 3 0
OpConvertUToPtr 4 0
OpSatConvertUToS 4 0
OpSatConvertSToU 4 0
OpConvertPtrToU 4 0
OpQuantizeToF16 4 0
OpFConvert 4 0
OpSConvert 4 0
OpUConvert 4 0
OpConvertUToF 4 0
OpConvertSToF 4 0
OpConvertFToS 4 0
OpConvertFToU 4 0
OpIAddCarry 4 0
OpImageSparseTexelsResident 4 0
OpImageQuerySamples 2 0
OpImageQueryLevels 2 0
OpImageQueryLod 8 0
OpImageQuerySize 2 0
OpImageQuerySizeLod 8 0
OpImageSparseRead 244 0
OpDot 16 0
OpImageSparseDrefGather 376 0
OpOuterProduct 64 0
OpImageSparseGather 372 0
OpMatrixTimesMatrix 80 0
OpImageSparseFetch 244 0
OpFMod 4 0
OpImageSparseSampleDrefExplicitLod 396 0
OpFRem 4 0
OpImageSparseSampleDrefImplicitLod 396 0
OpSMod 4 0
OpImageSparseSampleExplicitLod 392 0
OpSRem 4 0
OpImageSparseSampleImplicitLod 392 0
OpImageWrite 120 0
OpImageRead 120 0
OpImageDrefGather 252 0
OpImageGather 248 0
OpImageFetch 120 0
OpImageSampleProjDrefExplicitLod 272 0
OpImageSampleProjDrefImplicitLod 272 0
OpImageSampleProjExplicitLod 268 0
OpImageSampleProjImplicitLod 268 0
OpImageSampleDrefExplicitLod 268 0
OpImageSampleDrefImplicitLod 268 0
OpImageSampleExplicitLod 264 0
OpImageSampleImplicitLod 264 0
OpFunctionCall 2 0
OpKill 1 0
OpTranspose 32 0
OpSwitch 4 0
OpCopyObject 2 0
OpBranchConditional 4 0
OpCompositeInsert 3 0
OpBranch 2 0
OpAtomicUMin 258 0
OpInBoundsPtrAccessChain 12 0
OpAtomicIAdd 254 0
OpPtrAccessChain 16 0
OpAtomicIDecrement 254 0
OpInBoundsAccessChain 8 0
OpAtomicIIncrement 254 0
OpAccessChain 12 0
OpAtomicCompareExchangeWeak 253 0
OpCopyMemorySized 4 30
OpAtomicCompareExchange 258 0
OpCopyMemory 240 0
OpAtomicExchange 254 0
OpStore 120 0
OpAtomicStore 130 0
OpLoad 120 0
OpAtomicLoad 130 0
OpImageTexelPointer 8 0
GLSL extension opcodes Constant latency Variable latency (* operand)
GLSLstd450Round 8 0
GLSLstd450RoundEven 8 0
GLSLstd450Trunc 8 0
GLSLstd450FAbs 8 0
GLSLstd450SAbs 8 0
GLSLstd450FSign 8 0
GLSLstd450SSign 8 0
GLSLstd450Floor 8 0
GLSLstd450Ceil 8 0
GLSLstd450Fract 8 0
GLSLstd450Radians 8 0
GLSLstd450Degrees 8 0
GLSLstd450Sin 8 0
GLSLstd450Cos 8 0
GLSLstd450Tan 8 0
GLSLstd450Asin 8 0
GLSLstd450Acos 8 0
GLSLstd450Atan 8 0
GLSLstd450Sinh 8 0
GLSLstd450Cosh 8 0
GLSLstd450Tanh 8 0
GLSLstd450Asinh 8 0
GLSLstd450Acosh 8 0
GLSLstd450Atanh 8 0
GLSLstd450Atan2 8 0
GLSLstd450Pow 20 0
GLSLstd450Exp 20 0
GLSLstd450Log 20 0
GLSLstd450Exp2 8 0
GLSLstd450Log2 8 0
GLSLstd450Sqrt 8 0
GLSLstd450InverseSqrt 8 0
GLSLstd450Determinant 64 0
GLSLstd450MatrixInverse 112 0
GLSLstd450Modf 12 0
GLSLstd450ModfStruct 12 0
GLSLstd450FMin 8 0
GLSLstd450UMin 8 0
GLSLstd450SMin 8 0
GLSLstd450FMax 8 0
GLSLstd450UMax 8 0
GLSLstd450SMax 8 0
GLSLstd450FClamp 8 0
GLSLstd450UClamp 8 0
GLSLstd450SClamp 8 0
GLSLstd450FMix 16 0
GLSLstd450IMix 16 0
GLSLstd450Step 8 0
GLSLstd450SmoothStep 32 0
GLSLstd450Fma 8 0
GLSLstd450Frexp 12 0
GLSLstd450FrexpStruct 12 0
GLSLstd450Ldexp 8 0
GLSLstd450PackSnorm4x8 8 0
GLSLstd450PackUnorm4x8 8 0
GLSLstd450PackSnorm2x16 8 0
GLSLstd450PackUnorm2x16 8 0
GLSLstd450PackHalf2x16 8 0
GLSLstd450PackDouble2x32 8 0
GLSLstd450UnpackSnorm2x16 8 0
GLSLstd450UnpackUnorm2x16 8 0
GLSLstd450UnpackHalf2x16 8 0
GLSLstd450UnpackSnorm4x8 8 0
GLSLstd450UnpackUnorm4x8 8 0
GLSLstd450UnpackDouble2x32 8 0
GLSLstd450Length 24 0
GLSLstd450Distance 28 0
GLSLstd450Cross 100 0
GLSLstd450Normalize 28 0
GLSLstd450FaceForward 18 0
GLSLstd450Reflect 12 0
GLSLstd450Refract 28 0
GLSLstd450FindILsb 8 0
GLSLstd450FindSMsb 8 0
GLSLstd450FindUMsb 8 0
GLSLstd450InterpolateAtCentroid 8 0
GLSLstd450InterpolateAtSample 8 0
GLSLstd450InterpolateAtOffset 8 0
GLSLstd450NMin 8 0
GLSLstd450NMax 8 0
GLSLstd450NClamp 8 0

Rewizja 2 (zad. 4)

Począwszy od zadania nr 4, koszty niektórych instrukcji uległy zmianie. Wynika to z lepszego dopasowania aproksymacji kosztów tych operacji do rzeczywistych GPU. Tabele poniżej zawierają jedynie instrukcje, których koszty uległy zmianom; reszta instrukcji zachowuje się identycznie, jak w rewizjach bazowej i 1.

SPIR-V opcodes Constant latency Variable latency (* operand)
OpFwidthCoarse 36 0
OpDPdyCoarse 20 0
OpDPdxCoarse 20 0
OpFwidthFine 36 0
OpDPdyFine 20 0
OpDPdxFine 20 0
OpFwidth 36 0
OpDPdy 20 0
OpDPdx 20 0
OpConvertUToPtr 0 0
OpConvertPtrToU 0 0
OpSDiv 144 0
OpUDiv 112 0
OpIMul 8 0
OpSMulExtended 16 0
OpUMulExtended 16 0
OpSwitch 16 0
OpBranchConditional 16 0
GLSL extension opcodes (OpExtInst) Constant latency Variable latency (* operand)
GLSLstd450Round 4 0
GLSLstd450RoundEven 4 0
GLSLstd450Trunc 4 0
GLSLstd450FAbs 1 0
GLSLstd450FSign 16 0
GLSLstd450SSign 16 0
GLSLstd450Floor 4 0
GLSLstd450Ceil 4 0
GLSLstd450Fract 4 0
GLSLstd450Radians 4 0
GLSLstd450Degrees 4 0
GLSLstd450Sin 20 0
GLSLstd450Cos 20 0
GLSLstd450Tan 56 0
GLSLstd450Asin 52 0
GLSLstd450Acos 48 0
GLSLstd450Atan 88 0
GLSLstd450Sinh 40 0
GLSLstd450Cosh 40 0
GLSLstd450Tanh 64 0
GLSLstd450Asinh 36 0
GLSLstd450Acosh 36 0
GLSLstd450Atanh 40 0
GLSLstd450Atan2 118 0
GLSLstd450Pow 28 0
GLSLstd450Log 12 0
GLSLstd450Exp2 16 0
GLSLstd450Sqrt 16 0
GLSLstd450InverseSqrt 16 0
GLSLstd450Determinant 160 0
GLSLstd450MatrixInverse 612 0
GLSLstd450Modf 8 0
GLSLstd450ModfStruct 8 0
GLSLstd450FMin 4 0
GLSLstd450UMin 4 0
GLSLstd450SMin 4 0
GLSLstd450FMax 4 0
GLSLstd450UMax 4 0
GLSLstd450SMax 4 0
GLSLstd450FMix 8 0
GLSLstd450IMix 8 0
GLSLstd450SmoothStep 40 0
GLSLstd450Fma 4 0
GLSLstd450Frexp 74 0
GLSLstd450FrexpStruct 74 0
GLSLstd450Ldexp 20 0
GLSLstd450PackSnorm4x8 78 0
GLSLstd450PackUnorm4x8 4 0
GLSLstd450PackSnorm2x16 4 0
GLSLstd450PackUnorm2x16 4 0
GLSLstd450PackHalf2x16 4 0
GLSLstd450PackDouble2x32 16 0
GLSLstd450UnpackSnorm2x16 16 0
GLSLstd450UnpackUnorm2x16 16 0
GLSLstd450UnpackSnorm4x8 50 0
GLSLstd450UnpackUnorm4x8 34 0
GLSLstd450UnpackDouble2x32 16 0
GLSLstd450Length 32 0
GLSLstd450Distance 48 0
GLSLstd450Cross 24 0
GLSLstd450Normalize 48 0
GLSLstd450FaceForward 36 0
GLSLstd450Reflect 24 0
GLSLstd450Refract 84 0
GLSLstd450FindILsb 4 0
GLSLstd450FindSMsb 4 0
GLSLstd450FindUMsb 4 0
GLSLstd450NMin 4 0
GLSLstd450NMax 4 0
GLSLstd450NClamp 8 0

Rewizja 3 (zad. 5)

Począwszy od zadania nr 5, koszty niektórych instrukcji uległy zmianie. Wynika to z lepszego dopasowania aproksymacji kosztów tych operacji do rzeczywistych GPU. Tabele poniżej zawierają jedynie instrukcje, których koszty uległy zmianom; reszta instrukcji zachowuje się identycznie, jak w rewizjach bazowej, 1 i 2. Jednocześnie, począwszy od rewizji 3, kompilator shaderów jest w stanie łączyć sekwencje operacji `OpFMul` + `OpFAdd` oraz `OpFMul` + `OpFSub` w tańsze operacje dodawania i mnożenia w jednym kroku (`GLSLstd450Fma`), z dodatkiem instrukcji `OpFNegate` w celu odwrócenia znaku w przypadku łączenia instrukcji `OpFSub`.

SPIR-V opcodes Constant latency Variable latency (* operand)
OpFNegate 1 0