Daniele commited on
Commit
f6cff0a
·
1 Parent(s): c6c2a2c

vulkan: improve im2col (llama/11826)

Browse files
ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp CHANGED
@@ -40,6 +40,20 @@ void main() {
40
  const uint batch = gl_GlobalInvocationID.z / p.IC;
41
  const uint ic = gl_GlobalInvocationID.z % p.IC;
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  A_TYPE values[NUM_ITER];
44
  uint offset_dst[NUM_ITER];
45
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
@@ -48,36 +62,35 @@ void main() {
48
 
49
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
50
 
51
- const uint i = gidx * NUM_ITER + idx;
52
 
53
- const uint ksize = p.OW * (p.KH > 1 ? p.KW : 1);
54
- const uint kx = i / ksize;
55
- const uint kd = kx * ksize;
56
- const uint ky = (i - kd) / p.OW;
57
- const uint ix = i % p.OW;
58
 
59
- const uint iiw = ix * p.s0 + kx * p.d0 - p.p0;
60
- const uint iih = oh * p.s1 + ky * p.d1 - p.p1;
61
 
62
- offset_dst[idx] =
63
- ((batch * p.OH + oh) * p.OW + ix) * p.CHW +
64
- (ic * (p.KW * p.KH) + ky * p.KW + kx);
65
 
66
- if (i >= p.pelements) {
67
- continue;
68
  }
69
 
70
- if (iih < p.IH && iiw < p.IW) {
71
- const uint offset_src = ic * p.offset_delta + batch * p.batch_offset;
72
- values[idx] = data_a[offset_src + iih * p.IW + iiw];
 
 
 
73
  }
74
  }
75
 
76
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
77
 
78
- const uint i = gidx * NUM_ITER + idx;
79
 
80
- if (i >= p.pelements) {
81
  continue;
82
  }
83
 
 
40
  const uint batch = gl_GlobalInvocationID.z / p.IC;
41
  const uint ic = gl_GlobalInvocationID.z % p.IC;
42
 
43
+ const uint src_base = ic * p.offset_delta + batch * p.batch_offset;
44
+ const uint dst_base = ((batch * p.OH + oh) * p.OW) * p.CHW + ic * (p.KW * p.KH);
45
+ const int oh_s1 = int(oh) * p.s1;
46
+ const uint ksize = p.OW * (p.KH > 1 ? p.KW : 1);
47
+
48
+ const uint base_linear_idx = gidx * NUM_ITER;
49
+
50
+ const uint max_ky = ksize / p.OW;
51
+
52
+ uint current_kx = base_linear_idx / ksize;
53
+ const uint rem = base_linear_idx - (current_kx * ksize);
54
+ uint current_ky = rem / p.OW;
55
+ uint current_ix = rem % p.OW;
56
+
57
  A_TYPE values[NUM_ITER];
58
  uint offset_dst[NUM_ITER];
59
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
 
62
 
63
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
64
 
65
+ const uint linear_idx = base_linear_idx + idx;
66
 
67
+ if (linear_idx >= p.pelements) {
68
+ continue;
69
+ }
 
 
70
 
71
+ const uint iiw = current_ix * p.s0 + current_kx * p.d0 - p.p0;
72
+ const uint iih = oh_s1 + current_ky * p.d1 - p.p1;
73
 
74
+ offset_dst[idx] = dst_base + current_ix * p.CHW + current_ky * p.KW + current_kx;
 
 
75
 
76
+ if ((iih < p.IH) && (iiw < p.IW)) {
77
+ values[idx] = data_a[src_base + iih * p.IW + iiw];
78
  }
79
 
80
+ if (++current_ix == p.OW) {
81
+ current_ix = 0;
82
+ if (++current_ky == max_ky) {
83
+ current_ky = 0;
84
+ current_kx++;
85
+ }
86
  }
87
  }
88
 
89
  [[unroll]] for (uint idx = 0; idx < NUM_ITER; ++idx) {
90
 
91
+ const uint linear_idx = base_linear_idx + idx;
92
 
93
+ if (linear_idx >= p.pelements) {
94
  continue;
95
  }
96