File size: 4,488 Bytes
0a573b4
 
 
 
11ade4e
 
0a573b4
11ade4e
56326e7
0a573b4
 
 
11ade4e
 
56326e7
0a573b4
 
 
56326e7
11ade4e
56326e7
 
11ade4e
 
 
 
 
 
 
 
56326e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11ade4e
 
 
56326e7
 
11ade4e
 
 
56326e7
11ade4e
 
56326e7
11ade4e
 
 
56326e7
 
11ade4e
 
 
 
 
56326e7
11ade4e
56326e7
 
11ade4e
 
 
 
 
0a573b4
11ade4e
0a573b4
11ade4e
 
 
 
56326e7
 
 
 
11ade4e
 
 
 
 
 
 
 
 
0a573b4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{
  "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", "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": { "scalar": "dtypes.T", "vectorScalar": "\"vec4<\" ~ dtypes.T ~ \">\"" },
      "passes": [
        {
          "id": "main",
          "name": "Abs.Vec4",
          "shader": "unary-vec4.wgsl.jinja",
          "derive": { "vec4PerThread": "4 if numel(shapes.y) * dtypeBytes(tensorDtypes.y) <= 16777216 else 1" },
          "bindings": ["x", "y", "params_unary"],
          "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": "elementwise",
      "when": ["numel(shapes.x) == numel(shapes.y)", "f16Ok(dtypes.T)"],
      "derive": { "scalar": "dtypes.T" },
      "passes": [
        {
          "id": "main",
          "name": "Abs",
          "shader": "unary-scalar.wgsl.jinja",
          "derive": { "itemsPerInvocation": 4 },
          "bindings": ["x_scalar", "y_scalar", "params_2_unary"],
          "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
          }
        }
      ]
    },
    {
      "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)", "ceilDiv(numel(shapes.y), 4) >= ceilDiv(tunables.MIN_TAIL_ELEMENTS | default(0), 4)"],
      "derive": { "scalar": "dtypes.T", "vectorScalar": "\"vec4<\" ~ dtypes.T ~ \">\"" },
      "passes": [
        {
          "id": "bulk",
          "name": "Abs.Vec4Bulk",
          "shader": "unary-vec4.wgsl.jinja",
          "derive": {
            "vec4PerThread": "tunables.TAIL_VEC4_PER_THREAD | default(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), vec4PerThread)), (tunables.WORKGROUP_SIZE)), 65535)",
            "y": "ceilDiv(ceilDiv((ceilDiv(floor(numel(shapes.y) / 4), vec4PerThread)), (tunables.WORKGROUP_SIZE)), 65535)",
            "z": 1
          }
        },
        {
          "id": "tail",
          "name": "Abs.Tail",
          "shader": "unary-scalar.wgsl.jinja",
          "derive": { "itemsPerInvocation": 4, "tailOnly": true },
          "bindings": ["x_scalar", "y_scalar", "params_2_unary_tail"],
          "dispatch": {
            "x": "min(ceilDiv((1), (tunables.WORKGROUP_SIZE)), 65535)",
            "y": "ceilDiv(ceilDiv((1), (tunables.WORKGROUP_SIZE)), 65535)",
            "z": 1
          }
        }
      ]
    }
  ],
  "bindings": {
    "x": { "buffer": "read-only-storage", "elementType": "$vectorScalar" },
    "y": { "buffer": "storage", "elementType": "$vectorScalar" },
    "params_unary": { "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y) / 4" }], "name": "params" },
    "x_scalar": { "buffer": "read-only-storage", "name": "x", "elementType": "$scalar" },
    "y_scalar": { "buffer": "storage", "name": "y", "elementType": "$scalar" },
    "params_2_unary": { "name": "params", "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y)" }] },
    "params_unary_tail": {
      "struct": [{ "name": "count", "type": "u32", "value": "floor(numel(shapes.y) / 4)" }],
      "name": "params"
    },
    "params_2_unary_tail": {
      "name": "params",
      "struct": [{ "name": "count", "type": "u32", "value": "numel(shapes.y)" }]
    }
  }
}