diff --git a/src/resources/cache/hashes.json b/src/resources/cache/hashes.json index 69ec1a49851c..1148577cce12 100644 --- a/src/resources/cache/hashes.json +++ b/src/resources/cache/hashes.json @@ -1,106 +1,106 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "ca9569aa", - "webgpu/shader/execution/binary/af_logical.bin": "79fb9de7", - "webgpu/shader/execution/binary/af_division.bin": "87cef40b", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "8afe5300", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "bd433833", - "webgpu/shader/execution/binary/af_multiplication.bin": "7803251d", - "webgpu/shader/execution/binary/af_remainder.bin": "f5feb53", - "webgpu/shader/execution/binary/af_subtraction.bin": "7cc42f3a", - "webgpu/shader/execution/binary/f16_addition.bin": "e56d4073", - "webgpu/shader/execution/binary/f16_logical.bin": "6dfc24ba", - "webgpu/shader/execution/binary/f16_division.bin": "933c3c35", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "934c3596", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "f2a1e8", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "b1ca61be", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "e054a92b", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "4706075e", - "webgpu/shader/execution/binary/f16_multiplication.bin": "28dbd8b6", - "webgpu/shader/execution/binary/f16_remainder.bin": "986de10c", - "webgpu/shader/execution/binary/f16_subtraction.bin": "d3e7f74f", - "webgpu/shader/execution/binary/f32_addition.bin": "fc66b530", - "webgpu/shader/execution/binary/f32_logical.bin": "6aecdb17", - "webgpu/shader/execution/binary/f32_division.bin": "b0b2294c", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "4f84f9a4", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "cf99f3b9", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "ac8e0983", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "76301b8", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "db0f8c38", - "webgpu/shader/execution/binary/f32_multiplication.bin": "ecbcde06", - "webgpu/shader/execution/binary/f32_remainder.bin": "9d11467e", - "webgpu/shader/execution/binary/f32_subtraction.bin": "7dbddc79", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "43c80b5e", - "webgpu/shader/execution/binary/i32_comparison.bin": "1b9d7888", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "c031871c", - "webgpu/shader/execution/binary/u32_comparison.bin": "9b05600", - "webgpu/shader/execution/abs.bin": "acfe9bb2", - "webgpu/shader/execution/acos.bin": "8ed18869", - "webgpu/shader/execution/acosh.bin": "1cf98804", - "webgpu/shader/execution/asin.bin": "71698297", - "webgpu/shader/execution/asinh.bin": "7256451c", - "webgpu/shader/execution/atan.bin": "96e29c5d", - "webgpu/shader/execution/atan2.bin": "2dd9139", - "webgpu/shader/execution/atanh.bin": "fafe4e6c", - "webgpu/shader/execution/bitcast.bin": "b9fb1fbd", - "webgpu/shader/execution/ceil.bin": "ff230775", - "webgpu/shader/execution/clamp.bin": "ae2f4ac", - "webgpu/shader/execution/cos.bin": "ff432f2b", - "webgpu/shader/execution/cosh.bin": "d7af2ee9", - "webgpu/shader/execution/cross.bin": "11bf35a8", - "webgpu/shader/execution/degrees.bin": "c53959da", - "webgpu/shader/execution/determinant.bin": "da997a93", - "webgpu/shader/execution/distance.bin": "817d1cb", - "webgpu/shader/execution/dot.bin": "96070df0", - "webgpu/shader/execution/exp.bin": "e9728b8a", - "webgpu/shader/execution/exp2.bin": "66d0d5c5", - "webgpu/shader/execution/faceForward.bin": "cac5c81", - "webgpu/shader/execution/floor.bin": "18f58cc", - "webgpu/shader/execution/fma.bin": "6372916b", - "webgpu/shader/execution/fract.bin": "6335e79f", - "webgpu/shader/execution/frexp.bin": "54d2bdb0", - "webgpu/shader/execution/inverseSqrt.bin": "10ba17af", - "webgpu/shader/execution/ldexp.bin": "dba21b3e", - "webgpu/shader/execution/length.bin": "aad9991", - "webgpu/shader/execution/log.bin": "ff19d8a0", - "webgpu/shader/execution/log2.bin": "b3ebf3dd", - "webgpu/shader/execution/max.bin": "61a11c89", - "webgpu/shader/execution/min.bin": "5de15c84", - "webgpu/shader/execution/mix.bin": "a07ec401", - "webgpu/shader/execution/modf.bin": "91cac6b2", - "webgpu/shader/execution/normalize.bin": "6da0731", - "webgpu/shader/execution/pack2x16float.bin": "119a9ab1", - "webgpu/shader/execution/pow.bin": "986f5d89", - "webgpu/shader/execution/quantizeToF16.bin": "77efff6b", - "webgpu/shader/execution/radians.bin": "a035b517", - "webgpu/shader/execution/reflect.bin": "c2763f1a", - "webgpu/shader/execution/refract.bin": "e71dd5de", - "webgpu/shader/execution/round.bin": "36f3ecde", - "webgpu/shader/execution/saturate.bin": "392167ed", - "webgpu/shader/execution/sign.bin": "766ace88", - "webgpu/shader/execution/sin.bin": "c1fd0733", - "webgpu/shader/execution/sinh.bin": "3f78d331", - "webgpu/shader/execution/smoothstep.bin": "9f72a10", - "webgpu/shader/execution/sqrt.bin": "17fe3757", - "webgpu/shader/execution/step.bin": "e20fb42", - "webgpu/shader/execution/tan.bin": "c3c67187", - "webgpu/shader/execution/tanh.bin": "9d06e776", - "webgpu/shader/execution/transpose.bin": "f739a482", - "webgpu/shader/execution/trunc.bin": "16600f63", - "webgpu/shader/execution/unpack2x16float.bin": "4d6c065c", - "webgpu/shader/execution/unpack2x16snorm.bin": "8d8fc5df", - "webgpu/shader/execution/unpack2x16unorm.bin": "1824a555", - "webgpu/shader/execution/unpack4x8snorm.bin": "bad79c86", - "webgpu/shader/execution/unpack4x8unorm.bin": "8a744dfa", - "webgpu/shader/execution/unary/af_arithmetic.bin": "63f22c73", - "webgpu/shader/execution/unary/af_assignment.bin": "fb65d5ff", - "webgpu/shader/execution/unary/bool_conversion.bin": "cae3c1bd", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "f6937f3e", - "webgpu/shader/execution/unary/f16_conversion.bin": "786501ec", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "eef2bb81", - "webgpu/shader/execution/unary/f32_conversion.bin": "983e48bb", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "c93e4e68", - "webgpu/shader/execution/unary/i32_complement.bin": "2505e4e6", - "webgpu/shader/execution/unary/i32_conversion.bin": "8cceff52", - "webgpu/shader/execution/unary/u32_complement.bin": "dada6764", - "webgpu/shader/execution/unary/u32_conversion.bin": "9b89fb5" + "webgpu/shader/execution/binary/af_addition.bin": "a5da1df9", + "webgpu/shader/execution/binary/af_logical.bin": "27d915bd", + "webgpu/shader/execution/binary/af_division.bin": "a5270697", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "62f800a8", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "9183d57f", + "webgpu/shader/execution/binary/af_multiplication.bin": "865258e7", + "webgpu/shader/execution/binary/af_remainder.bin": "4c61df7e", + "webgpu/shader/execution/binary/af_subtraction.bin": "43dd47ae", + "webgpu/shader/execution/binary/f16_addition.bin": "513d71c8", + "webgpu/shader/execution/binary/f16_logical.bin": "443f9a98", + "webgpu/shader/execution/binary/f16_division.bin": "f54e29cb", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "f910cec6", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "b70ddbb2", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "62afef7a", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "29e3722d", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "f4a29ad1", + "webgpu/shader/execution/binary/f16_multiplication.bin": "9baf80a1", + "webgpu/shader/execution/binary/f16_remainder.bin": "85c74732", + "webgpu/shader/execution/binary/f16_subtraction.bin": "b06f0345", + "webgpu/shader/execution/binary/f32_addition.bin": "e0f9ce70", + "webgpu/shader/execution/binary/f32_logical.bin": "47cadba6", + "webgpu/shader/execution/binary/f32_division.bin": "7005e989", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "98e53a9", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "b5c60cda", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "522a3569", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "c19e488c", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "9af1d0c3", + "webgpu/shader/execution/binary/f32_multiplication.bin": "e59c1749", + "webgpu/shader/execution/binary/f32_remainder.bin": "f0aa263b", + "webgpu/shader/execution/binary/f32_subtraction.bin": "f4bc3081", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "e92caa13", + "webgpu/shader/execution/binary/i32_comparison.bin": "21f566be", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "4190d758", + "webgpu/shader/execution/binary/u32_comparison.bin": "91fe8844", + "webgpu/shader/execution/abs.bin": "40c39d52", + "webgpu/shader/execution/acos.bin": "9998e303", + "webgpu/shader/execution/acosh.bin": "7636c6b9", + "webgpu/shader/execution/asin.bin": "fd7059cd", + "webgpu/shader/execution/asinh.bin": "58959a2", + "webgpu/shader/execution/atan.bin": "ed0a5fe5", + "webgpu/shader/execution/atan2.bin": "bcfaa17a", + "webgpu/shader/execution/atanh.bin": "fe79d05d", + "webgpu/shader/execution/bitcast.bin": "ab8f3a85", + "webgpu/shader/execution/ceil.bin": "82690ce1", + "webgpu/shader/execution/clamp.bin": "a30a2b8e", + "webgpu/shader/execution/cos.bin": "bf80f288", + "webgpu/shader/execution/cosh.bin": "2add503b", + "webgpu/shader/execution/cross.bin": "ce546995", + "webgpu/shader/execution/degrees.bin": "af783136", + "webgpu/shader/execution/determinant.bin": "16d6108", + "webgpu/shader/execution/distance.bin": "34788cf8", + "webgpu/shader/execution/dot.bin": "5d8d3fff", + "webgpu/shader/execution/exp.bin": "e890f3d", + "webgpu/shader/execution/exp2.bin": "80f0c788", + "webgpu/shader/execution/faceForward.bin": "4cf3e04d", + "webgpu/shader/execution/floor.bin": "4d91b147", + "webgpu/shader/execution/fma.bin": "9579e337", + "webgpu/shader/execution/fract.bin": "a1372b54", + "webgpu/shader/execution/frexp.bin": "7d140601", + "webgpu/shader/execution/inverseSqrt.bin": "515fb6e3", + "webgpu/shader/execution/ldexp.bin": "826a29a8", + "webgpu/shader/execution/length.bin": "124ac33b", + "webgpu/shader/execution/log.bin": "aad3a1a8", + "webgpu/shader/execution/log2.bin": "7ef34360", + "webgpu/shader/execution/max.bin": "69a1807", + "webgpu/shader/execution/min.bin": "8dfa353d", + "webgpu/shader/execution/mix.bin": "96c9d02d", + "webgpu/shader/execution/modf.bin": "26670f53", + "webgpu/shader/execution/normalize.bin": "60571bc4", + "webgpu/shader/execution/pack2x16float.bin": "31601129", + "webgpu/shader/execution/pow.bin": "8f5de92", + "webgpu/shader/execution/quantizeToF16.bin": "9936c450", + "webgpu/shader/execution/radians.bin": "56c3610d", + "webgpu/shader/execution/reflect.bin": "61beb0cf", + "webgpu/shader/execution/refract.bin": "d0180f9b", + "webgpu/shader/execution/round.bin": "3bc78d47", + "webgpu/shader/execution/saturate.bin": "8478071d", + "webgpu/shader/execution/sign.bin": "58d75a88", + "webgpu/shader/execution/sin.bin": "b14cf00a", + "webgpu/shader/execution/sinh.bin": "a8d76c62", + "webgpu/shader/execution/smoothstep.bin": "246c76eb", + "webgpu/shader/execution/sqrt.bin": "f6c4f4c1", + "webgpu/shader/execution/step.bin": "8268c823", + "webgpu/shader/execution/tan.bin": "af3ecb02", + "webgpu/shader/execution/tanh.bin": "c22b8364", + "webgpu/shader/execution/transpose.bin": "f8663cd3", + "webgpu/shader/execution/trunc.bin": "b532e654", + "webgpu/shader/execution/unpack2x16float.bin": "67d0b480", + "webgpu/shader/execution/unpack2x16snorm.bin": "be8c0687", + "webgpu/shader/execution/unpack2x16unorm.bin": "8ef57a36", + "webgpu/shader/execution/unpack4x8snorm.bin": "a807e0f6", + "webgpu/shader/execution/unpack4x8unorm.bin": "b8ed39e8", + "webgpu/shader/execution/unary/af_arithmetic.bin": "f6181e3d", + "webgpu/shader/execution/unary/af_assignment.bin": "1da130e3", + "webgpu/shader/execution/unary/bool_conversion.bin": "166e7b55", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "576d8432", + "webgpu/shader/execution/unary/f16_conversion.bin": "187365c9", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "abfce14d", + "webgpu/shader/execution/unary/f32_conversion.bin": "69c41336", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "cca83969", + "webgpu/shader/execution/unary/i32_complement.bin": "2a173277", + "webgpu/shader/execution/unary/i32_conversion.bin": "11d03e95", + "webgpu/shader/execution/unary/u32_complement.bin": "6fce0665", + "webgpu/shader/execution/unary/u32_conversion.bin": "53c94e7b" } \ No newline at end of file diff --git a/src/resources/cache/webgpu/shader/execution/transpose.bin b/src/resources/cache/webgpu/shader/execution/transpose.bin index e63e0c314b30..76590b2836a9 100644 Binary files a/src/resources/cache/webgpu/shader/execution/transpose.bin and b/src/resources/cache/webgpu/shader/execution/transpose.bin differ diff --git a/src/webgpu/shader/execution/expression/call/builtin/transpose.spec.ts b/src/webgpu/shader/execution/expression/call/builtin/transpose.spec.ts index 6fd4887f357c..502983517a76 100644 --- a/src/webgpu/shader/execution/expression/call/builtin/transpose.spec.ts +++ b/src/webgpu/shader/execution/expression/call/builtin/transpose.spec.ts @@ -10,11 +10,6 @@ import { makeTestGroup } from '../../../../../../common/framework/test_group.js' import { GPUTest } from '../../../../../gpu_test.js'; import { TypeAbstractFloat, TypeF16, TypeF32, TypeMat } from '../../../../../util/conversion.js'; import { FP } from '../../../../../util/floating_point.js'; -import { - sparseMatrixF16Range, - sparseMatrixF32Range, - sparseMatrixF64Range, -} from '../../../../../util/math.js'; import { makeCaseCache } from '../../case_cache.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; @@ -22,60 +17,30 @@ import { abstractBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); -// Cases: f32_matCxR_[non_]const -const f32_cases = ([2, 3, 4] as const) - .flatMap(cols => - ([2, 3, 4] as const).flatMap(rows => - ([true, false] as const).map(nonConst => ({ - [`f32_mat${cols}x${rows}_${nonConst ? 'non_const' : 'const'}`]: () => { - return FP.f32.generateMatrixToMatrixCases( - sparseMatrixF32Range(cols, rows), - nonConst ? 'unfiltered' : 'finite', - FP.f32.transposeInterval - ); - }, - })) +// Cases: [f32|f16|abstract]_matCxR_[non_]const +// abstract_matCxR_non_const is empty and not used +const cases = (['f32', 'f16', 'abstract'] as const) + .flatMap(trait => + ([2, 3, 4] as const).flatMap(cols => + ([2, 3, 4] as const).flatMap(rows => + ([true, false] as const).map(nonConst => ({ + [`${trait}_mat${cols}x${rows}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } + return FP[trait].generateMatrixToMatrixCases( + FP[trait].sparseMatrixRange(cols, rows), + nonConst ? 'unfiltered' : 'finite', + FP[trait].transposeInterval + ); + }, + })) + ) ) ) .reduce((a, b) => ({ ...a, ...b }), {}); -// Cases: f16_matCxR_[non_]const -const f16_cases = ([2, 3, 4] as const) - .flatMap(cols => - ([2, 3, 4] as const).flatMap(rows => - ([true, false] as const).map(nonConst => ({ - [`f16_mat${cols}x${rows}_${nonConst ? 'non_const' : 'const'}`]: () => { - return FP.f16.generateMatrixToMatrixCases( - sparseMatrixF16Range(cols, rows), - nonConst ? 'unfiltered' : 'finite', - FP.f16.transposeInterval - ); - }, - })) - ) - ) - .reduce((a, b) => ({ ...a, ...b }), {}); - -// Cases: abstract_matCxR -const abstract_cases = ([2, 3, 4] as const) - .flatMap(cols => - ([2, 3, 4] as const).map(rows => ({ - [`abstract_mat${cols}x${rows}`]: () => { - return FP.abstract.generateMatrixToMatrixCases( - sparseMatrixF64Range(cols, rows), - 'finite', - FP.abstract.transposeInterval - ); - }, - })) - ) - .reduce((a, b) => ({ ...a, ...b }), {}); - -export const d = makeCaseCache('transpose', { - ...f32_cases, - ...f16_cases, - ...abstract_cases, -}); +export const d = makeCaseCache('transpose', cases); g.test('abstract_float') .specURL('https://www.w3.org/TR/WGSL/#matrix-builtin-functions') @@ -89,7 +54,7 @@ g.test('abstract_float') .fn(async t => { const cols = t.params.cols; const rows = t.params.rows; - const cases = await d.get(`abstract_mat${cols}x${rows}`); + const cases = await d.get(`abstract_mat${cols}x${rows}_const`); await run( t, abstractBuiltin('transpose'), diff --git a/src/webgpu/util/floating_point.ts b/src/webgpu/util/floating_point.ts index 2cfdb170a0fc..5dcc11e828d2 100644 --- a/src/webgpu/util/floating_point.ts +++ b/src/webgpu/util/floating_point.ts @@ -37,8 +37,17 @@ import { map2DArray, oneULPF16, oneULPF32, - quantizeToF32, quantizeToF16, + quantizeToF32, + scalarF16Range, + scalarF32Range, + scalarF64Range, + sparseMatrixF16Range, + sparseMatrixF32Range, + sparseMatrixF64Range, + sparseScalarF16Range, + sparseScalarF32Range, + sparseScalarF64Range, sparseVectorF16Range, sparseVectorF32Range, sparseVectorF64Range, @@ -46,12 +55,6 @@ import { vectorF16Range, vectorF32Range, vectorF64Range, - scalarF32Range, - sparseScalarF32Range, - scalarF64Range, - sparseScalarF64Range, - scalarF16Range, - sparseScalarF16Range, } from './math.js'; /** Indicate the kind of WGSL floating point numbers being operated on */ @@ -1101,6 +1104,12 @@ export abstract class FPTraits { public abstract vectorRange(dim: number): ROArrayArray; /** @returns a reduced range of dim element vectors for testing */ public abstract sparseVectorRange(dim: number): ROArrayArray; + /** @returns a reduced range of cols x rows matrices for testing + * + * A non-sparse version of this generator is intentionally not provided due to + * runtime issues with more dense ranges. + */ + public abstract sparseMatrixRange(cols: number, rows: number): ROArrayArrayArray; // Framework - Cases @@ -4544,6 +4553,7 @@ class F32Traits extends FPTraits { public readonly sparseScalarRange = sparseScalarF32Range; public readonly vectorRange = vectorF32Range; public readonly sparseVectorRange = sparseVectorF32Range; + public readonly sparseMatrixRange = sparseMatrixF32Range; // Framework - Fundamental Error Intervals - Overrides public readonly absoluteErrorInterval = this.absoluteErrorIntervalImpl.bind(this); @@ -5020,6 +5030,7 @@ class FPAbstractTraits extends FPTraits { public readonly sparseScalarRange = sparseScalarF64Range; public readonly vectorRange = vectorF64Range; public readonly sparseVectorRange = sparseVectorF64Range; + public readonly sparseMatrixRange = sparseMatrixF64Range; // Framework - Fundamental Error Intervals - Overrides public readonly absoluteErrorInterval = this.unboundedAbsoluteErrorInterval.bind(this); @@ -5356,6 +5367,7 @@ class F16Traits extends FPTraits { public readonly sparseScalarRange = sparseScalarF16Range; public readonly vectorRange = vectorF16Range; public readonly sparseVectorRange = sparseVectorF16Range; + public readonly sparseMatrixRange = sparseMatrixF16Range; // Framework - Fundamental Error Intervals - Overrides public readonly absoluteErrorInterval = this.absoluteErrorIntervalImpl.bind(this); diff --git a/src/webgpu/util/math.ts b/src/webgpu/util/math.ts index f063a60eb8b9..139b5552e999 100644 --- a/src/webgpu/util/math.ts +++ b/src/webgpu/util/math.ts @@ -1963,16 +1963,16 @@ const kSparseMatrixF64Values = { * All the interesting floats from sparseScalarF64 are guaranteed to be tested, but * not in every position. */ -export function sparseMatrixF64Range(c: number, r: number): ROArrayArray[] { +export function sparseMatrixF64Range(cols: number, rows: number): ROArrayArrayArray { assert( - c === 2 || c === 3 || c === 4, + cols === 2 || cols === 3 || cols === 4, 'sparseMatrixF64Range only accepts column counts of 2, 3, and 4' ); assert( - r === 2 || r === 3 || r === 4, + rows === 2 || rows === 3 || rows === 4, 'sparseMatrixF64Range only accepts row counts of 2, 3, and 4' ); - return kSparseMatrixF64Values[c][r]; + return kSparseMatrixF64Values[cols][rows]; } /**