| { |
| "domain": "ai.onnx", |
| "name": "Abs", |
| "sinceVersion": 13, |
| "inputs": { "x": { "onnx": "X", "dtype": "T" } }, |
| "outputs": { "y": { "onnx": "Y", "dtype": "T", "rank": "ranks.x", "shape": "shapes.x" } }, |
| "typeConstraints": { "T": ["float32", "float16", "int32", "uint32", "int8", "uint8"] }, |
| "tunables": { "WORKGROUP_SIZE": { "default": 256 } }, |
| "derive": { "scalar": "dtypes.T", "usesF16": "dtypes.T == \"f16\"", "isInt8": "tensorDtypes.x == \"int8\"" }, |
| "variants": [ |
| { |
| "id": "same_layout_vec4", |
| "priority": 20, |
| "when": ["numel(shapes.x) > 0", "numel(shapes.x) % 4 == 0", "numel(shapes.x) == numel(shapes.y)", "f16Ok(dtypes.T)"], |
| "derive": { "vectorScalar": "\"vec4<\" ~ dtypes.T ~ \">\"" }, |
| "passes": [ |
| { |
| "id": "main", |
| "name": "Abs.vec4", |
| "shader": "unary-vec4.wgsl.jinja", |
| "derive": { |
| "op": "\"abs\"", |
| "vec4PerThread": "4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1" |
| }, |
| "bindings": [ |
| { "arg": "x", "elementType": "$vectorScalar" }, |
| { "arg": "y", "elementType": "$vectorScalar" }, |
| { "name": "params", "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y) / 4" }] } |
| ], |
| "dispatch": { |
| "x": "min(ceilDiv((ceilDiv(numel(shapes.y) / 4, 4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "y": "ceilDiv(ceilDiv((ceilDiv(numel(shapes.y) / 4, 4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "z": 1 |
| } |
| } |
| ] |
| }, |
| { |
| "id": "same_layout_vec4_tail", |
| "priority": 19, |
| "when": ["numel(shapes.x) > 4", "numel(shapes.x) % 4 != 0", "numel(shapes.x) == numel(shapes.y)", "f16Ok(dtypes.T)"], |
| "derive": { |
| "scalar": "dtypes.T", |
| "usesF16": "dtypes.T == \"f16\"", |
| "vectorScalar": "\"vec4<\" ~ dtypes.T ~ \">\"" |
| }, |
| "passes": [ |
| { |
| "id": "bulk", |
| "name": "Abs.vec4Bulk", |
| "shader": "unary-vec4.wgsl.jinja", |
| "derive": { |
| "op": "\"abs\"", |
| "vec4PerThread": "4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1" |
| }, |
| "bindings": ["x", "y", "params_unary_tail"], |
| "dispatch": { |
| "x": "min(ceilDiv((ceilDiv(floor(numel(shapes.y) / 4), 4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "y": "ceilDiv(ceilDiv((ceilDiv(floor(numel(shapes.y) / 4), 4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "z": 1 |
| } |
| }, |
| { |
| "id": "tail", |
| "name": "Abs.tail", |
| "shader": "unary-scalar.wgsl.jinja", |
| "derive": { "op": "\"abs\"", "itemsPerInvocation": 4, "tailOnly": true }, |
| "bindings": ["x_2", "y_2", "params_2_unary_tail"], |
| "dispatch": { |
| "x": "min(ceilDiv((1), (tunables.WORKGROUP_SIZE)), 65535)", |
| "y": "ceilDiv(ceilDiv((1), (tunables.WORKGROUP_SIZE)), 65535)", |
| "z": 1 |
| } |
| } |
| ] |
| }, |
| { |
| "id": "elementwise", |
| "when": ["numel(shapes.x) == numel(shapes.y) and (f16Ok(dtypes.T))"], |
| "passes": [ |
| { |
| "id": "main", |
| "name": "Abs", |
| "shader": "unary-scalar.wgsl.jinja", |
| "derive": { "op": "\"abs\"", "itemsPerInvocation": 4 }, |
| "bindings": [ |
| { "arg": "x" }, |
| { "arg": "y" }, |
| { "name": "params", "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y)" }] } |
| ], |
| "dispatch": { |
| "x": "min(ceilDiv((ceilDiv(numel(shapes.y), 4)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "y": "ceilDiv(ceilDiv((ceilDiv(numel(shapes.y), 4)), (tunables.WORKGROUP_SIZE)), 65535)", |
| "z": 1 |
| } |
| } |
| ] |
| } |
| ], |
| "bindings": { |
| "x": { "buffer": "read-only-storage", "elementType": "$vectorScalar" }, |
| "y": { "buffer": "storage", "elementType": "$vectorScalar" }, |
| "params_unary_tail": { |
| "buffer": "uniform", |
| "struct": [{ "name": "count", "type": "u32", "value": "floor(numel(shapes.y) / 4)" }], |
| "name": "params" |
| }, |
| "x_2": { "buffer": "read-only-storage", "name": "x", "elementType": "$scalar" }, |
| "y_2": { "buffer": "storage", "name": "y", "elementType": "$scalar" }, |
| "params_2_unary_tail": { |
| "buffer": "uniform", |
| "name": "params", |
| "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y)" }] |
| } |
| } |
| } |
|
|