Download build/webgpu/manifest.json from webgpu-kernels/com.microsoft.QLinearConv: direct link, hf CLI and curl.
- Browser
- Download file 266 kB
-
https://huggingface.co/kernels/webgpu-kernels/com.microsoft.QLinearConv/resolve/v1/build/webgpu/manifest.json
- Command line
-
hf download hf://webgpu-kernels/com.microsoft.QLinearConv@v1/build/webgpu/manifest.json
-
curl -L -o manifest.json https://huggingface.co/kernels/webgpu-kernels/com.microsoft.QLinearConv/resolve/v1/build/webgpu/manifest.json
266 kB
| { | |
| "domain": "com.microsoft", | |
| "name": "QLinearConv", | |
| "sinceVersion": 1, | |
| "inputs": { | |
| "x": { "dtype": "TX" }, | |
| "x_scale": { "dtype": "TF" }, | |
| "x_zero_point": { "dtype": "TX" }, | |
| "w": { "dtype": "TW" }, | |
| "w_scale": { "dtype": "TF" }, | |
| "w_zero_point": { "dtype": "TW" }, | |
| "y_scale": { "dtype": "TF" }, | |
| "y_zero_point": { "dtype": "TY" }, | |
| "B": { "dtype": "int32", "rank": 1, "optional": true } | |
| }, | |
| "outputs": { | |
| "y": { | |
| "dtype": "TY", | |
| "rank": "ranks.x", | |
| "shape": "([dim(shapes.x, 0), expectedOutputWidth, dim(shapes.w, 0)] if ranks.x == 3 else ([dim(shapes.x, 0), expectedOutputHeight, expectedOutputWidth, dim(shapes.w, 0)] if ranks.x == 4 else [dim(shapes.x, 0), expectedOutputDepth, expectedOutputHeight, expectedOutputWidth, dim(shapes.w, 0)])) if channelsLast else ([dim(shapes.x, 0), dim(shapes.w, 0), expectedOutputWidth] if ranks.x == 3 else ([dim(shapes.x, 0), dim(shapes.w, 0), expectedOutputHeight, expectedOutputWidth] if ranks.x == 4 else [dim(shapes.x, 0), dim(shapes.w, 0), expectedOutputDepth, expectedOutputHeight, expectedOutputWidth]))" | |
| } | |
| }, | |
| "attributes": { | |
| "auto_pad": { "default": "NOTSET" }, | |
| "channels_last": { "default": 0 }, | |
| "group": { "default": 1 }, | |
| "dilations": {}, | |
| "kernel_shape": {}, | |
| "pads": {}, | |
| "strides": {} | |
| }, | |
| "attributeConstraints": { "auto_pad": { "values": ["NOTSET", "SAME_UPPER", "SAME_LOWER", "VALID"] } }, | |
| "typeConstraints": { "TX": ["uint8", "int8"], "TW": ["uint8", "int8"], "TY": ["uint8", "int8"], "TF": ["float32"] }, | |
| "tunables": { | |
| "WORKGROUP_SIZE": { "default": 256 }, | |
| "NHWC_OW_TILE": { "default": 4 }, | |
| "NHWC_IM2COL_WORDS": { "default": 2 }, | |
| "EXACT_MATRIX_MIN_INVOCATIONS": { "default": 10240 }, | |
| "NHWC_BIAS_TARGET_WORKGROUPS": { "default": 64 } | |
| }, | |
| "derive": { | |
| "channelsLast": "attrs.channels_last != 0", | |
| "convInChannels": "dim(shapes.x, ranks.x - 1) if channelsLast else dim(shapes.x, 1)", | |
| "convOutChannels": "dim(shapes.w, 0)", | |
| "inputDepth": "(dim(shapes.x, 1) if channelsLast else dim(shapes.x, 2)) if ranks.x == 5 else 1", | |
| "inputHeight": "((dim(shapes.x, 2) if channelsLast else dim(shapes.x, 3)) if ranks.x == 5 else ((dim(shapes.x, 1) if channelsLast else dim(shapes.x, 2)) if ranks.x == 4 else 1))", | |
| "inputWidth": "(dim(shapes.x, ranks.x - 2) if channelsLast else dim(shapes.x, ranks.x - 1)) if ranks.x >= 3 else 1", | |
| "outputDepth": "(dim(shapes.y, 1) if channelsLast else dim(shapes.y, 2)) if ranks.y == 5 else 1", | |
| "outputHeight": "((dim(shapes.y, 2) if channelsLast else dim(shapes.y, 3)) if ranks.y == 5 else ((dim(shapes.y, 1) if channelsLast else dim(shapes.y, 2)) if ranks.y == 4 else 1))", | |
| "outputWidth": "(dim(shapes.y, ranks.y - 2) if channelsLast else dim(shapes.y, ranks.y - 1)) if ranks.y >= 3 else 1", | |
| "kernelDepth": "dim(shapes.w, 2) if ranks.w == 5 else 1", | |
| "kernelHeight": "dim(shapes.w, 3) if ranks.w == 5 else (dim(shapes.w, 2) if ranks.w == 4 else 1)", | |
| "kernelWidth": "dim(shapes.w, ranks.w - 1) if ranks.w >= 3 else 1", | |
| "spatialRank": "ranks.w - 2", | |
| "outSpatial": "outputDepth * outputHeight * outputWidth", | |
| "convK": "dim(shapes.w, 1) * kernelDepth * kernelHeight * kernelWidth", | |
| "dp4aCandidateKWords": 128, | |
| "dp4aAppleCompact": "device.adapterInfo.vendor == \"apple\" and device.features.has(\"subgroups\") and not channelsLast and not present.B and attrs.group == 1 and (kernelHeight > 1 or kernelWidth > 1) and convOutChannels >= outSpatial and convK >= 4 * dp4aCandidateKWords and ceilDiv(convOutChannels, 4) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(outSpatial, 4) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "dp4aCompactKWords": "dp4aCandidateKWords if dp4aAppleCompact else 32", | |
| "sgmatM": "dim(shapes.x, 0) * outSpatial if channelsLast else convOutChannels", | |
| "sgmatN": "convOutChannels if channelsLast else outSpatial", | |
| "sgmatTileRows": "sgmatM", | |
| "precastRows": "sgmatM", | |
| "precastContraction": "convK", | |
| "precastCols": "sgmatN", | |
| "precastBatches": "1 if channelsLast else dim(shapes.x, 0)", | |
| "portableWorkgroupCols": 8, | |
| "kernelShapeLengthOk": "not has(attrs, \"kernel_shape\") or (attrs.kernel_shape | length) == spatialRank", | |
| "stridesLengthOk": "not has(attrs, \"strides\") or (attrs.strides | length) == spatialRank", | |
| "dilationsLengthOk": "not has(attrs, \"dilations\") or (attrs.dilations | length) == spatialRank", | |
| "padsLengthOk": "not has(attrs, \"pads\") or (attrs.pads | length) == 2 * spatialRank", | |
| "kernelD": "attrs.kernel_shape[0] if kernelShapeLengthOk and has(attrs, \"kernel_shape\") and spatialRank == 3 else 1", | |
| "kernelH": "attrs.kernel_shape[spatialRank - 2] if kernelShapeLengthOk and has(attrs, \"kernel_shape\") and spatialRank >= 2 else 1", | |
| "kernelW": "attrs.kernel_shape[spatialRank - 1] if kernelShapeLengthOk and has(attrs, \"kernel_shape\") and spatialRank >= 1 else 1", | |
| "strideD": "attrs.strides[0] if stridesLengthOk and has(attrs, \"strides\") and spatialRank == 3 else 1", | |
| "strideH": "attrs.strides[spatialRank - 2] if stridesLengthOk and has(attrs, \"strides\") and spatialRank >= 2 else 1", | |
| "strideW": "attrs.strides[spatialRank - 1] if stridesLengthOk and has(attrs, \"strides\") and spatialRank >= 1 else 1", | |
| "dilationD": "attrs.dilations[0] if dilationsLengthOk and has(attrs, \"dilations\") and spatialRank == 3 else 1", | |
| "dilationH": "attrs.dilations[spatialRank - 2] if dilationsLengthOk and has(attrs, \"dilations\") and spatialRank >= 2 else 1", | |
| "dilationW": "attrs.dilations[spatialRank - 1] if dilationsLengthOk and has(attrs, \"dilations\") and spatialRank >= 1 else 1", | |
| "padFront": "attrs.pads[0] if padsLengthOk and has(attrs, \"pads\") and spatialRank == 3 else 0", | |
| "padTop": "attrs.pads[spatialRank - 2] if padsLengthOk and has(attrs, \"pads\") and spatialRank >= 2 else 0", | |
| "padLeft": "attrs.pads[spatialRank - 1] if padsLengthOk and has(attrs, \"pads\") and spatialRank >= 1 else 0", | |
| "padBack": "attrs.pads[spatialRank] if padsLengthOk and has(attrs, \"pads\") and spatialRank == 3 else 0", | |
| "padBottom": "attrs.pads[2 * spatialRank - 2] if padsLengthOk and has(attrs, \"pads\") and spatialRank >= 2 else 0", | |
| "padRight": "attrs.pads[2 * spatialRank - 1] if padsLengthOk and has(attrs, \"pads\") and spatialRank >= 1 else 0", | |
| "autoPadSame": "attrs.auto_pad == \"SAME_UPPER\" or attrs.auto_pad == \"SAME_LOWER\"", | |
| "autoPadValid": "attrs.auto_pad == \"VALID\"", | |
| "samePadDepth": "max(0, (outputDepth - 1) * strideD + (kernelDepth - 1) * dilationD + 1 - inputDepth)", | |
| "samePadHeight": "max(0, (outputHeight - 1) * strideH + (kernelHeight - 1) * dilationH + 1 - inputHeight)", | |
| "samePadWidth": "max(0, (outputWidth - 1) * strideW + (kernelWidth - 1) * dilationW + 1 - inputWidth)", | |
| "samePadFront": "floor(samePadDepth / 2) if attrs.auto_pad == \"SAME_UPPER\" else samePadDepth - floor(samePadDepth / 2)", | |
| "samePadTop": "floor(samePadHeight / 2) if attrs.auto_pad == \"SAME_UPPER\" else samePadHeight - floor(samePadHeight / 2)", | |
| "samePadLeft": "floor(samePadWidth / 2) if attrs.auto_pad == \"SAME_UPPER\" else samePadWidth - floor(samePadWidth / 2)", | |
| "effectivePadFront": "samePadFront if autoPadSame else (0 if autoPadValid else padFront)", | |
| "effectivePadTop": "samePadTop if autoPadSame else (0 if autoPadValid else padTop)", | |
| "effectivePadLeft": "samePadLeft if autoPadSame else (0 if autoPadValid else padLeft)", | |
| "expectedOutputDepth": "ceil(inputDepth / strideD) if autoPadSame else floor((inputDepth + (0 if autoPadValid else padFront + padBack) - ((kernelDepth - 1) * dilationD + 1)) / strideD) + 1", | |
| "expectedOutputHeight": "ceil(inputHeight / strideH) if autoPadSame else floor((inputHeight + (0 if autoPadValid else padTop + padBottom) - ((kernelHeight - 1) * dilationH + 1)) / strideH) + 1", | |
| "expectedOutputWidth": "ceil(inputWidth / strideW) if autoPadSame else floor((inputWidth + (0 if autoPadValid else padLeft + padRight) - ((kernelWidth - 1) * dilationW + 1)) / strideW) + 1", | |
| "wave32Adapter": "has(device.adapterInfo, \"subgroupMinSize\") and has(device.adapterInfo, \"subgroupMaxSize\") and device.adapterInfo.subgroupMinSize == 32 and device.adapterInfo.subgroupMaxSize == 32", | |
| "canPinSubgroupSize32": "device.features.has(\"subgroups\") and device.features.has(\"subgroup-size-control\") and has(device.adapterInfo, \"subgroupMinSize\") and has(device.adapterInfo, \"subgroupMaxSize\") and device.adapterInfo.subgroupMinSize <= 32 and device.adapterInfo.subgroupMaxSize >= 32", | |
| "pinSubgroupSize32": "canPinSubgroupSize32 and not wave32Adapter", | |
| "wave32Effective": "wave32Adapter or pinSubgroupSize32", | |
| "deviceWorkgroupCap": "min(device.limits.maxComputeInvocationsPerWorkgroup, device.limits.maxComputeWorkgroupSizeX)", | |
| "sgmatTileN": "64", | |
| "sgmatTileK": "32", | |
| "sgmatColumnGroups": "2", | |
| "sgmatStorageRowGroups": "floor((device.limits.maxComputeWorkgroupStorageSize - sgmatTileN * sgmatTileK * 4) / (16 * sgmatTileK * 4))", | |
| "sgmatRowGroups": "max(1, min(4, floor(deviceWorkgroupCap / (32 * sgmatColumnGroups)), sgmatStorageRowGroups, max(floor(sgmatStorageRowGroups / 2), floor(sgmatTileRows / 16))))", | |
| "sgmatTileM": "16 * sgmatRowGroups", | |
| "sgmatSubgroups": "sgmatRowGroups * sgmatColumnGroups", | |
| "sgmatWorkgroup": "32 * sgmatSubgroups", | |
| "sgmatStagingBytes": "(sgmatTileM + sgmatTileN) * sgmatTileK * 4", | |
| "sgmatScratchBytes": "sgmatSubgroups * 4 * 64 * 4", | |
| "sgmatReuseStaging": "sgmatStagingBytes + sgmatScratchBytes > device.limits.maxComputeWorkgroupStorageSize", | |
| "sgmatSharedBytes": "sgmatStagingBytes + (0 if sgmatReuseStaging else sgmatScratchBytes)", | |
| "sgmatDeviceOk": "sgmatWorkgroup <= deviceWorkgroupCap and sgmatSharedBytes <= device.limits.maxComputeWorkgroupStorageSize", | |
| "precastSubgroups": "max(1, min(4, ceilDiv(precastRows, 16), floor(deviceWorkgroupCap / 32), floor(device.limits.maxComputeWorkgroupStorageSize / (8 * 64 * 4))))", | |
| "precastTileM": "16 * precastSubgroups", | |
| "precastTileN": "4 * 8", | |
| "precastTileK": "4 * 8", | |
| "precastWorkgroup": "32 * precastSubgroups", | |
| "preparedK": "ceilDiv(precastContraction, precastTileK) * precastTileK", | |
| "preparedN": "ceilDiv(precastCols, precastTileN) * precastTileN", | |
| "preparedElements": "ceilDiv(precastRows, precastTileM) * precastTileM * preparedK", | |
| "preparedBElements": "precastBatches * preparedK * preparedN", | |
| "prepareWorkgroup": "min(256, deviceWorkgroupCap)", | |
| "prepareTotalElements": "preparedElements + preparedBElements", | |
| "prepareGroups": "ceilDiv(prepareTotalElements, 4 * prepareWorkgroup)", | |
| "prepareDispatchElements": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535)) * min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535)) * prepareWorkgroup * 4", | |
| "precastResourcesOk": "deviceWorkgroupCap >= precastWorkgroup and precastSubgroups * 8 * 64 * 4 <= device.limits.maxComputeWorkgroupStorageSize", | |
| "precastDispatchOk": "prepareTotalElements <= 4294967295 and prepareDispatchElements <= 4294967296 and ceilDiv(precastCols, precastTileN) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(precastRows, precastTileM) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and prepareGroups <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) * min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "precastF32BuffersOk": "preparedElements * 4 <= device.limits.maxStorageBufferBindingSize and preparedElements * 4 <= device.limits.maxBufferSize and preparedBElements * 4 <= device.limits.maxStorageBufferBindingSize and preparedBElements * 4 <= device.limits.maxBufferSize", | |
| "precastF16BuffersOk": "preparedElements * 2 <= device.limits.maxStorageBufferBindingSize and preparedElements * 2 <= device.limits.maxBufferSize and preparedBElements * 2 <= device.limits.maxStorageBufferBindingSize and preparedBElements * 2 <= device.limits.maxBufferSize", | |
| "portableWorkgroupRows": "pow2ceil(min(16, max(4, pow2ceil(ceilDiv(precastRows, 4))), floor(deviceWorkgroupCap / portableWorkgroupCols), device.limits.maxComputeWorkgroupSizeY) + 1) / 2", | |
| "portableTileM": "4 * portableWorkgroupRows", | |
| "portableTileN": "4 * portableWorkgroupCols", | |
| "portableTileK": 32, | |
| "portablePartialK": "floor(16777216 / (255 * 255) / portableTileK) * portableTileK", | |
| "portableGeometryOk": "portableWorkgroupRows >= 4 and portableWorkgroupCols <= device.limits.maxComputeWorkgroupSizeX and portablePartialK >= portableTileK and ceilDiv(precastRows, portableTileM) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "spatialAttributeLengthsOk": "kernelShapeLengthOk and stridesLengthOk and dilationsLengthOk and padsLengthOk", | |
| "kernelShapeMatchesWeights": "not has(attrs, \"kernel_shape\") or (kernelW == kernelWidth and (spatialRank < 2 or kernelH == kernelHeight) and (spatialRank < 3 or kernelD == kernelDepth))", | |
| "kernelExtentsOk": "kernelWidth >= 1 and (spatialRank < 2 or kernelHeight >= 1) and (spatialRank < 3 or kernelDepth >= 1)", | |
| "stridesValuesOk": "not has(attrs, \"strides\") or (strideD >= 1 and floor(strideD) == strideD and strideH >= 1 and floor(strideH) == strideH and strideW >= 1 and floor(strideW) == strideW)", | |
| "dilationsValuesOk": "not has(attrs, \"dilations\") or (dilationD >= 1 and floor(dilationD) == dilationD and dilationH >= 1 and floor(dilationH) == dilationH and dilationW >= 1 and floor(dilationW) == dilationW)", | |
| "padsValuesOk": "padFront >= 0 and floor(padFront) == padFront and padTop >= 0 and floor(padTop) == padTop and padLeft >= 0 and floor(padLeft) == padLeft and padBack >= 0 and floor(padBack) == padBack and padBottom >= 0 and floor(padBottom) == padBottom and padRight >= 0 and floor(padRight) == padRight", | |
| "explicitPadsOk": "attrs.auto_pad == \"NOTSET\" or not has(attrs, \"pads\")", | |
| "spatialAttributesOk": "spatialRank >= 1 and spatialRank <= 3 and spatialAttributeLengthsOk and kernelShapeMatchesWeights and kernelExtentsOk and stridesValuesOk and dilationsValuesOk and padsValuesOk and explicitPadsOk", | |
| "xyQuantContract": "(ranks.x_scale == 0 or (ranks.x_scale == 1 and dim(shapes.x_scale, 0) == 1)) and (ranks.y_scale == 0 or (ranks.y_scale == 1 and dim(shapes.y_scale, 0) == 1)) and (ranks.x_zero_point == 0 or (ranks.x_zero_point == 1 and dim(shapes.x_zero_point, 0) == 1)) and (ranks.y_zero_point == 0 or (ranks.y_zero_point == 1 and dim(shapes.y_zero_point, 0) == 1))", | |
| "rank3TensorOk": "spatialAttributesOk and ranks.x == 3 and ranks.w == 3 and ranks.y == 3", | |
| "rank5TensorOk": "spatialAttributesOk and ranks.x == 5 and ranks.w == 5 and ranks.y == 5", | |
| "scalarWeightQuantOk": "(ranks.w_scale == 0 or (ranks.w_scale == 1 and dim(shapes.w_scale, 0) == 1)) and (ranks.w_zero_point == 0 or (ranks.w_zero_point == 1 and dim(shapes.w_zero_point, 0) == 1))", | |
| "yScalar": "\"u32\" if tensorDtypes.y == \"uint8\" else \"i32\"", | |
| "yUnsigned": "tensorDtypes.y == \"uint8\"", | |
| "qMin": "0 if tensorDtypes.y == \"uint8\" else 0 - 128", | |
| "qMax": "255 if tensorDtypes.y == \"uint8\" else 127", | |
| "hasBZero": true, | |
| "packedFeature": "device.wgslLanguageFeatures.has(\"packed_4x8_integer_dot_product\")", | |
| "rank4TensorOk": "spatialAttributesOk and ranks.x == 4 and ranks.w == 4 and ranks.y == 4", | |
| "outputBatchChannelsOk": "dim(shapes.y, 0) == dim(shapes.x, 0) and (dim(shapes.y, ranks.y - 1) if channelsLast else dim(shapes.y, 1)) == convOutChannels", | |
| "groupChannelsOk": "attrs.group >= 1 and dim(shapes.w, 1) * attrs.group == convInChannels and convOutChannels % attrs.group == 0", | |
| "outputSpatialOk": "outputWidth == expectedOutputWidth and (spatialRank < 2 or outputHeight == expectedOutputHeight) and (spatialRank < 3 or outputDepth == expectedOutputDepth)", | |
| "perChannelWeightQuantOk": "ranks.w_scale == 1 and dim(shapes.w_scale, 0) == convOutChannels and ranks.w_zero_point == 1 and dim(shapes.w_zero_point, 0) == convOutChannels", | |
| "flexibleWeightQuantOk": "scalarWeightQuantOk or perChannelWeightQuantOk", | |
| "outImageSize": "1 if channelsLast else outSpatial", | |
| "convKPadded": "ceilDiv(convK, 4) * 4", | |
| "biasContractOk": "present.B and ranks.B == 1 and dim(shapes.B, 0) == convOutChannels", | |
| "gemmDispatchOk": "ceilDiv(outSpatial, 64) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(convOutChannels, 64) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(convOutChannels, 8) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(outSpatial, 8) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and dim(shapes.x, 0) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "kMajorWeightStorageOk": "convKPadded * convOutChannels * 4 <= device.limits.maxStorageBufferBindingSize", | |
| "nhwcColsStorageOk": "dim(shapes.x, 0) * outSpatial * convKPadded * 4 <= device.limits.maxStorageBufferBindingSize", | |
| "nchwColsStorageOk": "dim(shapes.x, 0) * convK * outSpatial * 4 <= device.limits.maxStorageBufferBindingSize", | |
| "aUnsigned": "tensorDtypes.x == \"uint8\" if channelsLast else tensorDtypes.w == \"uint8\"", | |
| "bUnsigned": "tensorDtypes.w == \"uint8\" if channelsLast else tensorDtypes.x == \"uint8\"", | |
| "aScalar": "\"u32\" if aUnsigned else \"i32\"", | |
| "bScalar": "\"u32\" if bUnsigned else \"i32\"", | |
| "xScalar": "\"u32\" if tensorDtypes.x == \"uint8\" else \"i32\"", | |
| "wScalar": "\"u32\" if tensorDtypes.w == \"uint8\" else \"i32\"", | |
| "aZeroPerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "bZeroPerColumn": "perChannelWeightQuantOk and channelsLast", | |
| "requant": "(\"per_column\" if channelsLast else \"per_row\") if perChannelWeightQuantOk else \"per_tensor\"", | |
| "wZeroPerChannel": "perChannelWeightQuantOk", | |
| "sgmatDispatchOk": "ceilDiv(sgmatN, sgmatTileN) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(sgmatM, sgmatTileM) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "sgmatFullGrid": "floor(sgmatM / sgmatTileM) * floor(sgmatN / sgmatTileN) * (1 if channelsLast else dim(shapes.x, 0))", | |
| "sgmatUsefulInvocations": "sgmatFullGrid * sgmatWorkgroup * convK / (convK + 2 * sgmatTileK)", | |
| "precastFullGrid": "floor(sgmatM / precastTileM) * floor(sgmatN / precastTileN) * (1 if channelsLast else dim(shapes.x, 0))", | |
| "precastUsefulInvocations": "precastFullGrid * precastWorkgroup * convK / (convK + 2 * precastTileK)", | |
| "precastAmortizedInvocations": "precastUsefulInvocations * max(1, (convK - 2 * precastTileK) / precastTileK)", | |
| "precast_pointwise_nchw_ok": "(attrs.channels_last == 0) and (not present.B) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (kernelHeight == 1) and (kernelWidth == 1) and (strideH == 1) and (strideW == 1) and (padTop == 0 and padBottom == 0) and (padLeft == 0 and padRight == 0) and (dim(shapes.w, 1) == convInChannels) and (outputHeight == inputHeight) and (outputWidth == inputWidth) and (gemmDispatchOk)", | |
| "precast_im2col_nchw_ok": "(attrs.channels_last == 0) and (not present.B) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and (outputSpatialOk) and ((kernelHeight > 1 or kernelWidth > 1)) and (convK >= 64) and (convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)) and (nchwColsStorageOk) and (gemmDispatchOk)", | |
| "precast_im2col_nchw_bias_ok": "(attrs.channels_last == 0) and (biasContractOk) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and (outputSpatialOk) and (convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)) and (nchwColsStorageOk) and (gemmDispatchOk)", | |
| "precast_pointwise_nhwc_ok": "(attrs.channels_last != 0) and (not present.B) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and (kernelHeight == 1) and (kernelWidth == 1) and (strideH == 1) and (strideW == 1) and (padTop == 0 and padBottom == 0) and (padLeft == 0 and padRight == 0) and (outputHeight == inputHeight) and (outputWidth == inputWidth) and (kMajorWeightStorageOk) and (gemmDispatchOk)", | |
| "precast_pointwise_nhwc_bias_ok": "(attrs.channels_last != 0) and (biasContractOk) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and (kernelHeight == 1) and (kernelWidth == 1) and (strideH == 1) and (strideW == 1) and (padTop == 0 and padBottom == 0) and (padLeft == 0 and padRight == 0) and (outputHeight == inputHeight) and (outputWidth == inputWidth) and (kMajorWeightStorageOk) and (gemmDispatchOk)", | |
| "precast_im2col_nhwc_ok": "(attrs.channels_last != 0) and (not present.B) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and ((kernelHeight > 1 or kernelWidth > 1)) and (outputSpatialOk) and (nhwcColsStorageOk) and (kMajorWeightStorageOk) and (gemmDispatchOk)", | |
| "precast_im2col_nhwc_bias_ok": "(attrs.channels_last != 0) and (biasContractOk) and (rank4TensorOk) and (flexibleWeightQuantOk) and (attrs.group == 1) and (dim(shapes.w, 1) == convInChannels) and ((kernelHeight > 1 or kernelWidth > 1)) and (outputSpatialOk) and (nhwcColsStorageOk) and (kMajorWeightStorageOk) and (gemmDispatchOk)", | |
| "portableLoadsOk": "portableTileM * portableTileK % (4 * portableWorkgroupRows * portableWorkgroupCols) == 0 and portableTileN * portableTileK % (4 * portableWorkgroupRows * portableWorkgroupCols) == 0", | |
| "nhwcOc4UnitColumnThreads": "dim(shapes.y, 0) * outputHeight * outputWidth * ceilDiv(convOutChannels, 4)", | |
| "nhwcOc4ColumnTile": "min(tunables.NHWC_OW_TILE, max(1, floor(nhwcOc4UnitColumnThreads / (tunables.WORKGROUP_SIZE * tunables.NHWC_BIAS_TARGET_WORKGROUPS)))) if present.B else tunables.NHWC_OW_TILE", | |
| "nhwcOc4Threads": "dim(shapes.y, 0) * outputHeight * ceilDiv(outputWidth, nhwcOc4ColumnTile) * ceilDiv(convOutChannels, 4)", | |
| "nhwcOc4Workgroups": "ceilDiv(nhwcOc4Threads, tunables.WORKGROUP_SIZE)", | |
| "nhwcOc4DispatchOk": "min(nhwcOc4Workgroups, DISPATCH_FOLD_WIDTH) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535) and ceilDiv(nhwcOc4Workgroups, DISPATCH_FOLD_WIDTH) <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", | |
| "bScalePerColumn": "perChannelWeightQuantOk and channelsLast", | |
| "matrixBatchB": "not channelsLast", | |
| "matrixBiasPerRow": "not channelsLast", | |
| "matrixSubgroupId": true, | |
| "prepareBatchB": "not channelsLast", | |
| "requantize": true, | |
| "wUnsigned": "tensorDtypes.w == \"uint8\"", | |
| "xUnsigned": "tensorDtypes.x == \"uint8\"" | |
| }, | |
| "when": ["outputBatchChannelsOk", "xyQuantContract"], | |
| "bindings": { | |
| "x_w": { "name": "x", "elementType": "$xScalar" }, | |
| "x_zero_point_w": { "name": "x_zero_point", "elementType": "$xScalar", "length": 1 }, | |
| "w_w": { "name": "w", "elementType": "$wScalar" }, | |
| "w_zero_point_w": { "name": "w_zero_point", "elementType": "$wScalar" }, | |
| "x_scale": { "elementType": "f32", "length": 1 }, | |
| "w_scale": { "elementType": "f32" }, | |
| "y_scale": { "elementType": "f32", "length": 1 }, | |
| "y_zero_point_w": { "name": "y_zero_point", "elementType": "$yScalar", "length": 1 }, | |
| "y_w": { "name": "y", "elementType": "$yScalar" }, | |
| "B": { "elementType": "i32" }, | |
| "accum_out": { "scratch": "accum", "name": "y", "elementType": "i32" }, | |
| "accum_in": { "scratch": "accum", "name": "accum", "buffer": "read-only-storage", "elementType": "i32" }, | |
| "accum_params_2d": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "inChannelsPerGroup", "type": "u32", "value": "convInChannels / attrs.group" }, | |
| { "name": "outChannelsPerGroup", "type": "u32", "value": "convOutChannels / attrs.group" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "outH", "type": "u32", "value": "outputHeight" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" }, | |
| { "name": "strideH", "type": "u32", "value": "strideH" }, | |
| { "name": "strideW", "type": "u32", "value": "strideW" }, | |
| { "name": "dilationH", "type": "u32", "value": "dilationH" }, | |
| { "name": "dilationW", "type": "u32", "value": "dilationW" }, | |
| { "name": "padH", "type": "i32", "value": "effectivePadTop" }, | |
| { "name": "padW", "type": "i32", "value": "effectivePadLeft" }, | |
| { "name": "count", "type": "u32", "value": "numel(shapes.y)" } | |
| ] | |
| }, | |
| "accum_params_3d": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inD", "type": "u32", "value": "inputDepth" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "inChannelsPerGroup", "type": "u32", "value": "convInChannels / attrs.group" }, | |
| { "name": "outChannelsPerGroup", "type": "u32", "value": "convOutChannels / attrs.group" }, | |
| { "name": "kernelD", "type": "u32", "value": "kernelDepth" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "outD", "type": "u32", "value": "outputDepth" }, | |
| { "name": "outH", "type": "u32", "value": "outputHeight" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" }, | |
| { "name": "strideD", "type": "u32", "value": "strideD" }, | |
| { "name": "strideH", "type": "u32", "value": "strideH" }, | |
| { "name": "strideW", "type": "u32", "value": "strideW" }, | |
| { "name": "dilationD", "type": "u32", "value": "dilationD" }, | |
| { "name": "dilationH", "type": "u32", "value": "dilationH" }, | |
| { "name": "dilationW", "type": "u32", "value": "dilationW" }, | |
| { "name": "padD", "type": "i32", "value": "effectivePadFront" }, | |
| { "name": "padH", "type": "i32", "value": "effectivePadTop" }, | |
| { "name": "padW", "type": "i32", "value": "effectivePadLeft" }, | |
| { "name": "count", "type": "u32", "value": "numel(shapes.y)" } | |
| ] | |
| }, | |
| "requant_params": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "count", "type": "u32", "value": "numel(shapes.y)" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "outImageSize", "type": "u32", "value": "outImageSize" } | |
| ] | |
| }, | |
| "requant_params_count": { | |
| "name": "params", | |
| "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y)" }] | |
| }, | |
| "x4_params": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "batch", "type": "u32", "value": "dim(shapes.x, 0)" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "inChannelsPerGroup", "type": "u32", "value": "convInChannels / attrs.group" }, | |
| { "name": "outChannelsPerGroup", "type": "u32", "value": "convOutChannels / attrs.group" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "outH", "type": "u32", "value": "outputHeight" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" }, | |
| { "name": "strideH", "type": "u32", "value": "strideH" }, | |
| { "name": "strideW", "type": "u32", "value": "strideW" }, | |
| { "name": "dilationH", "type": "u32", "value": "dilationH" }, | |
| { "name": "dilationW", "type": "u32", "value": "dilationW" }, | |
| { "name": "padH", "type": "i32", "value": "effectivePadTop" }, | |
| { "name": "padW", "type": "i32", "value": "effectivePadLeft" } | |
| ] | |
| }, | |
| "oc4_params": { | |
| "name": "params", | |
| "struct": [ | |
| { | |
| "name": "count", | |
| "type": "u32", | |
| "value": "dim(shapes.x, 0) * outputHeight * ceilDiv(outputWidth, nhwcOc4ColumnTile) * ceilDiv(convOutChannels, 4)" | |
| }, | |
| { "name": "ocBlocks", "type": "u32", "value": "ceilDiv(convOutChannels, 4)" }, | |
| { "name": "owGroups", "type": "u32", "value": "ceilDiv(outputWidth, nhwcOc4ColumnTile)" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "inChannelsPerGroup", "type": "u32", "value": "convInChannels / attrs.group" }, | |
| { "name": "outChannelsPerGroup", "type": "u32", "value": "convOutChannels / attrs.group" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "outH", "type": "u32", "value": "outputHeight" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" }, | |
| { "name": "strideH", "type": "u32", "value": "strideH" }, | |
| { "name": "strideW", "type": "u32", "value": "strideW" }, | |
| { "name": "dilationH", "type": "u32", "value": "dilationH" }, | |
| { "name": "dilationW", "type": "u32", "value": "dilationW" }, | |
| { "name": "padH", "type": "i32", "value": "effectivePadTop" }, | |
| { "name": "padW", "type": "i32", "value": "effectivePadLeft" } | |
| ] | |
| }, | |
| "a_weight": { "arg": "w", "name": "a", "elementType": "$aVec4" }, | |
| "a_zero_point_weight": { "arg": "w_zero_point", "name": "a_zero_point", "elementType": "$aScalar" }, | |
| "b_x": { "arg": "x", "name": "b", "elementType": "$bScalar" }, | |
| "b_zero_point_x": { "arg": "x_zero_point", "name": "b_zero_point", "elementType": "$bScalar", "length": 1 }, | |
| "b_cols_nchw": { "scratch": "cols", "name": "b", "buffer": "read-only-storage", "elementType": "$bScalar" }, | |
| "a_x": { "arg": "x", "name": "a", "elementType": "$aVec4" }, | |
| "a_cols_nhwc": { "scratch": "cols", "name": "a", "buffer": "read-only-storage", "elementType": "$aVec4" }, | |
| "a_zero_point_x": { "arg": "x_zero_point", "name": "a_zero_point", "elementType": "$aScalar", "length": 1 }, | |
| "b_weight_k_major": { | |
| "scratch": "w_k_major", | |
| "name": "b", | |
| "buffer": "read-only-storage", | |
| "elementType": "$bScalar" | |
| }, | |
| "b_zero_point_weight": { "arg": "w_zero_point", "name": "b_zero_point", "elementType": "$bScalar" }, | |
| "a_scale_x": { "arg": "x_scale", "name": "a_scale", "elementType": "f32", "length": 1 }, | |
| "b_scale_w": { "arg": "w_scale", "name": "b_scale", "elementType": "f32" }, | |
| "bias": { "arg": "B", "name": "bias", "elementType": "i32" }, | |
| "w_k_major_out": { "scratch": "w_k_major", "name": "w_k_major", "elementType": "$wScalar" }, | |
| "k_major_params": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "count", "type": "u32", "value": "convKPadded * convOutChannels" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "kRows", "type": "u32", "value": "convK" } | |
| ] | |
| }, | |
| "k_major_params_exact": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "count", "type": "u32", "value": "convK * convOutChannels" }, | |
| { "name": "outChannels", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "weightInChannels", "type": "u32", "value": "dim(shapes.w, 1)" }, | |
| { "name": "kernelH", "type": "u32", "value": "kernelHeight" }, | |
| { "name": "kernelW", "type": "u32", "value": "kernelWidth" }, | |
| { "name": "kRows", "type": "u32", "value": "convK" } | |
| ] | |
| }, | |
| "x_im2col": { "name": "x", "elementType": "$xVec4" }, | |
| "cols_out_vec4": { "scratch": "cols", "name": "cols", "elementType": "$colsVec4" }, | |
| "im2col_nhwc_params": { | |
| "name": "params", | |
| "struct": [ | |
| { | |
| "name": "count", | |
| "type": "u32", | |
| "value": "ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)" | |
| }, | |
| { "name": "totalWords", "type": "u32", "value": "dim(shapes.x, 0) * outSpatial * (convKPadded / 4)" }, | |
| { "name": "wordsPerRow", "type": "u32", "value": "convKPadded / 4" }, | |
| { "name": "kRows", "type": "u32", "value": "convK" }, | |
| { "name": "outCount", "type": "u32", "value": "outSpatial" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" } | |
| ] | |
| }, | |
| "im2col_nchw_params": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "outCount", "type": "u32", "value": "outSpatial" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "kRows", "type": "u32", "value": "convK" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" } | |
| ] | |
| }, | |
| "gemm_params_nchw": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "N", "type": "u32", "value": "outSpatial" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "aBatchStride4", "type": "u32", "value": 0 }, | |
| { "name": "bBatchStride", "type": "u32", "value": "convK * outSpatial" }, | |
| { "name": "yBatchStride", "type": "u32", "value": "convOutChannels * outSpatial" } | |
| ] | |
| }, | |
| "gemm_params_nhwc_pointwise": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "outSpatial" }, | |
| { "name": "N", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { | |
| "name": "aBatchStride4", | |
| "type": "u32", | |
| "value": "(outSpatial * convK / 4) if convK % 4 == 0 else (outSpatial * convK)" | |
| }, | |
| { "name": "bBatchStride", "type": "u32", "value": 0 }, | |
| { "name": "yBatchStride", "type": "u32", "value": "convOutChannels * outSpatial" } | |
| ] | |
| }, | |
| "gemm_params_nhwc_im2col": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "outSpatial" }, | |
| { "name": "N", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "K", "type": "u32", "value": "convKPadded" }, | |
| { "name": "aBatchStride4", "type": "u32", "value": "outSpatial * convKPadded / 4" }, | |
| { "name": "bBatchStride", "type": "u32", "value": 0 }, | |
| { "name": "yBatchStride", "type": "u32", "value": "convOutChannels * outSpatial" } | |
| ] | |
| }, | |
| "x_b": { "name": "x", "elementType": "$bScalar" }, | |
| "x_zero_point_b": { "name": "x_zero_point", "elementType": "$bScalar", "length": 1 }, | |
| "cols_out_b": { "scratch": "cols", "name": "cols", "elementType": "$bScalar" }, | |
| "gemm_params_nchw_matrix": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "N", "type": "u32", "value": "outSpatial" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "bBatchStride", "type": "u32", "value": "convK * outSpatial" }, | |
| { "name": "yBatchStride", "type": "u32", "value": "convOutChannels * outSpatial" } | |
| ] | |
| }, | |
| "gemm_params_nhwc_pointwise_matrix": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "N", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "K", "type": "u32", "value": "convK" } | |
| ] | |
| }, | |
| "gemm_params_nhwc_im2col_matrix": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "N", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "K", "type": "u32", "value": "convKPadded" } | |
| ] | |
| }, | |
| "precast_aOut": { "scratch": "aFloat", "name": "aFloat", "elementType": "$precastScalar" }, | |
| "precast_bOut": { "scratch": "bFloat", "name": "bFloat", "elementType": "$precastScalar" }, | |
| "precast_a": { "scratch": "aFloat", "name": "a", "buffer": "read-only-storage", "elementType": "$precastScalar" }, | |
| "precast_b": { "scratch": "bFloat", "name": "b", "buffer": "read-only-storage", "elementType": "$precastScalar" }, | |
| "precast_matrix_params": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "convOutChannels" }, | |
| { "name": "N", "type": "u32", "value": "outSpatial" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "yBatchStride", "type": "u32", "value": "convOutChannels * outSpatial" } | |
| ] | |
| }, | |
| "precast_prepare_plain": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "paddedK", "type": "u32", "value": "preparedK" }, | |
| { "name": "count", "type": "u32", "value": "prepareTotalElements" }, | |
| { | |
| "name": "groupsX", | |
| "type": "u32", | |
| "value": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| }, | |
| { "name": "N", "type": "u32", "value": "sgmatN" }, | |
| { "name": "paddedN", "type": "u32", "value": "preparedN" }, | |
| { "name": "aCount", "type": "u32", "value": "preparedElements" } | |
| ] | |
| }, | |
| "precast_prepare_spatial": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "paddedK", "type": "u32", "value": "preparedK" }, | |
| { "name": "count", "type": "u32", "value": "prepareTotalElements" }, | |
| { | |
| "name": "groupsX", | |
| "type": "u32", | |
| "value": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| }, | |
| { "name": "N", "type": "u32", "value": "sgmatN" }, | |
| { "name": "paddedN", "type": "u32", "value": "preparedN" }, | |
| { "name": "aCount", "type": "u32", "value": "preparedElements" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" } | |
| ] | |
| }, | |
| "precast_matrix_nhwc": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "N", "type": "u32", "value": "sgmatN" }, | |
| { "name": "K", "type": "u32", "value": "convK" } | |
| ] | |
| }, | |
| "precast_weight_oihw": { "arg": "w", "name": "b", "elementType": "$bScalar" }, | |
| "precast_prepare_nhwc_plain": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "paddedK", "type": "u32", "value": "preparedK" }, | |
| { "name": "count", "type": "u32", "value": "prepareTotalElements" }, | |
| { | |
| "name": "groupsX", | |
| "type": "u32", | |
| "value": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| }, | |
| { "name": "N", "type": "u32", "value": "sgmatN" }, | |
| { "name": "paddedN", "type": "u32", "value": "preparedN" }, | |
| { "name": "aCount", "type": "u32", "value": "preparedElements" } | |
| ] | |
| }, | |
| "precast_prepare_nhwc_spatial": { | |
| "name": "params", | |
| "struct": [ | |
| { "name": "M", "type": "u32", "value": "sgmatM" }, | |
| { "name": "K", "type": "u32", "value": "convK" }, | |
| { "name": "paddedK", "type": "u32", "value": "preparedK" }, | |
| { "name": "count", "type": "u32", "value": "prepareTotalElements" }, | |
| { | |
| "name": "groupsX", | |
| "type": "u32", | |
| "value": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| }, | |
| { "name": "N", "type": "u32", "value": "sgmatN" }, | |
| { "name": "paddedN", "type": "u32", "value": "preparedN" }, | |
| { "name": "aCount", "type": "u32", "value": "preparedElements" }, | |
| { "name": "outCount", "type": "u32", "value": "outSpatial" }, | |
| { "name": "inChannels", "type": "u32", "value": "convInChannels" }, | |
| { "name": "inH", "type": "u32", "value": "inputHeight" }, | |
| { "name": "inW", "type": "u32", "value": "inputWidth" }, | |
| { "name": "outW", "type": "u32", "value": "outputWidth" } | |
| ] | |
| }, | |
| "portable_f16_a": { "name": "a", "scratch": "aFloat", "buffer": "read-only-storage", "elementType": "vec4<f16>" }, | |
| "portable_f16_b": { "name": "b", "scratch": "bFloat", "buffer": "read-only-storage", "elementType": "vec4<f16>" }, | |
| "portable_f32_a": { "name": "a", "scratch": "aFloat", "buffer": "read-only-storage", "elementType": "vec4<f32>" }, | |
| "portable_f32_b": { "name": "b", "scratch": "bFloat", "buffer": "read-only-storage", "elementType": "vec4<f32>" } | |
| }, | |
| "variants": [ | |
| { | |
| "id": "spatial_nd2_scalar", | |
| "when": ["(rank3TensorOk or rank4TensorOk)", "scalarWeightQuantOk", "not present.B", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": false, "wScalePerChannel": false, "wZeroPerChannel": false }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 2 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_2d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "y_w", "requant_params_count"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd2_scalar_bias", | |
| "when": ["(rank3TensorOk or rank4TensorOk)", "scalarWeightQuantOk", "biasContractOk", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": true, "wScalePerChannel": false, "wZeroPerChannel": false }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 2 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_2d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "B", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd2_per_channel", | |
| "when": ["(rank3TensorOk or rank4TensorOk)", "perChannelWeightQuantOk", "not present.B", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": false, "wScalePerChannel": true, "wZeroPerChannel": true }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 2 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_2d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd2_per_channel_bias", | |
| "when": ["(rank3TensorOk or rank4TensorOk)", "perChannelWeightQuantOk", "biasContractOk", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": true, "wScalePerChannel": true, "wZeroPerChannel": true }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 2 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_2d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "B", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd3_scalar", | |
| "when": ["rank5TensorOk", "scalarWeightQuantOk", "not present.B", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": false, "wScalePerChannel": false, "wZeroPerChannel": false }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate3d", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 3 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_3d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "y_w", "requant_params_count"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd3_scalar_bias", | |
| "when": ["rank5TensorOk", "scalarWeightQuantOk", "biasContractOk", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": true, "wScalePerChannel": false, "wZeroPerChannel": false }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate3d", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 3 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_3d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "B", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd3_per_channel", | |
| "when": ["rank5TensorOk", "perChannelWeightQuantOk", "not present.B", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": false, "wScalePerChannel": true, "wZeroPerChannel": true }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate3d", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 3 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_3d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "spatial_nd3_per_channel_bias", | |
| "when": ["rank5TensorOk", "perChannelWeightQuantOk", "biasContractOk", "groupChannelsOk", "outputSpatialOk"], | |
| "derive": { "hasBias": true, "wScalePerChannel": true, "wZeroPerChannel": true }, | |
| "intermediates": [{ "id": "accum", "dtype": "int32", "shape": "shapes.y" }], | |
| "passes": [ | |
| { | |
| "id": "accumulate", | |
| "name": "QLinearConv.Accumulate3d", | |
| "shader": "conv-int-accumulate-spatial.wgsl.jinja", | |
| "derive": { "spatialRankSpec": 3 }, | |
| "bindings": ["x_w", "x_zero_point_w", "w_w", "w_zero_point_w", "accum_out", "accum_params_3d"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "requantize", | |
| "name": "QLinearConv.Requantize", | |
| "shader": "qlinear-conv-requantize.wgsl.jinja", | |
| "bindings": ["accum_in", "x_scale", "w_scale", "y_scale", "y_zero_point_w", "B", "y_w", "requant_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((numel(shapes.y)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "nchw2d_columns_x4", | |
| "priority": 10, | |
| "when": ["attrs.channels_last == 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "groupChannelsOk", "outputSpatialOk", "outputWidth >= 4", "convK >= 4", "numel(shapes.y) >= 32"], | |
| "derive": { | |
| "wScalePerChannel": "perChannelWeightQuantOk", | |
| "ocTile": "4 if convOutChannels >= attrs.group * 4 and convOutChannels % (attrs.group * 4) == 0 else 1" | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ColumnsX4", | |
| "shader": "qlinear-conv-nchw-x4.wgsl.jinja", | |
| "bindings": ["x_w", "x_scale", "x_zero_point_w", "w_w", "w_scale", "w_zero_point_w", "y_scale", "y_zero_point_w", "y_w", "x4_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((dim(shapes.y, 0) * ceilDiv(convOutChannels, 4 if convOutChannels >= attrs.group * 4 and convOutChannels % (attrs.group * 4) == 0 else 1) * outputHeight * ceilDiv(outputWidth, 4)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((dim(shapes.y, 0) * ceilDiv(convOutChannels, 4 if convOutChannels >= attrs.group * 4 and convOutChannels % (attrs.group * 4) == 0 else 1) * outputHeight * ceilDiv(outputWidth, 4)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "nhwc2d_channels_x4", | |
| "priority": 10, | |
| "when": ["attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "groupChannelsOk", "outputSpatialOk", "convOutChannels % (attrs.group * 4) == 0", "numel(shapes.y) >= 32"], | |
| "derive": { | |
| "wScalePerChannel": "perChannelWeightQuantOk", | |
| "depthwise": false, | |
| "owTile": "nhwcOc4ColumnTile", | |
| "hasBias": false | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ChannelsX4", | |
| "shader": "qlinear-conv-nhwc-oc4.wgsl.jinja", | |
| "bindings": ["x_w", "x_scale", "x_zero_point_w", "w_w", "w_scale", "w_zero_point_w", "y_scale", "y_zero_point_w", "y_w", "oc4_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "nhwc2d_depthwise_x4", | |
| "priority": 10, | |
| "when": ["attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "groupChannelsOk", "outputSpatialOk", "attrs.group == convInChannels", "attrs.group == convOutChannels", "convOutChannels % 4 == 0", "numel(shapes.y) >= 32"], | |
| "derive": { | |
| "wScalePerChannel": "perChannelWeightQuantOk", | |
| "depthwise": true, | |
| "owTile": "nhwcOc4ColumnTile", | |
| "hasBias": false | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ChannelsX4", | |
| "shader": "qlinear-conv-nhwc-oc4.wgsl.jinja", | |
| "bindings": ["x_w", "x_scale", "x_zero_point_w", "w_w", "w_scale", "w_zero_point_w", "y_scale", "y_zero_point_w", "y_w", "oc4_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "nhwc2d_channels_x4_bias", | |
| "priority": 10, | |
| "when": ["attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "groupChannelsOk", "outputSpatialOk", "convOutChannels % (attrs.group * 4) == 0", "numel(shapes.y) >= 32", "attrs.group > 1", "device.limits.maxStorageBuffersPerShaderStage >= 10", "tunables.WORKGROUP_SIZE <= deviceWorkgroupCap", "tunables.WORKGROUP_SIZE <= device.limits.maxComputeWorkgroupSizeX", "nhwcOc4DispatchOk"], | |
| "derive": { | |
| "wScalePerChannel": "perChannelWeightQuantOk", | |
| "depthwise": false, | |
| "owTile": "nhwcOc4ColumnTile", | |
| "hasBias": true | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ChannelsX4", | |
| "shader": "qlinear-conv-nhwc-oc4.wgsl.jinja", | |
| "bindings": ["x_w", "x_scale", "x_zero_point_w", "w_w", "w_scale", "w_zero_point_w", "y_scale", "y_zero_point_w", "y_w", "oc4_params", "bias"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "nhwc2d_depthwise_x4_bias", | |
| "priority": 10, | |
| "when": ["attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "groupChannelsOk", "outputSpatialOk", "attrs.group == convInChannels", "attrs.group == convOutChannels", "convOutChannels % 4 == 0", "numel(shapes.y) >= 32", "attrs.group > 1", "device.limits.maxStorageBuffersPerShaderStage >= 10", "tunables.WORKGROUP_SIZE <= deviceWorkgroupCap", "tunables.WORKGROUP_SIZE <= device.limits.maxComputeWorkgroupSizeX", "nhwcOc4DispatchOk"], | |
| "derive": { | |
| "wScalePerChannel": "perChannelWeightQuantOk", | |
| "depthwise": true, | |
| "owTile": "nhwcOc4ColumnTile", | |
| "hasBias": true | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ChannelsX4", | |
| "shader": "qlinear-conv-nhwc-oc4.wgsl.jinja", | |
| "bindings": ["x_w", "x_scale", "x_zero_point_w", "w_w", "w_scale", "w_zero_point_w", "y_scale", "y_zero_point_w", "y_w", "oc4_params", "bias"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((nhwcOc4Threads), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_pointwise_nchw", | |
| "priority": 20, | |
| "when": ["packedFeature", "attrs.channels_last == 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "dim(shapes.w, 1) == convInChannels", "outputHeight == inputHeight", "outputWidth == inputWidth", "gemmDispatchOk"], | |
| "derive": { | |
| "aPacked": "convK % 4 == 0", | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": false, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PointwiseDp4a", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nchw"], | |
| "dispatch": { | |
| "x": "ceilDiv(outSpatial, 64)", | |
| "y": "ceilDiv(convOutChannels, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_pointwise_nchw", | |
| "priority": 30, | |
| "when": ["attrs.channels_last == 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "dim(shapes.w, 1) == convInChannels", "outputHeight == inputHeight", "outputWidth == inputWidth", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "passes": [ | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nchw_matrix"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, sgmatTileN)", | |
| "y": "ceilDiv(sgmatM, sgmatTileM)", | |
| "z": "dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_im2col_nchw", | |
| "priority": 20, | |
| "when": ["packedFeature", "attrs.channels_last == 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "outputSpatialOk", "(kernelHeight > 1 or kernelWidth > 1)", "convK >= 64", "convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", "nchwColsStorageOk", "gemmDispatchOk", "numel(shapes.y) >= 8192"], | |
| "derive": { | |
| "aPacked": "convK % 4 == 0", | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": false, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [{ "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * convK * outSpatial]" }], | |
| "passes": [ | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2Col", | |
| "shader": "conv-int-im2col-spatial.wgsl.jinja", | |
| "derive": { | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft" | |
| }, | |
| "bindings": ["x_b", "x_zero_point_b", "cols_out_b", "im2col_nchw_params"], | |
| "dispatch": { "x": "ceilDiv(outSpatial, tunables.WORKGROUP_SIZE)", "y": "convK", "z": "dim(shapes.x, 0)" } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.Im2ColDp4a", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_weight", "b_cols_nchw", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nchw"], | |
| "dispatch": { | |
| "x": "ceilDiv(outSpatial, 64)", | |
| "y": "ceilDiv(convOutChannels, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_im2col_nchw", | |
| "priority": 30, | |
| "when": ["attrs.channels_last == 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "outputSpatialOk", "(kernelHeight > 1 or kernelWidth > 1)", "convK >= 64", "convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", "nchwColsStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "intermediates": [{ "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * convK * outSpatial]" }], | |
| "passes": [ | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2Col", | |
| "shader": "conv-int-im2col-spatial.wgsl.jinja", | |
| "derive": { | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft" | |
| }, | |
| "bindings": ["x_b", "x_zero_point_b", "cols_out_b", "im2col_nchw_params"], | |
| "dispatch": { "x": "ceilDiv(outSpatial, tunables.WORKGROUP_SIZE)", "y": "convK", "z": "dim(shapes.x, 0)" } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_weight", "b_cols_nchw", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nchw_matrix"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, sgmatTileN)", | |
| "y": "ceilDiv(sgmatM, sgmatTileM)", | |
| "z": "dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_im2col_nchw_bias", | |
| "priority": 25, | |
| "when": ["packedFeature", "attrs.channels_last == 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "outputSpatialOk", "convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", "nchwColsStorageOk", "gemmDispatchOk"], | |
| "derive": { | |
| "aPacked": "convK % 4 == 0", | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": true, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [{ "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * convK * outSpatial]" }], | |
| "passes": [ | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2Col", | |
| "shader": "conv-int-im2col-spatial.wgsl.jinja", | |
| "derive": { | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft" | |
| }, | |
| "bindings": ["x_b", "x_zero_point_b", "cols_out_b", "im2col_nchw_params"], | |
| "dispatch": { "x": "ceilDiv(outSpatial, tunables.WORKGROUP_SIZE)", "y": "convK", "z": "dim(shapes.x, 0)" } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.Im2ColDp4aBias", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_weight", "b_cols_nchw", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nchw"], | |
| "dispatch": { | |
| "x": "ceilDiv(outSpatial, 64)", | |
| "y": "ceilDiv(convOutChannels, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_im2col_nchw_bias", | |
| "priority": 35, | |
| "when": ["attrs.channels_last == 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "outputSpatialOk", "convK <= min(device.limits.maxComputeWorkgroupsPerDimension, 65535)", "nchwColsStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "intermediates": [{ "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * convK * outSpatial]" }], | |
| "passes": [ | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2Col", | |
| "shader": "conv-int-im2col-spatial.wgsl.jinja", | |
| "derive": { | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft" | |
| }, | |
| "bindings": ["x_b", "x_zero_point_b", "cols_out_b", "im2col_nchw_params"], | |
| "dispatch": { "x": "ceilDiv(outSpatial, tunables.WORKGROUP_SIZE)", "y": "convK", "z": "dim(shapes.x, 0)" } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_weight", "b_cols_nchw", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nchw_matrix"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, sgmatTileN)", | |
| "y": "ceilDiv(sgmatM, sgmatTileM)", | |
| "z": "dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_pointwise_nhwc", | |
| "priority": 20, | |
| "when": ["packedFeature", "attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "outputHeight == inputHeight", "outputWidth == inputWidth", "kMajorWeightStorageOk", "gemmDispatchOk", "numel(shapes.y) >= 8192"], | |
| "derive": { | |
| "aPacked": "convK % 4 == 0", | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": false, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [{ "id": "w_k_major", "dtype": "int32", "shape": "[convK * convOutChannels]" }], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params_exact"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.NhwcDp4a", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_x", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nhwc_pointwise"], | |
| "dispatch": { | |
| "x": "ceilDiv(convOutChannels, 64)", | |
| "y": "ceilDiv(outSpatial, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_pointwise_nhwc", | |
| "priority": 30, | |
| "when": ["attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "outputHeight == inputHeight", "outputWidth == inputWidth", "kMajorWeightStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "intermediates": [{ "id": "w_k_major", "dtype": "int32", "shape": "[convK * convOutChannels]" }], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params_exact"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_x", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nhwc_pointwise_matrix"], | |
| "dispatch": { "x": "ceilDiv(sgmatN, sgmatTileN)", "y": "ceilDiv(sgmatM, sgmatTileM)" } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_pointwise_nhwc_bias", | |
| "priority": 25, | |
| "when": ["packedFeature", "attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "outputHeight == inputHeight", "outputWidth == inputWidth", "kMajorWeightStorageOk", "gemmDispatchOk"], | |
| "derive": { | |
| "aPacked": "convK % 4 == 0", | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": true, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [{ "id": "w_k_major", "dtype": "int32", "shape": "[convK * convOutChannels]" }], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params_exact"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.NhwcDp4aBias", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_x", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nhwc_pointwise"], | |
| "dispatch": { | |
| "x": "ceilDiv(convOutChannels, 64)", | |
| "y": "ceilDiv(outSpatial, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_pointwise_nhwc_bias", | |
| "priority": 35, | |
| "when": ["attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "kernelHeight == 1", "kernelWidth == 1", "strideH == 1", "strideW == 1", "padTop == 0 and padBottom == 0", "padLeft == 0 and padRight == 0", "outputHeight == inputHeight", "outputWidth == inputWidth", "kMajorWeightStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "intermediates": [{ "id": "w_k_major", "dtype": "int32", "shape": "[convK * convOutChannels]" }], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params_exact"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convK * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_x", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nhwc_pointwise_matrix"], | |
| "dispatch": { "x": "ceilDiv(sgmatN, sgmatTileN)", "y": "ceilDiv(sgmatM, sgmatTileM)" } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_im2col_nhwc", | |
| "priority": 20, | |
| "when": ["packedFeature", "attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "(kernelHeight > 1 or kernelWidth > 1)", "outputSpatialOk", "nhwcColsStorageOk", "kMajorWeightStorageOk", "gemmDispatchOk", "numel(shapes.y) >= 8192"], | |
| "derive": { | |
| "aPacked": true, | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": false, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [ | |
| { "id": "w_k_major", "dtype": "int32", "shape": "[convKPadded * convOutChannels]" }, | |
| { "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * outSpatial * convKPadded]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2ColNhwc", | |
| "shader": "qlinear-conv-im2col-nhwc.wgsl.jinja", | |
| "derive": { | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "im2colWords": "tunables.NHWC_IM2COL_WORDS", | |
| "channelsAligned": "convInChannels % 4 == 0", | |
| "xVec4": "(\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\") if convInChannels % 4 == 0 else (\"u32\" if tensorDtypes.x == \"uint8\" else \"i32\")", | |
| "colsVec4": "\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\"" | |
| }, | |
| "bindings": ["x_im2col", "x_zero_point_w", "cols_out_vec4", "im2col_nhwc_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.NhwcDp4a", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_cols_nhwc", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nhwc_im2col"], | |
| "dispatch": { | |
| "x": "ceilDiv(convOutChannels, 64)", | |
| "y": "ceilDiv(outSpatial, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_im2col_nhwc", | |
| "priority": 30, | |
| "when": ["attrs.channels_last != 0", "not present.B", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "(kernelHeight > 1 or kernelWidth > 1)", "outputSpatialOk", "nhwcColsStorageOk", "kMajorWeightStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "intermediates": [ | |
| { "id": "w_k_major", "dtype": "int32", "shape": "[convKPadded * convOutChannels]" }, | |
| { "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * outSpatial * convKPadded]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2ColNhwc", | |
| "shader": "qlinear-conv-im2col-nhwc.wgsl.jinja", | |
| "derive": { | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "im2colWords": "tunables.NHWC_IM2COL_WORDS", | |
| "channelsAligned": "convInChannels % 4 == 0", | |
| "xVec4": "(\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\") if convInChannels % 4 == 0 else (\"u32\" if tensorDtypes.x == \"uint8\" else \"i32\")", | |
| "colsVec4": "\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\"" | |
| }, | |
| "bindings": ["x_im2col", "x_zero_point_w", "cols_out_vec4", "im2col_nhwc_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_cols_nhwc", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "gemm_params_nhwc_im2col_matrix"], | |
| "dispatch": { "x": "ceilDiv(sgmatN, sgmatTileN)", "y": "ceilDiv(sgmatM, sgmatTileM)" } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "dp4a_im2col_nhwc_bias", | |
| "priority": 25, | |
| "when": ["packedFeature", "attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "(kernelHeight > 1 or kernelWidth > 1)", "outputSpatialOk", "nhwcColsStorageOk", "kMajorWeightStorageOk", "gemmDispatchOk"], | |
| "derive": { | |
| "aPacked": true, | |
| "aVec4": "(\"vec4<u32>\" if aUnsigned else \"vec4<i32>\") if aPacked else aScalar", | |
| "hasBias": true, | |
| "biasPerColumn": "channelsLast", | |
| "tileM": "4 if dp4aAppleCompact else 8", | |
| "tileN": 64, | |
| "ktWords": "dp4aCompactKWords" | |
| }, | |
| "intermediates": [ | |
| { "id": "w_k_major", "dtype": "int32", "shape": "[convKPadded * convOutChannels]" }, | |
| { "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * outSpatial * convKPadded]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2ColNhwc", | |
| "shader": "qlinear-conv-im2col-nhwc.wgsl.jinja", | |
| "derive": { | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "im2colWords": "tunables.NHWC_IM2COL_WORDS", | |
| "channelsAligned": "convInChannels % 4 == 0", | |
| "xVec4": "(\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\") if convInChannels % 4 == 0 else (\"u32\" if tensorDtypes.x == \"uint8\" else \"i32\")", | |
| "colsVec4": "\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\"" | |
| }, | |
| "bindings": ["x_im2col", "x_zero_point_w", "cols_out_vec4", "im2col_nhwc_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.NhwcDp4aBias", | |
| "shader": "quant-dp4a-matmul.wgsl.jinja", | |
| "bindings": ["a_cols_nhwc", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nhwc_im2col"], | |
| "dispatch": { | |
| "x": "ceilDiv(convOutChannels, 64)", | |
| "y": "ceilDiv(outSpatial, 4 if dp4aAppleCompact else 8)", | |
| "z": "dim(shapes.y, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "matrix_im2col_nhwc_bias", | |
| "priority": 35, | |
| "when": ["attrs.channels_last != 0", "biasContractOk", "rank4TensorOk", "flexibleWeightQuantOk", "attrs.group == 1", "dim(shapes.w, 1) == convInChannels", "(kernelHeight > 1 or kernelWidth > 1)", "outputSpatialOk", "nhwcColsStorageOk", "kMajorWeightStorageOk", "gemmDispatchOk", "wave32Effective", "sgmatDeviceOk", "sgmatDispatchOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["not (sgmatM >= sgmatTileM and sgmatN >= sgmatTileN / 2 and convK >= sgmatTileK)", "sgmatUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "intermediates": [ | |
| { "id": "w_k_major", "dtype": "int32", "shape": "[convKPadded * convOutChannels]" }, | |
| { "id": "cols", "dtype": "int32", "shape": "[dim(shapes.x, 0) * outSpatial * convKPadded]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "weights", | |
| "name": "QLinearConv.WeightKMajor", | |
| "shader": "quant-weight-k-major.wgsl.jinja", | |
| "bindings": ["w_w", "w_zero_point_w", "w_k_major_out", "k_major_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((convKPadded * convOutChannels), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "im2col", | |
| "name": "QLinearConv.Im2ColNhwc", | |
| "shader": "qlinear-conv-im2col-nhwc.wgsl.jinja", | |
| "derive": { | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "im2colWords": "tunables.NHWC_IM2COL_WORDS", | |
| "channelsAligned": "convInChannels % 4 == 0", | |
| "xVec4": "(\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\") if convInChannels % 4 == 0 else (\"u32\" if tensorDtypes.x == \"uint8\" else \"i32\")", | |
| "colsVec4": "\"vec4<u32>\" if tensorDtypes.x == \"uint8\" else \"vec4<i32>\"" | |
| }, | |
| "bindings": ["x_im2col", "x_zero_point_w", "cols_out_vec4", "im2col_nhwc_params"], | |
| "dispatch": { | |
| "x": "min(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "y": "ceilDiv(ceilDiv((ceilDiv(dim(shapes.x, 0) * outSpatial * (convKPadded / 4), tunables.NHWC_IM2COL_WORDS)), (tunables.WORKGROUP_SIZE)), 65535)", | |
| "z": 1 | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.ExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": "perChannelWeightQuantOk and not channelsLast", | |
| "matrixZeroPerRow": "perChannelWeightQuantOk and not channelsLast" | |
| }, | |
| "bindings": ["a_cols_nhwc", "b_weight_k_major", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "gemm_params_nhwc_im2col_matrix"], | |
| "dispatch": { "x": "ceilDiv(sgmatN, sgmatTileN)", "y": "ceilDiv(sgmatM, sgmatTileM)" } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nchw_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nchw_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nchw_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nchw_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nchw_row", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nchw_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nchw_row", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nchw_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nchw_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nchw_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nchw_row", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nchw_row", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nchw_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nchw_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nchw_bias_row", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nchw_bias_row", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nhwc_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nhwc_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nhwc_column", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nhwc_column", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nhwc_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nhwc_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_pointwise_nhwc_bias_column", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_pointwise_nhwc_bias_column", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nhwc_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nhwc_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nhwc_column", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nhwc_column", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nhwc_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nhwc_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f16_im2col_nhwc_bias_column", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF16BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix", "shader-f16"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f16", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f16\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f16_im2col_nhwc_bias_column", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF16BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 2 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f16\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": ["shader-f16"] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f16\"", | |
| "scalar": "\"f16\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float16", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float16", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f16_a", "portable_f16_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nchw_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nchw_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nchw_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nchw_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nchw_row", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nchw_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nchw_row", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nchw_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nchw_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nchw_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nchw_row", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nchw_row", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nchw_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_weight", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nchw_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nchw_bias_row", | |
| "priority": 40, | |
| "when": ["precast_im2col_nchw_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": true, | |
| "matrixZeroPerRow": true | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "b_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_params"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nchw_bias_row", | |
| "priority": 28, | |
| "when": ["precast_im2col_nchw_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": true, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": true, | |
| "prepareSpatialB": true, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": false, | |
| "sampleChannelsLast": false | |
| }, | |
| "bindings": ["a_weight", "b_x", "a_zero_point_weight", "b_zero_point_x", "precast_aOut", "precast_bOut", "precast_prepare_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nhwc_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nhwc_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nhwc_column", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nhwc_column", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nhwc_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nhwc_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_pointwise_nhwc_bias_column", | |
| "priority": 40, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_pointwise_nhwc_bias_column", | |
| "priority": 28, | |
| "when": ["precast_pointwise_nhwc_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": false, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_plain"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nhwc_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nhwc_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nhwc_column", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 8 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nhwc_column", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": false, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nhwc_bias_tensor", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_bias_ok", "not perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 10 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "b_zero_point_weight", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nhwc_bias_tensor", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_bias_ok", "not perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "precast_f32_im2col_nhwc_bias_column", | |
| "priority": 40, | |
| "when": ["precast_im2col_nhwc_bias_ok", "perChannelWeightQuantOk", "wave32Effective", "precastResourcesOk", "precastDispatchOk", "precastF32BuffersOk", "device.wgslLanguageFeatures.has(\"subgroup_id\")"], | |
| "demoteWhen": ["precastAmortizedInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS"], | |
| "requires": { | |
| "features": ["subgroups", "chromium-experimental-subgroup-matrix"], | |
| "subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }], | |
| "limits": { "maxStorageBuffersPerShaderStage": 9 } | |
| }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastOperands": true, | |
| "precastScalar": "\"f32\"", | |
| "sgmatTileM": "precastTileM", | |
| "sgmatTileN": "precastTileN", | |
| "sgmatTileK": "precastTileK", | |
| "sgmatRowGroups": "precastSubgroups", | |
| "sgmatSubgroups": "precastSubgroups", | |
| "sgmatWorkgroup": "precastWorkgroup", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "matrixZeroPerRow": false | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactMatrix", | |
| "shader": "quant-exact-matrix.wgsl.jinja", | |
| "bindings": ["precast_a", "precast_b", "a_zero_point_x", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w", "precast_matrix_nhwc"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, precastTileN)", | |
| "y": "ceilDiv(sgmatM, precastTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "id": "portable_f32_im2col_nhwc_bias_column", | |
| "priority": 28, | |
| "when": ["precast_im2col_nhwc_bias_ok", "perChannelWeightQuantOk", "precastDispatchOk", "precastF32BuffersOk", "portableGeometryOk", "(portableTileM + portableTileN) * portableTileK * 4 <= device.limits.maxComputeWorkgroupStorageSize", "portableLoadsOk"], | |
| "demoteWhen": ["precastUsefulInvocations < tunables.EXACT_MATRIX_MIN_INVOCATIONS and not (has(device.adapterInfo, \"vendor\") and device.adapterInfo.vendor == \"apple\")", "\"f32\" == \"f32\" and sgmatM < portableTileN", "dp4aAppleCompact and packedFeature"], | |
| "requires": { "features": [] }, | |
| "derive": { | |
| "aVec4": "aScalar", | |
| "precastScalar": "\"f32\"", | |
| "scalar": "\"f32\"", | |
| "matrixHasBias": true, | |
| "matrixScalePerRow": false, | |
| "M": "sgmatM", | |
| "N": "sgmatN", | |
| "K": "preparedK", | |
| "kTile": "portableTileK", | |
| "workgroupCols": "portableWorkgroupCols", | |
| "workgroupRows": "portableWorkgroupRows", | |
| "blockRows": "portableTileM", | |
| "blockCols": "portableTileN", | |
| "integerPartialK": "portablePartialK", | |
| "hasBias": false, | |
| "exactBatchB": "not channelsLast and dim(shapes.x, 0) > 1" | |
| }, | |
| "intermediates": [ | |
| { "id": "aFloat", "dtype": "float32", "shape": "[preparedElements]" }, | |
| { "id": "bFloat", "dtype": "float32", "shape": "[preparedBElements]" } | |
| ], | |
| "passes": [ | |
| { | |
| "id": "prepare", | |
| "name": "QLinearConv.PrepareExact", | |
| "shader": "quant-exact-prepare.wgsl.jinja", | |
| "derive": { | |
| "prepareZeroPerRow": false, | |
| "prepareSpatialB": false, | |
| "spatialRankSpec": 2, | |
| "kernelHSpec": "kernelHeight", | |
| "kernelWSpec": "kernelWidth", | |
| "strideHSpec": "strideH", | |
| "strideWSpec": "strideW", | |
| "dilationHSpec": "dilationH", | |
| "dilationWSpec": "dilationW", | |
| "padTopSpec": "effectivePadTop", | |
| "padLeftSpec": "effectivePadLeft", | |
| "prepareSpatialA": true, | |
| "prepareTransposeB": true, | |
| "sampleChannelsLast": true | |
| }, | |
| "bindings": ["a_x", "precast_weight_oihw", "a_zero_point_x", "b_zero_point_weight", "precast_aOut", "precast_bOut", "precast_prepare_nhwc_spatial"], | |
| "dispatch": { | |
| "x": "min(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))", | |
| "y": "ceilDiv(prepareGroups, min(device.limits.maxComputeWorkgroupsPerDimension, 65535))" | |
| } | |
| }, | |
| { | |
| "id": "main", | |
| "name": "QLinearConv.PreparedExactPortable", | |
| "shader": "quant-exact-portable.wgsl.jinja", | |
| "bindings": ["portable_f32_a", "portable_f32_b", "a_scale_x", "b_scale_w", "y_scale", "y_zero_point_w", "bias", "y_w"], | |
| "dispatch": { | |
| "x": "ceilDiv(sgmatN, portableTileN)", | |
| "y": "ceilDiv(sgmatM, portableTileM)", | |
| "z": "1 if channelsLast else dim(shapes.x, 0)" | |
| } | |
| } | |
| ] | |
| } | |
| ] | |
| } | |