File size: 4,378 Bytes
ebc1b30
 
 
 
c0e2f2a
 
ebc1b30
c0e2f2a
ebc1b30
 
 
c0e2f2a
ebc1b30
52513d8
ebc1b30
 
 
52513d8
c0e2f2a
52513d8
c0e2f2a
 
 
 
 
 
ebc1b30
c0e2f2a
ebc1b30
 
 
 
52513d8
ebc1b30
 
 
 
c0e2f2a
52513d8
 
c0e2f2a
 
 
 
 
ebc1b30
 
c0e2f2a
 
 
 
52513d8
 
c0e2f2a
 
 
52513d8
c0e2f2a
 
52513d8
c0e2f2a
 
 
52513d8
 
c0e2f2a
 
 
 
 
52513d8
c0e2f2a
52513d8
 
c0e2f2a
 
 
 
 
 
 
 
 
 
 
 
52513d8
 
 
 
c0e2f2a
 
 
 
 
 
 
ebc1b30
c0e2f2a
ebc1b30
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
{
  "domain": "ai.onnx",
  "name": "Log",
  "sinceVersion": 13,
  "inputs": { "x": { "onnx": "input", "dtype": "T" } },
  "outputs": { "y": { "onnx": "output", "dtype": "T", "rank": "ranks.x", "shape": "shapes.x" } },
  "typeConstraints": { "T": ["float32", "float16"] },
  "tunables": { "WORKGROUP_SIZE": { "default": 256 } },
  "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": "Log.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": "scalar",
      "when": ["numel(shapes.x) == numel(shapes.y)", "f16Ok(dtypes.T)"],
      "derive": { "scalar": "dtypes.T" },
      "passes": [
        {
          "id": "main",
          "name": "Log",
          "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": "Log.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": "Log.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)" }]
    }
  }
}