From 63658e137bf2efcb6199c849afc8be1b4995f2d2 Mon Sep 17 00:00:00 2001 From: Greggman Date: Wed, 8 Jan 2025 04:29:35 +0900 Subject: [PATCH] Add "enforceDefaultLimits" flag (#4124) I'm not sure what to do about this but dealing with dependent limits is kind of a PITA. Tests that deal with storage buffers and storage textures need to take into account that they might have 0. But, they also need to be tested with the maximum number of storage buffers/textures. So, if you set the test to use max storage buffers/textures then, unless you have a device that supports 0 you have no easy way to test that the test functions when the limit is 0. While refactoring the tests I start without requesting the limit so on compat I get zero. Once that works I add `MaxLimitsTestMixin` or similar to request the maximum limits, otherwise a compat device would get no coverage. But, now I have the issue that if I'm modifying the test I need to remember to test with 0 so I have to go manually comment out the code that's requesting max limits. So, I thought I'd add this option. --- src/common/framework/test_config.ts | 6 + src/common/runtime/cmdline.ts | 2 + src/common/runtime/helper/options.ts | 6 + src/common/runtime/helper/utils_worker.ts | 1 + src/common/runtime/server.ts | 2 + src/common/runtime/standalone.ts | 1 + src/common/util/navigator_gpu.ts | 84 +++++++++ src/resources/cache/hashes.json | 220 +++++++++++----------- 8 files changed, 212 insertions(+), 110 deletions(-) diff --git a/src/common/framework/test_config.ts b/src/common/framework/test_config.ts index 072aaf736027..48d090c45185 100644 --- a/src/common/framework/test_config.ts +++ b/src/common/framework/test_config.ts @@ -44,6 +44,11 @@ export type TestConfig = { */ forceFallbackAdapter: boolean; + /** + * Enforce the default limits on the adapter + */ + enforceDefaultLimits: boolean; + /** * Whether to enable the `logToWebSocket` function used for out-of-band test logging. */ @@ -59,5 +64,6 @@ export const globalTestConfig: TestConfig = { unrollConstEvalLoops: false, compatibility: false, forceFallbackAdapter: false, + enforceDefaultLimits: false, logToWebSocket: false, }; diff --git a/src/common/runtime/cmdline.ts b/src/common/runtime/cmdline.ts index b2d220ec8ef9..635c30eb1410 100644 --- a/src/common/runtime/cmdline.ts +++ b/src/common/runtime/cmdline.ts @@ -107,6 +107,8 @@ for (let i = 0; i < sys.args.length; ++i) { globalTestConfig.compatibility = true; } else if (a === '--force-fallback-adapter') { globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--enforce-default-limits') { + globalTestConfig.enforceDefaultLimits = true; } else if (a === '--log-to-websocket') { globalTestConfig.logToWebSocket = true; } else { diff --git a/src/common/runtime/helper/options.ts b/src/common/runtime/helper/options.ts index 4a82c7d2928e..2bea817d44a1 100644 --- a/src/common/runtime/helper/options.ts +++ b/src/common/runtime/helper/options.ts @@ -53,6 +53,7 @@ export interface CTSOptions { debug: boolean; compatibility: boolean; forceFallbackAdapter: boolean; + enforceDefaultLimits: boolean; unrollConstEvalLoops: boolean; powerPreference: GPUPowerPreference | null; logToWebSocket: boolean; @@ -63,6 +64,7 @@ export const kDefaultCTSOptions: CTSOptions = { debug: true, compatibility: false, forceFallbackAdapter: false, + enforceDefaultLimits: false, unrollConstEvalLoops: false, powerPreference: null, logToWebSocket: false, @@ -100,6 +102,10 @@ export const kCTSOptionsInfo: OptionsInfos = { debug: { description: 'show more info' }, compatibility: { description: 'run in compatibility mode' }, forceFallbackAdapter: { description: 'pass forceFallbackAdapter: true to requestAdapter' }, + enforceDefaultLimits: { + description: `force the adapter limits to the default limits. +Note: May fail on tests for low-power/high-performance`, + }, unrollConstEvalLoops: { description: 'unroll const eval loops in WGSL' }, powerPreference: { description: 'set default powerPreference for some tests', diff --git a/src/common/runtime/helper/utils_worker.ts b/src/common/runtime/helper/utils_worker.ts index 5886839f6c33..7054be317c13 100644 --- a/src/common/runtime/helper/utils_worker.ts +++ b/src/common/runtime/helper/utils_worker.ts @@ -19,6 +19,7 @@ export function setupWorkerEnvironment(ctsOptions: CTSOptions): Logger { globalTestConfig.enableDebugLogs = ctsOptions.debug; globalTestConfig.unrollConstEvalLoops = ctsOptions.unrollConstEvalLoops; globalTestConfig.compatibility = compatibility; + globalTestConfig.enforceDefaultLimits = ctsOptions.enforceDefaultLimits; globalTestConfig.logToWebSocket = ctsOptions.logToWebSocket; const log = new Logger(); diff --git a/src/common/runtime/server.ts b/src/common/runtime/server.ts index d908ce89ba7a..bb68b0413353 100644 --- a/src/common/runtime/server.ts +++ b/src/common/runtime/server.ts @@ -96,6 +96,8 @@ for (let i = 0; i < sys.args.length; ++i) { emitCoverage = true; } else if (a === '--force-fallback-adapter') { globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--enforce-default-limits') { + globalTestConfig.enforceDefaultLimits = true; } else if (a === '--log-to-websocket') { globalTestConfig.logToWebSocket = true; } else if (a === '--gpu-provider') { diff --git a/src/common/runtime/standalone.ts b/src/common/runtime/standalone.ts index a079ac28dd98..d5b51b11c6f5 100644 --- a/src/common/runtime/standalone.ts +++ b/src/common/runtime/standalone.ts @@ -52,6 +52,7 @@ const { runnow, powerPreference, compatibility, forceFallbackAdapter } = options globalTestConfig.enableDebugLogs = options.debug; globalTestConfig.unrollConstEvalLoops = options.unrollConstEvalLoops; globalTestConfig.compatibility = compatibility; +globalTestConfig.enforceDefaultLimits = options.enforceDefaultLimits; globalTestConfig.logToWebSocket = options.logToWebSocket; const logger = new Logger(); diff --git a/src/common/util/navigator_gpu.ts b/src/common/util/navigator_gpu.ts index 4e58797097ed..728b8cdadf54 100644 --- a/src/common/util/navigator_gpu.ts +++ b/src/common/util/navigator_gpu.ts @@ -1,4 +1,6 @@ +// eslint-disable-next-line import/no-restricted-paths import { TestCaseRecorder } from '../framework/fixture.js'; +import { globalTestConfig } from '../framework/test_config.js'; import { ErrorWithExtra, assert, objectEquals } from './util.js'; @@ -31,6 +33,7 @@ export function setGPUProvider(provider: GPUProvider) { } let impl: GPU | undefined = undefined; +let s_defaultLimits: Record | undefined = undefined; let defaultRequestAdapterOptions: GPURequestAdapterOptions | undefined; @@ -49,6 +52,14 @@ export function getDefaultRequestAdapterOptions() { return defaultRequestAdapterOptions; } +function copyLimits(objLike: GPUSupportedLimits) { + const obj: Record = {}; + for (const key in objLike) { + obj[key] = (objLike as unknown as Record)[key]; + } + return obj; +} + /** * Finds and returns the `navigator.gpu` object (or equivalent, for non-browser implementations). * Throws an exception if not found. @@ -60,6 +71,79 @@ export function getGPU(recorder: TestCaseRecorder | null): GPU { impl = gpuProvider(); + if (globalTestConfig.enforceDefaultLimits) { + // eslint-disable-next-line @typescript-eslint/unbound-method + const origRequestAdapterFn = impl.requestAdapter; + // eslint-disable-next-line @typescript-eslint/unbound-method + const origRequestDeviceFn = GPUAdapter.prototype.requestDevice; + + impl.requestAdapter = async function (options?: GPURequestAdapterOptions) { + if (!s_defaultLimits) { + const tempAdapter = await origRequestAdapterFn.call(this, { + ...defaultRequestAdapterOptions, + ...options, + }); + // eslint-disable-next-line no-restricted-syntax + const tempDevice = await tempAdapter?.requestDevice(); + s_defaultLimits = copyLimits(tempDevice!.limits); + tempDevice?.destroy(); + } + const adapter = await origRequestAdapterFn.call(this, { + ...defaultRequestAdapterOptions, + ...options, + }); + if (adapter) { + const limits = Object.fromEntries( + Object.entries(s_defaultLimits).map(([key, v]) => [key, v]) + ); + + Object.defineProperty(adapter, 'limits', { + get() { + return limits; + }, + }); + } + return adapter; + }; + + const enforceDefaultLimits = (adapter: GPUAdapter, desc: GPUDeviceDescriptor | undefined) => { + if (desc?.requiredLimits) { + for (const [key, value] of Object.entries(desc.requiredLimits)) { + const limit = s_defaultLimits![key]; + if (limit !== undefined && value !== undefined) { + const [beyondLimit, condition] = key.startsWith('max') + ? [value > limit, 'greater'] + : [value < limit, 'less']; + if (beyondLimit) { + throw new DOMException( + `requestedLimit ${value} for ${key} is ${condition} than adapter limit ${limit}`, + 'OperationError' + ); + } + } + } + } + }; + + GPUAdapter.prototype.requestDevice = async function ( + this: GPUAdapter, + desc?: GPUDeviceDescriptor | undefined + ) { + // We need to enforce the default limits because even though we patched the adapter to + // show defaults for adapter.limits, there are tests that test we throw when we request more than the max. + // In other words. + // + // adapter.requestDevice({ requiredLimits: { + // maxXXX: addapter.limits.maxXXX + 1, // should throw + // }); + // + // But unless we enforce this manually, it won't actual through if the adapter's + // true limits are higher than we patched above. + enforceDefaultLimits(this, desc); + return await origRequestDeviceFn.call(this, desc); + }; + } + if (defaultRequestAdapterOptions) { // eslint-disable-next-line @typescript-eslint/unbound-method const oldFn = impl.requestAdapter; diff --git a/src/resources/cache/hashes.json b/src/resources/cache/hashes.json index 16ed2d6f855f..7f214ed4d33b 100644 --- a/src/resources/cache/hashes.json +++ b/src/resources/cache/hashes.json @@ -1,112 +1,112 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "e5d3d0ec", - "webgpu/shader/execution/binary/af_logical.bin": "4cadb0c4", - "webgpu/shader/execution/binary/af_division.bin": "24d5c047", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "27b5045f", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "e51ed65c", - "webgpu/shader/execution/binary/af_multiplication.bin": "ccdd9db3", - "webgpu/shader/execution/binary/af_remainder.bin": "7ba7561", - "webgpu/shader/execution/binary/af_subtraction.bin": "77ae32fd", - "webgpu/shader/execution/binary/f16_addition.bin": "7cf4d65a", - "webgpu/shader/execution/binary/f16_logical.bin": "b9e93570", - "webgpu/shader/execution/binary/f16_division.bin": "9ec5ad6a", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "e89ed3cb", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "375d5af3", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "9bd3af4e", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "43350bb3", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "1edb6630", - "webgpu/shader/execution/binary/f16_multiplication.bin": "7485e77b", - "webgpu/shader/execution/binary/f16_remainder.bin": "ec817ba", - "webgpu/shader/execution/binary/f16_subtraction.bin": "aae1c57a", - "webgpu/shader/execution/binary/f32_addition.bin": "7134e85", - "webgpu/shader/execution/binary/f32_logical.bin": "24ba1a54", - "webgpu/shader/execution/binary/f32_division.bin": "f51e95fe", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "97f4a153", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "70677010", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "355c0954", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "85135fad", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "a3fa2750", - "webgpu/shader/execution/binary/f32_multiplication.bin": "ba41fc13", - "webgpu/shader/execution/binary/f32_remainder.bin": "142765dd", - "webgpu/shader/execution/binary/f32_subtraction.bin": "c1523f1c", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "bcff0350", - "webgpu/shader/execution/binary/i32_comparison.bin": "396f7bad", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "7357b8e9", - "webgpu/shader/execution/binary/u32_comparison.bin": "374b246a", - "webgpu/shader/execution/abs.bin": "1ab55590", - "webgpu/shader/execution/acos.bin": "d85ca70", - "webgpu/shader/execution/acosh.bin": "e28fd395", - "webgpu/shader/execution/asin.bin": "eced623b", - "webgpu/shader/execution/asinh.bin": "223989ea", - "webgpu/shader/execution/atan.bin": "d896ec78", - "webgpu/shader/execution/atan2.bin": "b394e737", - "webgpu/shader/execution/atanh.bin": "9e4a5a", - "webgpu/shader/execution/bitcast.bin": "51bb8e9f", - "webgpu/shader/execution/ceil.bin": "11d3b9aa", - "webgpu/shader/execution/clamp.bin": "b2860448", - "webgpu/shader/execution/cos.bin": "c965712f", - "webgpu/shader/execution/cosh.bin": "89f1ce32", - "webgpu/shader/execution/cross.bin": "8b3df30b", - "webgpu/shader/execution/degrees.bin": "182a521e", - "webgpu/shader/execution/determinant.bin": "d5b3ed92", - "webgpu/shader/execution/distance.bin": "d21d853b", - "webgpu/shader/execution/dot.bin": "c91e716", - "webgpu/shader/execution/exp.bin": "4240da7", - "webgpu/shader/execution/exp2.bin": "11938883", - "webgpu/shader/execution/faceForward.bin": "a2e27acc", - "webgpu/shader/execution/floor.bin": "c06553ca", - "webgpu/shader/execution/fma.bin": "7dea01cf", - "webgpu/shader/execution/fract.bin": "677b1105", - "webgpu/shader/execution/frexp.bin": "3dbf112c", - "webgpu/shader/execution/inverseSqrt.bin": "8f6bb04e", - "webgpu/shader/execution/ldexp.bin": "287a7307", - "webgpu/shader/execution/length.bin": "908ff679", - "webgpu/shader/execution/log.bin": "8585f4ac", - "webgpu/shader/execution/log2.bin": "6847e7ca", - "webgpu/shader/execution/max.bin": "777cfa16", - "webgpu/shader/execution/min.bin": "51ae81f5", - "webgpu/shader/execution/mix.bin": "56c2fa65", - "webgpu/shader/execution/modf.bin": "4e106c58", - "webgpu/shader/execution/normalize.bin": "32c44235", - "webgpu/shader/execution/pack2x16float.bin": "133f1db3", - "webgpu/shader/execution/pow.bin": "370df2fa", - "webgpu/shader/execution/quantizeToF16.bin": "8a4fa4a8", - "webgpu/shader/execution/radians.bin": "c4684d86", - "webgpu/shader/execution/reflect.bin": "3620e893", - "webgpu/shader/execution/refract.bin": "f6bd722f", - "webgpu/shader/execution/round.bin": "765d4e71", - "webgpu/shader/execution/saturate.bin": "772a5d55", - "webgpu/shader/execution/sign.bin": "b99ea52d", - "webgpu/shader/execution/sin.bin": "69c8cce9", - "webgpu/shader/execution/sinh.bin": "3bc5f870", - "webgpu/shader/execution/smoothstep.bin": "bc6be719", - "webgpu/shader/execution/sqrt.bin": "c3960a52", - "webgpu/shader/execution/step.bin": "8a715292", - "webgpu/shader/execution/tan.bin": "5c531104", - "webgpu/shader/execution/tanh.bin": "ff9cadf1", - "webgpu/shader/execution/transpose.bin": "f9cebed4", - "webgpu/shader/execution/trunc.bin": "1c0edd1b", - "webgpu/shader/execution/unpack2x16float.bin": "1d4051b9", - "webgpu/shader/execution/unpack2x16snorm.bin": "f9a16118", - "webgpu/shader/execution/unpack2x16unorm.bin": "cad45023", - "webgpu/shader/execution/unpack4x8snorm.bin": "26f9cbc4", - "webgpu/shader/execution/unpack4x8unorm.bin": "76de2d56", - "webgpu/shader/execution/unary/af_arithmetic.bin": "7044a2b4", - "webgpu/shader/execution/unary/af_assignment.bin": "fca7094b", - "webgpu/shader/execution/unary/bool_conversion.bin": "ac26e6b8", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "913af76", - "webgpu/shader/execution/unary/f16_conversion.bin": "1fb4a7a4", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "7c274ba7", - "webgpu/shader/execution/unary/f32_conversion.bin": "1175ae48", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "7bf685a3", - "webgpu/shader/execution/unary/i32_conversion.bin": "60437023", - "webgpu/shader/execution/unary/u32_conversion.bin": "3bc30fc0", - "webgpu/shader/execution/unary/ai_assignment.bin": "66d85afa", - "webgpu/shader/execution/binary/ai_arithmetic.bin": "3c6c91e3", - "webgpu/shader/execution/unary/ai_arithmetic.bin": "37cc249a", - "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "c22028c6", - "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "8fa6602", - "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "f1bc0050", - "webgpu/shader/execution/derivatives.bin": "d96a3465", - "webgpu/shader/execution/fwidth.bin": "c63db6a9" + "webgpu/shader/execution/binary/af_addition.bin": "a076fefd", + "webgpu/shader/execution/binary/af_logical.bin": "5ef95b51", + "webgpu/shader/execution/binary/af_division.bin": "2ee1f517", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "46d1c536", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "1ba9140b", + "webgpu/shader/execution/binary/af_multiplication.bin": "f55ec87f", + "webgpu/shader/execution/binary/af_remainder.bin": "39607546", + "webgpu/shader/execution/binary/af_subtraction.bin": "a1e1671b", + "webgpu/shader/execution/binary/f16_addition.bin": "98ec8cbb", + "webgpu/shader/execution/binary/f16_logical.bin": "e1b101aa", + "webgpu/shader/execution/binary/f16_division.bin": "f24f41e6", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "a6c126ba", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "4810437f", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "33bd4e0b", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "2a42a145", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "17eeecc2", + "webgpu/shader/execution/binary/f16_multiplication.bin": "5ee924d2", + "webgpu/shader/execution/binary/f16_remainder.bin": "a371e824", + "webgpu/shader/execution/binary/f16_subtraction.bin": "c5e6d455", + "webgpu/shader/execution/binary/f32_addition.bin": "371675d2", + "webgpu/shader/execution/binary/f32_logical.bin": "6c691798", + "webgpu/shader/execution/binary/f32_division.bin": "11ed1f8d", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "662a8c2a", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "3bef3e82", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "4b0d7b28", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "c1b78a5f", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "3ae5663c", + "webgpu/shader/execution/binary/f32_multiplication.bin": "7c887b3c", + "webgpu/shader/execution/binary/f32_remainder.bin": "955b27f7", + "webgpu/shader/execution/binary/f32_subtraction.bin": "10a5d990", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "d8d24c51", + "webgpu/shader/execution/binary/i32_comparison.bin": "97a65e83", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "76af97a5", + "webgpu/shader/execution/binary/u32_comparison.bin": "107ae7dd", + "webgpu/shader/execution/abs.bin": "8702bbde", + "webgpu/shader/execution/acos.bin": "505d4e5c", + "webgpu/shader/execution/acosh.bin": "6d849181", + "webgpu/shader/execution/asin.bin": "3739abaa", + "webgpu/shader/execution/asinh.bin": "5f912ea9", + "webgpu/shader/execution/atan.bin": "d15dc231", + "webgpu/shader/execution/atan2.bin": "60eb6015", + "webgpu/shader/execution/atanh.bin": "f8b2fb79", + "webgpu/shader/execution/bitcast.bin": "af41ce05", + "webgpu/shader/execution/ceil.bin": "8da53d8b", + "webgpu/shader/execution/clamp.bin": "a02c15b", + "webgpu/shader/execution/cos.bin": "4f444ab6", + "webgpu/shader/execution/cosh.bin": "aaa40c4b", + "webgpu/shader/execution/cross.bin": "534a949c", + "webgpu/shader/execution/degrees.bin": "2d55f678", + "webgpu/shader/execution/determinant.bin": "5b49ee94", + "webgpu/shader/execution/distance.bin": "d6963680", + "webgpu/shader/execution/dot.bin": "e03347d6", + "webgpu/shader/execution/exp.bin": "a5affb43", + "webgpu/shader/execution/exp2.bin": "21d376a0", + "webgpu/shader/execution/faceForward.bin": "e0e2ad0e", + "webgpu/shader/execution/floor.bin": "3658073", + "webgpu/shader/execution/fma.bin": "a7cc5707", + "webgpu/shader/execution/fract.bin": "44a3775d", + "webgpu/shader/execution/frexp.bin": "241abedb", + "webgpu/shader/execution/inverseSqrt.bin": "766974b5", + "webgpu/shader/execution/ldexp.bin": "db0c0fcf", + "webgpu/shader/execution/length.bin": "c1240c03", + "webgpu/shader/execution/log.bin": "98aceda7", + "webgpu/shader/execution/log2.bin": "ffdc85d7", + "webgpu/shader/execution/max.bin": "a2c6c4b1", + "webgpu/shader/execution/min.bin": "344390ef", + "webgpu/shader/execution/mix.bin": "367c1ff3", + "webgpu/shader/execution/modf.bin": "7be6faa3", + "webgpu/shader/execution/normalize.bin": "b2b9eb0c", + "webgpu/shader/execution/pack2x16float.bin": "a66da753", + "webgpu/shader/execution/pow.bin": "a9858b9", + "webgpu/shader/execution/quantizeToF16.bin": "bf80d34e", + "webgpu/shader/execution/radians.bin": "cc7b8d0c", + "webgpu/shader/execution/reflect.bin": "cb0be6ee", + "webgpu/shader/execution/refract.bin": "501ac731", + "webgpu/shader/execution/round.bin": "b4ea1e61", + "webgpu/shader/execution/saturate.bin": "2783de66", + "webgpu/shader/execution/sign.bin": "30ad6ecf", + "webgpu/shader/execution/sin.bin": "9f8b5d9e", + "webgpu/shader/execution/sinh.bin": "d988cc09", + "webgpu/shader/execution/smoothstep.bin": "2e89af8e", + "webgpu/shader/execution/sqrt.bin": "55dd81cf", + "webgpu/shader/execution/step.bin": "f1bced79", + "webgpu/shader/execution/tan.bin": "a8354079", + "webgpu/shader/execution/tanh.bin": "fd1c38ee", + "webgpu/shader/execution/transpose.bin": "e8bdca54", + "webgpu/shader/execution/trunc.bin": "ffedffa", + "webgpu/shader/execution/unpack2x16float.bin": "9251ad61", + "webgpu/shader/execution/unpack2x16snorm.bin": "6133b78b", + "webgpu/shader/execution/unpack2x16unorm.bin": "291b47bd", + "webgpu/shader/execution/unpack4x8snorm.bin": "93230ee1", + "webgpu/shader/execution/unpack4x8unorm.bin": "99fd9a23", + "webgpu/shader/execution/unary/af_arithmetic.bin": "dc1de35b", + "webgpu/shader/execution/unary/af_assignment.bin": "6a907068", + "webgpu/shader/execution/unary/bool_conversion.bin": "4fb09ad6", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "5443808d", + "webgpu/shader/execution/unary/f16_conversion.bin": "e6f6743", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "980abd9d", + "webgpu/shader/execution/unary/f32_conversion.bin": "c666a6e8", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "4c1bf2ef", + "webgpu/shader/execution/unary/i32_conversion.bin": "9d2e1411", + "webgpu/shader/execution/unary/u32_conversion.bin": "962b68ac", + "webgpu/shader/execution/unary/ai_assignment.bin": "d34f3811", + "webgpu/shader/execution/binary/ai_arithmetic.bin": "b4811a5c", + "webgpu/shader/execution/unary/ai_arithmetic.bin": "d203a070", + "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "1405c422", + "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "c24e7f75", + "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "e36fcfd", + "webgpu/shader/execution/derivatives.bin": "e8c5ea73", + "webgpu/shader/execution/fwidth.bin": "cb050a6f" } \ No newline at end of file