From 69f8a9b942b0c70abb37dd8559899538c952efa5 Mon Sep 17 00:00:00 2001 From: Ryan Harrison Date: Thu, 29 Feb 2024 13:11:12 -0500 Subject: [PATCH] wgsl: Implement AbstractFloat `dot` execution tests (#3443) Fixes #2512 --- src/resources/cache/hashes.json | 182 +++++++++--------- .../cache/webgpu/shader/execution/dot.bin | Bin 374808 -> 510736 bytes src/unittests/floating_point.spec.ts | 11 +- .../expression/call/builtin/dot.cache.ts | 12 +- src/webgpu/util/floating_point.ts | 2 +- 5 files changed, 108 insertions(+), 99 deletions(-) diff --git a/src/resources/cache/hashes.json b/src/resources/cache/hashes.json index 8acfa8e5cd9e..9476d8431f41 100644 --- a/src/resources/cache/hashes.json +++ b/src/resources/cache/hashes.json @@ -1,107 +1,105 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "bbc5103c", + "webgpu/shader/execution/binary/af_addition.bin": "38b261fa", "webgpu/shader/execution/binary/af_logical.bin": "a483b968", - "webgpu/shader/execution/binary/af_division.bin": "7c221c28", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "ebab2b30", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "6078475c", - "webgpu/shader/execution/binary/af_multiplication.bin": "66ad501", - "webgpu/shader/execution/binary/af_remainder.bin": "5a87ed27", - "webgpu/shader/execution/binary/af_subtraction.bin": "66bad739", - "webgpu/shader/execution/binary/f16_addition.bin": "3ff7fed3", + "webgpu/shader/execution/binary/af_division.bin": "ec39b0da", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "ca1373a8", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "406d99af", + "webgpu/shader/execution/binary/af_multiplication.bin": "2eb6d50d", + "webgpu/shader/execution/binary/af_remainder.bin": "e2b6b21", + "webgpu/shader/execution/binary/af_subtraction.bin": "84794350", + "webgpu/shader/execution/binary/f16_addition.bin": "19e8823d", "webgpu/shader/execution/binary/f16_logical.bin": "b89ca9b9", - "webgpu/shader/execution/binary/f16_division.bin": "a01c2499", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "cb64b0b6", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "edbbdd7b", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "f5ded61d", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "11ad421b", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "5ef65699", - "webgpu/shader/execution/binary/f16_multiplication.bin": "24c6a56f", - "webgpu/shader/execution/binary/f16_remainder.bin": "d47a8347", - "webgpu/shader/execution/binary/f16_subtraction.bin": "755f4b0b", - "webgpu/shader/execution/binary/f32_addition.bin": "6db93d07", + "webgpu/shader/execution/binary/f16_division.bin": "6dc4b748", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "7533842", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "2d799920", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "44e3b295", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "412f0911", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "a231201b", + "webgpu/shader/execution/binary/f16_multiplication.bin": "94b11030", + "webgpu/shader/execution/binary/f16_remainder.bin": "de68a200", + "webgpu/shader/execution/binary/f16_subtraction.bin": "f308327a", + "webgpu/shader/execution/binary/f32_addition.bin": "c87c8c08", "webgpu/shader/execution/binary/f32_logical.bin": "c7370c09", - "webgpu/shader/execution/binary/f32_division.bin": "c28058b5", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "3f49bac9", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "592cc2c4", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "e3750b3c", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "b16d21e2", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "c982cd63", - "webgpu/shader/execution/binary/f32_multiplication.bin": "835ec6ee", - "webgpu/shader/execution/binary/f32_remainder.bin": "daf70203", - "webgpu/shader/execution/binary/f32_subtraction.bin": "2fc781f8", + "webgpu/shader/execution/binary/f32_division.bin": "34ce65ae", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "f3808d0c", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "e33e7fe5", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "41091ebf", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "37ccb101", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "4d67866", + "webgpu/shader/execution/binary/f32_multiplication.bin": "5d85a36c", + "webgpu/shader/execution/binary/f32_remainder.bin": "62f591b2", + "webgpu/shader/execution/binary/f32_subtraction.bin": "60fc275a", "webgpu/shader/execution/binary/i32_arithmetic.bin": "a0b0a016", "webgpu/shader/execution/binary/i32_comparison.bin": "f3d9b3f9", "webgpu/shader/execution/binary/u32_arithmetic.bin": "16e32fd", "webgpu/shader/execution/binary/u32_comparison.bin": "da33cc5d", - "webgpu/shader/execution/abs.bin": "e8dce87a", - "webgpu/shader/execution/acos.bin": "2762bad", - "webgpu/shader/execution/acosh.bin": "a3b96c53", - "webgpu/shader/execution/asin.bin": "1d9d590", - "webgpu/shader/execution/asinh.bin": "c2cc05", - "webgpu/shader/execution/atan.bin": "3f701bba", - "webgpu/shader/execution/atan2.bin": "559fb65a", - "webgpu/shader/execution/atanh.bin": "6d352d21", - "webgpu/shader/execution/bitcast.bin": "ec72fa7", - "webgpu/shader/execution/ceil.bin": "42f80be0", - "webgpu/shader/execution/clamp.bin": "1440b818", - "webgpu/shader/execution/cos.bin": "c5da20d", - "webgpu/shader/execution/cosh.bin": "a01e8091", - "webgpu/shader/execution/cross.bin": "c756d650", - "webgpu/shader/execution/degrees.bin": "2c481603", - "webgpu/shader/execution/determinant.bin": "1e67d0f3", - "webgpu/shader/execution/distance.bin": "9a305a9d", - "webgpu/shader/execution/dot.bin": "1a3853b8", - "webgpu/shader/execution/exp.bin": "11112dba", - "webgpu/shader/execution/exp2.bin": "583e9c6a", - "webgpu/shader/execution/faceForward.bin": "7528aff7", - "webgpu/shader/execution/floor.bin": "96044530", - "webgpu/shader/execution/fma.bin": "8e795844", - "webgpu/shader/execution/fract.bin": "997d1bb5", - "webgpu/shader/execution/frexp.bin": "4a1efc69", - "webgpu/shader/execution/inverseSqrt.bin": "3e7d725", - "webgpu/shader/execution/ldexp.bin": "79646a61", - "webgpu/shader/execution/length.bin": "177f62e6", - "webgpu/shader/execution/log.bin": "4e0f535c", - "webgpu/shader/execution/log2.bin": "a961449", - "webgpu/shader/execution/max.bin": "3d764667", - "webgpu/shader/execution/min.bin": "c02f865", - "webgpu/shader/execution/mix.bin": "9431b1b0", - "webgpu/shader/execution/modf.bin": "1fdcef82", - "webgpu/shader/execution/normalize.bin": "78dd7ec5", + "webgpu/shader/execution/abs.bin": "1ead834c", + "webgpu/shader/execution/acos.bin": "e25802ba", + "webgpu/shader/execution/acosh.bin": "2321726f", + "webgpu/shader/execution/asin.bin": "d554a73b", + "webgpu/shader/execution/asinh.bin": "d2bdb21b", + "webgpu/shader/execution/atan.bin": "eb6476f3", + "webgpu/shader/execution/atan2.bin": "cf15e7fa", + "webgpu/shader/execution/atanh.bin": "6c57cc3", + "webgpu/shader/execution/bitcast.bin": "a25e9714", + "webgpu/shader/execution/ceil.bin": "8d120ea3", + "webgpu/shader/execution/clamp.bin": "a762ef58", + "webgpu/shader/execution/cos.bin": "a859da89", + "webgpu/shader/execution/cosh.bin": "86abdd85", + "webgpu/shader/execution/cross.bin": "e4556729", + "webgpu/shader/execution/degrees.bin": "1fa19a41", + "webgpu/shader/execution/determinant.bin": "108c3d65", + "webgpu/shader/execution/distance.bin": "77a1baa6", + "webgpu/shader/execution/dot.bin": "d4ac2e8a", + "webgpu/shader/execution/exp.bin": "15539afd", + "webgpu/shader/execution/exp2.bin": "7f6a8523", + "webgpu/shader/execution/faceForward.bin": "e7b35f43", + "webgpu/shader/execution/floor.bin": "b26656ca", + "webgpu/shader/execution/fma.bin": "5a70c683", + "webgpu/shader/execution/fract.bin": "23c0d5ec", + "webgpu/shader/execution/frexp.bin": "d28e66be", + "webgpu/shader/execution/inverseSqrt.bin": "9f297854", + "webgpu/shader/execution/ldexp.bin": "638db0c7", + "webgpu/shader/execution/length.bin": "7d237c62", + "webgpu/shader/execution/log.bin": "70720bf0", + "webgpu/shader/execution/log2.bin": "93a309be", + "webgpu/shader/execution/max.bin": "36eb4779", + "webgpu/shader/execution/min.bin": "ca772bf1", + "webgpu/shader/execution/mix.bin": "ecbf61ae", + "webgpu/shader/execution/modf.bin": "6ddea900", + "webgpu/shader/execution/normalize.bin": "d3e47c61", "webgpu/shader/execution/pack2x16float.bin": "e6859c1a", - "webgpu/shader/execution/pow.bin": "4877dcfb", - "webgpu/shader/execution/quantizeToF16.bin": "c80d80ea", - "webgpu/shader/execution/radians.bin": "ac062ec8", - "webgpu/shader/execution/reflect.bin": "a4e70e5a", - "webgpu/shader/execution/refract.bin": "2ca0bc97", - "webgpu/shader/execution/round.bin": "3471eaad", - "webgpu/shader/execution/saturate.bin": "5bb3dced", - "webgpu/shader/execution/sign.bin": "5b54134", - "webgpu/shader/execution/sin.bin": "c5bb923c", - "webgpu/shader/execution/sinh.bin": "122dba1b", - "webgpu/shader/execution/smoothstep.bin": "91223043", - "webgpu/shader/execution/sqrt.bin": "e630cb4e", - "webgpu/shader/execution/step.bin": "a3349b96", - "webgpu/shader/execution/tan.bin": "ecc23f5e", - "webgpu/shader/execution/tanh.bin": "96c30607", - "webgpu/shader/execution/transpose.bin": "8968d6f9", - "webgpu/shader/execution/trunc.bin": "6c17efc2", - "webgpu/shader/execution/unpack2x16float.bin": "f035f149", - "webgpu/shader/execution/unpack2x16snorm.bin": "e92a1762", - "webgpu/shader/execution/unpack2x16unorm.bin": "abe4e594", - "webgpu/shader/execution/unpack4x8snorm.bin": "9bb9c594", - "webgpu/shader/execution/unpack4x8unorm.bin": "53ceebc", - "webgpu/shader/execution/unary/af_arithmetic.bin": "cd5b7fa3", - "webgpu/shader/execution/unary/af_assignment.bin": "86b66309", + "webgpu/shader/execution/pow.bin": "a58be71c", + "webgpu/shader/execution/quantizeToF16.bin": "eca85bca", + "webgpu/shader/execution/radians.bin": "a216c9aa", + "webgpu/shader/execution/reflect.bin": "ebce9830", + "webgpu/shader/execution/refract.bin": "59d1e5d6", + "webgpu/shader/execution/round.bin": "9389a090", + "webgpu/shader/execution/saturate.bin": "7ca4b681", + "webgpu/shader/execution/sign.bin": "1f4eeb34", + "webgpu/shader/execution/sin.bin": "a1e234b4", + "webgpu/shader/execution/sinh.bin": "1a62054b", + "webgpu/shader/execution/smoothstep.bin": "d5824fd6", + "webgpu/shader/execution/sqrt.bin": "66f21d02", + "webgpu/shader/execution/step.bin": "310cb6c7", + "webgpu/shader/execution/tan.bin": "1e26f533", + "webgpu/shader/execution/tanh.bin": "4c546d1c", + "webgpu/shader/execution/transpose.bin": "7bef2494", + "webgpu/shader/execution/trunc.bin": "e72535eb", + "webgpu/shader/execution/unpack2x16float.bin": "593d88c6", + "webgpu/shader/execution/unpack2x16snorm.bin": "9ebd3e40", + "webgpu/shader/execution/unpack2x16unorm.bin": "83a36fa9", + "webgpu/shader/execution/unpack4x8snorm.bin": "41b12606", + "webgpu/shader/execution/unpack4x8unorm.bin": "96f1850b", + "webgpu/shader/execution/unary/af_arithmetic.bin": "6fa1d84a", + "webgpu/shader/execution/unary/af_assignment.bin": "98c8f82a", "webgpu/shader/execution/unary/bool_conversion.bin": "dd71f171", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "9537b14", - "webgpu/shader/execution/unary/f16_conversion.bin": "3948e7eb", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "f8aa7493", - "webgpu/shader/execution/unary/f32_conversion.bin": "7ee18c9e", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "2f2d38fc", + "webgpu/shader/execution/unary/f16_conversion.bin": "70c94538", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "db90c01c", + "webgpu/shader/execution/unary/f32_conversion.bin": "81912140", "webgpu/shader/execution/unary/i32_arithmetic.bin": "c69716e2", - "webgpu/shader/execution/unary/i32_complement.bin": "70c49c98", "webgpu/shader/execution/unary/i32_conversion.bin": "83218e69", - "webgpu/shader/execution/unary/u32_complement.bin": "84f3d299", "webgpu/shader/execution/unary/u32_conversion.bin": "8f5bad00", "webgpu/shader/execution/unary/ai_assignment.bin": "c7e6ac33", "webgpu/shader/execution/binary/ai_arithmetic.bin": "81c11ec2", diff --git a/src/resources/cache/webgpu/shader/execution/dot.bin b/src/resources/cache/webgpu/shader/execution/dot.bin index c40881d3ffdacada3f720b57490582867bf0c71d..778ac0c1ad8ead289aff916442f2536fca25dcdc 100644 GIT binary patch literal 510736 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

%pS61xXcdDm7hLt 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 kYCfHv%O~d-XXoOV diff --git a/src/unittests/floating_point.spec.ts b/src/unittests/floating_point.spec.ts index b356f393ab89..23bfaafc2268 100644 --- a/src/unittests/floating_point.spec.ts +++ b/src/unittests/floating_point.spec.ts @@ -6127,12 +6127,17 @@ const kDotIntervalCases = { { input: [[kValue.f16.positive.max, 1.0, 2.0, 3.0], [-1.0, kValue.f16.positive.max, -2.0, -3.0]], expected: kUnboundedEndpoints }, { input: [[kValue.f16.positive.max, 1.0, 2.0, 3.0], [1.0, kValue.f16.negative.min, 2.0, 3.0]], expected: kUnboundedEndpoints }, ] as VectorPairToIntervalCase[], + abstract: [ + // See f32 for details + { input: [[kValue.f64.positive.max, 1.0, 2.0, 3.0], [-1.0, kValue.f64.positive.max, -2.0, -3.0]], expected: [-13, 0] }, + { input: [[kValue.f64.positive.max, 1.0, 2.0, 3.0], [1.0, kValue.f64.negative.min, 2.0, 3.0]], expected: [0, 13] }, + ] as VectorPairToIntervalCase[], } as const; g.test('dotInterval') .params(u => u - .combine('trait', ['f32', 'f16'] as const) + .combine('trait', ['f32', 'f16', 'abstract'] as const) .beginSubcases() .expandWithParams(p => { const trait = FP[p.trait]; @@ -6145,7 +6150,7 @@ g.test('dotInterval') { input: [[1.0, 1.0], [1.0, 1.0]], expected: 2.0 }, { input: [[-1.0, -1.0], [-1.0, -1.0]], expected: 2.0 }, { input: [[-1.0, 1.0], [1.0, -1.0]], expected: -2.0 }, - { input: [[0.1, 0.0], [1.0, 0.0]], expected: kConstantCorrectlyRoundedExpectation[p.trait]['0.1']}, // correclt rounded of 0.1 + { input: [[0.1, 0.0], [1.0, 0.0]], expected: kConstantCorrectlyRoundedExpectation[p.trait]['0.1']}, // correctly rounded of 0.1 // vec3 { input: [[1.0, 0.0, 0.0], [1.0, 0.0, 0.0]], expected: 1.0 }, @@ -6154,7 +6159,7 @@ g.test('dotInterval') { input: [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]], expected: 3.0 }, { input: [[-1.0, -1.0, -1.0], [-1.0, -1.0, -1.0]], expected: 3.0 }, { input: [[1.0, -1.0, -1.0], [-1.0, 1.0, -1.0]], expected: -1.0 }, - { input: [[0.1, 0.0, 0.0], [1.0, 0.0, 0.0]], expected: kConstantCorrectlyRoundedExpectation[p.trait]['0.1']}, // correclt rounded of 0.1 + { input: [[0.1, 0.0, 0.0], [1.0, 0.0, 0.0]], expected: kConstantCorrectlyRoundedExpectation[p.trait]['0.1']}, // correctly rounded of 0.1 // vec4 { input: [[1.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0]], expected: 1.0 }, diff --git a/src/webgpu/shader/execution/expression/call/builtin/dot.cache.ts b/src/webgpu/shader/execution/expression/call/builtin/dot.cache.ts index 881327e70118..06a4553a6363 100644 --- a/src/webgpu/shader/execution/expression/call/builtin/dot.cache.ts +++ b/src/webgpu/shader/execution/expression/call/builtin/dot.cache.ts @@ -57,12 +57,18 @@ function ci_dot(x: number[], y: number[]): number | undefined { return x.reduce((prev, _, idx) => prev + Math.imul(x[idx], y[idx]), 0); } -// Cases: [f32|f16]_vecN_[non_]const -const float_cases = (['f32', 'f16'] as const) +// Cases: [f32|f16|abstract]_vecN_[non_]const +const float_cases = (['f32', 'f16', 'abstract'] as const) .flatMap(trait => ([2, 3, 4] as const).flatMap(N => ([true, false] as const).map(nonConst => ({ - [`${trait}_vec${N}_${nonConst ? 'non_const' : 'const'}`]: () => { + [`${trait === 'abstract' ? 'abstract_float' : trait}_vec${N}_${ + nonConst ? 'non_const' : 'const' + }`]: () => { + // Emit an empty array for not const abstract float, since they will never be run + if (trait === 'abstract' && nonConst) { + return []; + } // vec3 and vec4 require calculating all possible permutations, so their runtime is much // longer per test, so only using sparse vectors for them. return FP[trait].generateVectorPairToIntervalCases( diff --git a/src/webgpu/util/floating_point.ts b/src/webgpu/util/floating_point.ts index 0fe9d3d88ba0..31b90081bfe6 100644 --- a/src/webgpu/util/floating_point.ts +++ b/src/webgpu/util/floating_point.ts @@ -5139,7 +5139,7 @@ class FPAbstractTraits extends FPTraits { ): FPInterval => { return this.toInterval(kF32Traits.divisionInterval(x, y)); }; - public readonly dotInterval = this.unimplementedVectorPairToInterval.bind(this, 'dotInterval'); + public readonly dotInterval = this.dotIntervalImpl.bind(this); public readonly expInterval = this.unimplementedScalarToInterval.bind(this, 'expInterval'); public readonly exp2Interval = this.unimplementedScalarToInterval.bind(this, 'exp2Interval'); public readonly faceForwardIntervals = this.unimplementedFaceForward.bind(this);