From 4d4c7f45be9deef953c8c612ceadd9e3e4671d3d Mon Sep 17 00:00:00 2001 From: Ryan Harrison Date: Tue, 13 Feb 2024 11:12:48 -0500 Subject: [PATCH] wgsl: Implement AbstractInt `max` execution tests (#3385) Issue #1297 --- src/resources/cache/hashes.json | 210 +++++++++--------- .../expression/call/builtin/max.spec.ts | 44 ++-- src/webgpu/util/math.ts | 10 +- 3 files changed, 140 insertions(+), 124 deletions(-) diff --git a/src/resources/cache/hashes.json b/src/resources/cache/hashes.json index e052bfdf70e4..a15750369203 100644 --- a/src/resources/cache/hashes.json +++ b/src/resources/cache/hashes.json @@ -1,107 +1,107 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "56e73232", - "webgpu/shader/execution/binary/af_logical.bin": "dc84fec2", - "webgpu/shader/execution/binary/af_division.bin": "b99f45a9", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "67fc289e", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "e533cd16", - "webgpu/shader/execution/binary/af_multiplication.bin": "b963600", - "webgpu/shader/execution/binary/af_remainder.bin": "4951978", - "webgpu/shader/execution/binary/af_subtraction.bin": "f0bd33da", - "webgpu/shader/execution/binary/f16_addition.bin": "7004a06e", - "webgpu/shader/execution/binary/f16_logical.bin": "cf61b9f0", - "webgpu/shader/execution/binary/f16_division.bin": "d67ffcf4", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "872caecc", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "d4c1fa65", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "410aa928", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "9fea0f32", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "22245ae6", - "webgpu/shader/execution/binary/f16_multiplication.bin": "bf8b1386", - "webgpu/shader/execution/binary/f16_remainder.bin": "2b2ecca8", - "webgpu/shader/execution/binary/f16_subtraction.bin": "92db6c3b", - "webgpu/shader/execution/binary/f32_addition.bin": "2ad33d40", - "webgpu/shader/execution/binary/f32_logical.bin": "168e00ad", - "webgpu/shader/execution/binary/f32_division.bin": "cda4b47f", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "a60b0194", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "15ae3f35", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "1c2d0770", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "5f458964", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "3ad4b122", - "webgpu/shader/execution/binary/f32_multiplication.bin": "2cfa41d7", - "webgpu/shader/execution/binary/f32_remainder.bin": "d881a0b5", - "webgpu/shader/execution/binary/f32_subtraction.bin": "5519529", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "1ebfac8e", - "webgpu/shader/execution/binary/i32_comparison.bin": "246410e0", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "5ba346a7", - "webgpu/shader/execution/binary/u32_comparison.bin": "f32cc89a", - "webgpu/shader/execution/abs.bin": "cf7035bb", - "webgpu/shader/execution/acos.bin": "f51b6639", - "webgpu/shader/execution/acosh.bin": "8703b0b9", - "webgpu/shader/execution/asin.bin": "b37659e4", - "webgpu/shader/execution/asinh.bin": "6c077b4d", - "webgpu/shader/execution/atan.bin": "d2cac8e5", - "webgpu/shader/execution/atan2.bin": "a664062f", - "webgpu/shader/execution/atanh.bin": "78678528", - "webgpu/shader/execution/bitcast.bin": "8e6fc660", - "webgpu/shader/execution/ceil.bin": "c3845564", - "webgpu/shader/execution/clamp.bin": "7fe63f9f", - "webgpu/shader/execution/cos.bin": "53e1ecb4", - "webgpu/shader/execution/cosh.bin": "60835146", - "webgpu/shader/execution/cross.bin": "ec9c38bc", - "webgpu/shader/execution/degrees.bin": "dba80a4", - "webgpu/shader/execution/determinant.bin": "df4961fb", - "webgpu/shader/execution/distance.bin": "f1d9a859", - "webgpu/shader/execution/dot.bin": "e645066f", - "webgpu/shader/execution/exp.bin": "365d8b77", - "webgpu/shader/execution/exp2.bin": "6315ce6a", - "webgpu/shader/execution/faceForward.bin": "73136fee", - "webgpu/shader/execution/floor.bin": "a9f45296", - "webgpu/shader/execution/fma.bin": "3ca02e6f", - "webgpu/shader/execution/fract.bin": "ca1a0fe5", - "webgpu/shader/execution/frexp.bin": "43885066", - "webgpu/shader/execution/inverseSqrt.bin": "de8d2609", - "webgpu/shader/execution/ldexp.bin": "d83280fa", - "webgpu/shader/execution/length.bin": "22d7feee", - "webgpu/shader/execution/log.bin": "b5255c2c", - "webgpu/shader/execution/log2.bin": "28bce946", - "webgpu/shader/execution/max.bin": "f336583c", - "webgpu/shader/execution/min.bin": "a0ed442a", - "webgpu/shader/execution/mix.bin": "761f1414", - "webgpu/shader/execution/modf.bin": "415c2c6d", - "webgpu/shader/execution/normalize.bin": "a1ee9fd1", - "webgpu/shader/execution/pack2x16float.bin": "e9c1e049", - "webgpu/shader/execution/pow.bin": "3ae9fddb", - "webgpu/shader/execution/quantizeToF16.bin": "29d70202", - "webgpu/shader/execution/radians.bin": "66df45b8", - "webgpu/shader/execution/reflect.bin": "74c93416", - "webgpu/shader/execution/refract.bin": "db1b6cd7", - "webgpu/shader/execution/round.bin": "6e17fee7", - "webgpu/shader/execution/saturate.bin": "4bd72628", - "webgpu/shader/execution/sign.bin": "516bf087", - "webgpu/shader/execution/sin.bin": "ab201566", - "webgpu/shader/execution/sinh.bin": "d174ff0d", - "webgpu/shader/execution/smoothstep.bin": "c841fdd0", - "webgpu/shader/execution/sqrt.bin": "270f222c", - "webgpu/shader/execution/step.bin": "c69ecf72", - "webgpu/shader/execution/tan.bin": "75633db4", - "webgpu/shader/execution/tanh.bin": "dec6ccb3", - "webgpu/shader/execution/transpose.bin": "a5376a18", - "webgpu/shader/execution/trunc.bin": "cb0fb7d", - "webgpu/shader/execution/unpack2x16float.bin": "f7c17562", - "webgpu/shader/execution/unpack2x16snorm.bin": "900c6570", - "webgpu/shader/execution/unpack2x16unorm.bin": "ce74966b", - "webgpu/shader/execution/unpack4x8snorm.bin": "23003de1", - "webgpu/shader/execution/unpack4x8unorm.bin": "d957b699", - "webgpu/shader/execution/unary/af_arithmetic.bin": "8eb3b38f", - "webgpu/shader/execution/unary/af_assignment.bin": "8b75cfc4", - "webgpu/shader/execution/unary/bool_conversion.bin": "91745a47", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "8f3849cd", - "webgpu/shader/execution/unary/f16_conversion.bin": "b18bf8ca", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "9aaa3916", - "webgpu/shader/execution/unary/f32_conversion.bin": "e435fc67", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "b61cf109", - "webgpu/shader/execution/unary/i32_complement.bin": "fb8983d2", - "webgpu/shader/execution/unary/i32_conversion.bin": "912e87a6", - "webgpu/shader/execution/unary/u32_complement.bin": "57794fd7", - "webgpu/shader/execution/unary/u32_conversion.bin": "eabaa756", - "webgpu/shader/execution/unary/ai_assignment.bin": "e2db3247" + "webgpu/shader/execution/binary/af_addition.bin": "e5c17c8c", + "webgpu/shader/execution/binary/af_logical.bin": "d02ed356", + "webgpu/shader/execution/binary/af_division.bin": "ecbfc42c", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "fc088c43", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "a80767d2", + "webgpu/shader/execution/binary/af_multiplication.bin": "512e875c", + "webgpu/shader/execution/binary/af_remainder.bin": "35708d73", + "webgpu/shader/execution/binary/af_subtraction.bin": "7a7d8859", + "webgpu/shader/execution/binary/f16_addition.bin": "9907b22f", + "webgpu/shader/execution/binary/f16_logical.bin": "f51647a", + "webgpu/shader/execution/binary/f16_division.bin": "a4b4b596", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "26cd1a3b", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "b3b798d7", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "8d4a8b67", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "277e52d4", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "27eb1a2f", + "webgpu/shader/execution/binary/f16_multiplication.bin": "1602ae27", + "webgpu/shader/execution/binary/f16_remainder.bin": "6f0c3a6c", + "webgpu/shader/execution/binary/f16_subtraction.bin": "187afd81", + "webgpu/shader/execution/binary/f32_addition.bin": "a6f8b35e", + "webgpu/shader/execution/binary/f32_logical.bin": "90a201d6", + "webgpu/shader/execution/binary/f32_division.bin": "b73b6009", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "d6ea5868", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "b15aea1f", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "a43ed12c", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "d07629b9", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "b14ec0e8", + "webgpu/shader/execution/binary/f32_multiplication.bin": "6bfc2599", + "webgpu/shader/execution/binary/f32_remainder.bin": "9d9f27d2", + "webgpu/shader/execution/binary/f32_subtraction.bin": "c1b0fc93", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "97a68c9", + "webgpu/shader/execution/binary/i32_comparison.bin": "f3eb5051", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "61983a8d", + "webgpu/shader/execution/binary/u32_comparison.bin": "8c08fad1", + "webgpu/shader/execution/abs.bin": "5d598ea2", + "webgpu/shader/execution/acos.bin": "f3b948fb", + "webgpu/shader/execution/acosh.bin": "be267adf", + "webgpu/shader/execution/asin.bin": "50a3ca9c", + "webgpu/shader/execution/asinh.bin": "dfdab533", + "webgpu/shader/execution/atan.bin": "e10a3fed", + "webgpu/shader/execution/atan2.bin": "9483868b", + "webgpu/shader/execution/atanh.bin": "fb49f9a5", + "webgpu/shader/execution/bitcast.bin": "342d31e4", + "webgpu/shader/execution/ceil.bin": "c54caec3", + "webgpu/shader/execution/clamp.bin": "fad50dea", + "webgpu/shader/execution/cos.bin": "b474375a", + "webgpu/shader/execution/cosh.bin": "bc6adf09", + "webgpu/shader/execution/cross.bin": "9b3ed927", + "webgpu/shader/execution/degrees.bin": "d39afaa0", + "webgpu/shader/execution/determinant.bin": "21dc31d9", + "webgpu/shader/execution/distance.bin": "ad9630e9", + "webgpu/shader/execution/dot.bin": "5fed0fe2", + "webgpu/shader/execution/exp.bin": "a1eb2a4a", + "webgpu/shader/execution/exp2.bin": "8ffefd36", + "webgpu/shader/execution/faceForward.bin": "26599c44", + "webgpu/shader/execution/floor.bin": "7d731a3f", + "webgpu/shader/execution/fma.bin": "a67941bd", + "webgpu/shader/execution/fract.bin": "52bdb3aa", + "webgpu/shader/execution/frexp.bin": "cf38f20f", + "webgpu/shader/execution/inverseSqrt.bin": "6ed0136d", + "webgpu/shader/execution/ldexp.bin": "69821bb", + "webgpu/shader/execution/length.bin": "f90faba4", + "webgpu/shader/execution/log.bin": "8f36e529", + "webgpu/shader/execution/log2.bin": "2423cfdb", + "webgpu/shader/execution/max.bin": "6bea6092", + "webgpu/shader/execution/min.bin": "17dd7386", + "webgpu/shader/execution/mix.bin": "de948e22", + "webgpu/shader/execution/modf.bin": "9a6ae129", + "webgpu/shader/execution/normalize.bin": "98404966", + "webgpu/shader/execution/pack2x16float.bin": "7a232f06", + "webgpu/shader/execution/pow.bin": "50c1518c", + "webgpu/shader/execution/quantizeToF16.bin": "4acafd64", + "webgpu/shader/execution/radians.bin": "ab0b4ebb", + "webgpu/shader/execution/reflect.bin": "d4edd90d", + "webgpu/shader/execution/refract.bin": "55d587bd", + "webgpu/shader/execution/round.bin": "239913af", + "webgpu/shader/execution/saturate.bin": "38a3dede", + "webgpu/shader/execution/sign.bin": "1a15fa60", + "webgpu/shader/execution/sin.bin": "45d8740b", + "webgpu/shader/execution/sinh.bin": "dd5e328b", + "webgpu/shader/execution/smoothstep.bin": "1a0f49d1", + "webgpu/shader/execution/sqrt.bin": "cce7c52a", + "webgpu/shader/execution/step.bin": "da66ffa", + "webgpu/shader/execution/tan.bin": "d3aa9b89", + "webgpu/shader/execution/tanh.bin": "b370d66e", + "webgpu/shader/execution/transpose.bin": "b8a9c228", + "webgpu/shader/execution/trunc.bin": "d38dfc52", + "webgpu/shader/execution/unpack2x16float.bin": "ecbff4ab", + "webgpu/shader/execution/unpack2x16snorm.bin": "55171d85", + "webgpu/shader/execution/unpack2x16unorm.bin": "9b66b0cf", + "webgpu/shader/execution/unpack4x8snorm.bin": "6c7ea28d", + "webgpu/shader/execution/unpack4x8unorm.bin": "7c035804", + "webgpu/shader/execution/unary/af_arithmetic.bin": "a307b4cd", + "webgpu/shader/execution/unary/af_assignment.bin": "4aa0e022", + "webgpu/shader/execution/unary/bool_conversion.bin": "445d60dc", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "9aa19f03", + "webgpu/shader/execution/unary/f16_conversion.bin": "a14fa253", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "f59a64a5", + "webgpu/shader/execution/unary/f32_conversion.bin": "3d4761f2", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "4e683564", + "webgpu/shader/execution/unary/i32_complement.bin": "42dd5b8d", + "webgpu/shader/execution/unary/i32_conversion.bin": "70bd317b", + "webgpu/shader/execution/unary/u32_complement.bin": "b8dd9928", + "webgpu/shader/execution/unary/u32_conversion.bin": "750cf298", + "webgpu/shader/execution/unary/ai_assignment.bin": "8123c23d" } \ No newline at end of file diff --git a/src/webgpu/shader/execution/expression/call/builtin/max.spec.ts b/src/webgpu/shader/execution/expression/call/builtin/max.spec.ts index 55bd5fb28405..63e3fda3f2b6 100644 --- a/src/webgpu/shader/execution/expression/call/builtin/max.spec.ts +++ b/src/webgpu/shader/execution/expression/call/builtin/max.spec.ts @@ -26,25 +26,23 @@ import { TypeU32, i32, u32, + abstractInt, + TypeAbstractInt, } from '../../../../../util/conversion.js'; +import { maxBigInt } from '../../../../../util/math.js'; import { Case } from '../../case.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractFloatBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './max.cache.js'; /** Generate set of max test cases from list of interesting values */ -function generateTestCases( - values: Array, - makeCase: (x: number, y: number) => Case -): Array { - const cases = new Array(); - values.forEach(e => { - values.forEach(f => { - cases.push(makeCase(e, f)); +function generateTestCases(values: Type[], makeCase: (x: Type, y: Type) => Case): Case[] { + return values.flatMap(e => { + return values.map(f => { + return makeCase(e, f); }); }); - return cases; } export const g = makeTestGroup(GPUTest); @@ -53,9 +51,27 @@ g.test('abstract_int') .specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions') .desc(`abstract int tests`) .params(u => - u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4] as const) + u + .combine('inputSource', onlyConstInputSource) + .combine('vectorize', [undefined, 2, 3, 4] as const) ) - .unimplemented(); + .fn(async t => { + const makeCase = (x: bigint, y: bigint): Case => { + return { input: [abstractInt(x), abstractInt(y)], expected: abstractInt(maxBigInt(x, y)) }; + }; + + const test_values = [-0x70000000n, -2n, -1n, 0n, 1n, 2n, 0x70000000n]; + const cases = generateTestCases(test_values, makeCase); + + await run( + t, + abstractIntBuiltin('max'), + [TypeAbstractInt, TypeAbstractInt], + TypeAbstractInt, + t.params, + cases + ); + }); g.test('u32') .specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions') @@ -68,7 +84,7 @@ g.test('u32') return { input: [u32(x), u32(y)], expected: u32(Math.max(x, y)) }; }; - const test_values: Array = [0, 1, 2, 0x70000000, 0x80000000, 0xffffffff]; + const test_values: number[] = [0, 1, 2, 0x70000000, 0x80000000, 0xffffffff]; const cases = generateTestCases(test_values, makeCase); await run(t, builtin('max'), [TypeU32, TypeU32], TypeU32, t.params, cases); @@ -85,7 +101,7 @@ g.test('i32') return { input: [i32(x), i32(y)], expected: i32(Math.max(x, y)) }; }; - const test_values: Array = [-0x70000000, -2, -1, 0, 1, 2, 0x70000000]; + const test_values: number[] = [-0x70000000, -2, -1, 0, 1, 2, 0x70000000]; const cases = generateTestCases(test_values, makeCase); await run(t, builtin('max'), [TypeI32, TypeI32], TypeI32, t.params, cases); diff --git a/src/webgpu/util/math.ts b/src/webgpu/util/math.ts index c61840aa1dcf..de075dbfba8f 100644 --- a/src/webgpu/util/math.ts +++ b/src/webgpu/util/math.ts @@ -2287,12 +2287,12 @@ export function absBigInt(v: bigint): bigint { return v < 0n ? -v : v; } -/** @returns the minimum from a list of bigints */ -export function minBigInt(...vals: bigint[]): bigint { - return vals.reduce((prev, cur) => (cur < prev ? cur : prev)); -} - /** @returns the maximum from a list of bigints */ export function maxBigInt(...vals: bigint[]): bigint { return vals.reduce((prev, cur) => (cur > prev ? cur : prev)); } + +/** @returns the minimum from a list of bigints */ +export function minBigInt(...vals: bigint[]): bigint { + return vals.reduce((prev, cur) => (cur < prev ? cur : prev)); +}