Skip to content

Commit 47e1de7

Browse files
authored
[SYCL] support op col2im_1d (ggml-org#25264)
* support op col2im_1d * update ops.md * rm unused words * update for bf16 * optimize 1%-11% as the review comments * fix the format issue * update as the review comments
1 parent 55edb2d commit 47e1de7

7 files changed

Lines changed: 162 additions & 35 deletions

File tree

docs/ops.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Legend:
2424
| ARGSORT |||||| 🟡 ||||||
2525
| CEIL |||| 🟡 ||||||||
2626
| CLAMP |||||| 🟡 || 🟡 ||||
27-
| COL2IM_1D ||||||| |||||
27+
| COL2IM_1D ||||||| |||||
2828
| CONCAT |||| 🟡 || 🟡 ||||||
2929
| CONT || 🟡 |||| 🟡 | 🟡 || 🟡 |||
3030
| CONV_2D ||||||||||||

docs/ops/SYCL.csv

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5053,39 +5053,39 @@
50535053
"SYCL0","CONV_TRANSPOSE_1D","ne_input=[3,2,1,1],ne_kernel=[3,2,2,1],s0=1,p0=0,d0=1","support","1","yes","SYCL"
50545054
"SYCL0","CONV_TRANSPOSE_1D","ne_input=[3,2,1,1],ne_kernel=[3,1,2,1],s0=1,p0=0,d0=1","support","1","yes","SYCL"
50555055
"SYCL0","CONV_TRANSPOSE_1D","ne_input=[2,1,1,1],ne_kernel=[3,1,1,1],s0=1,p0=0,d0=1","support","1","yes","SYCL"
5056-
"SYCL0","COL2IM_1D","type=f32,K=16,OC=32,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5057-
"SYCL0","COL2IM_1D","type=f32,K=4,OC=3,T_in=7,s0=2,p0=0","support","0","no","SYCL"
5058-
"SYCL0","COL2IM_1D","type=f32,K=1,OC=5,T_in=13,s0=1,p0=0","support","0","no","SYCL"
5059-
"SYCL0","COL2IM_1D","type=f32,K=6,OC=4,T_in=11,s0=3,p0=1","support","0","no","SYCL"
5060-
"SYCL0","COL2IM_1D","type=f32,K=2,OC=3,T_in=9,s0=3,p0=0","support","0","no","SYCL"
5061-
"SYCL0","COL2IM_1D","type=f32,K=5,OC=4,T_in=11,s0=2,p0=0","support","0","no","SYCL"
5062-
"SYCL0","COL2IM_1D","type=f32,K=8,OC=4,T_in=13,s0=4,p0=2","support","0","no","SYCL"
5063-
"SYCL0","COL2IM_1D","type=f32,K=4,OC=3,T_in=1,s0=2,p0=0","support","0","no","SYCL"
5064-
"SYCL0","COL2IM_1D","type=f32,K=16,OC=1,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5065-
"SYCL0","COL2IM_1D","type=f32,K=1,OC=5,T_in=13,s0=3,p0=0","support","0","no","SYCL"
5066-
"SYCL0","COL2IM_1D","type=f32,K=8,OC=2,T_in=3,s0=2,p0=5","support","0","no","SYCL"
5067-
"SYCL0","COL2IM_1D","type=f16,K=16,OC=32,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5068-
"SYCL0","COL2IM_1D","type=f16,K=4,OC=3,T_in=7,s0=2,p0=0","support","0","no","SYCL"
5069-
"SYCL0","COL2IM_1D","type=f16,K=1,OC=5,T_in=13,s0=1,p0=0","support","0","no","SYCL"
5070-
"SYCL0","COL2IM_1D","type=f16,K=6,OC=4,T_in=11,s0=3,p0=1","support","0","no","SYCL"
5071-
"SYCL0","COL2IM_1D","type=f16,K=2,OC=3,T_in=9,s0=3,p0=0","support","0","no","SYCL"
5072-
"SYCL0","COL2IM_1D","type=f16,K=5,OC=4,T_in=11,s0=2,p0=0","support","0","no","SYCL"
5073-
"SYCL0","COL2IM_1D","type=f16,K=8,OC=4,T_in=13,s0=4,p0=2","support","0","no","SYCL"
5074-
"SYCL0","COL2IM_1D","type=f16,K=4,OC=3,T_in=1,s0=2,p0=0","support","0","no","SYCL"
5075-
"SYCL0","COL2IM_1D","type=f16,K=16,OC=1,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5076-
"SYCL0","COL2IM_1D","type=f16,K=1,OC=5,T_in=13,s0=3,p0=0","support","0","no","SYCL"
5077-
"SYCL0","COL2IM_1D","type=f16,K=8,OC=2,T_in=3,s0=2,p0=5","support","0","no","SYCL"
5078-
"SYCL0","COL2IM_1D","type=bf16,K=16,OC=32,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5079-
"SYCL0","COL2IM_1D","type=bf16,K=4,OC=3,T_in=7,s0=2,p0=0","support","0","no","SYCL"
5080-
"SYCL0","COL2IM_1D","type=bf16,K=1,OC=5,T_in=13,s0=1,p0=0","support","0","no","SYCL"
5081-
"SYCL0","COL2IM_1D","type=bf16,K=6,OC=4,T_in=11,s0=3,p0=1","support","0","no","SYCL"
5082-
"SYCL0","COL2IM_1D","type=bf16,K=2,OC=3,T_in=9,s0=3,p0=0","support","0","no","SYCL"
5083-
"SYCL0","COL2IM_1D","type=bf16,K=5,OC=4,T_in=11,s0=2,p0=0","support","0","no","SYCL"
5084-
"SYCL0","COL2IM_1D","type=bf16,K=8,OC=4,T_in=13,s0=4,p0=2","support","0","no","SYCL"
5085-
"SYCL0","COL2IM_1D","type=bf16,K=4,OC=3,T_in=1,s0=2,p0=0","support","0","no","SYCL"
5086-
"SYCL0","COL2IM_1D","type=bf16,K=16,OC=1,T_in=197,s0=8,p0=0","support","0","no","SYCL"
5087-
"SYCL0","COL2IM_1D","type=bf16,K=1,OC=5,T_in=13,s0=3,p0=0","support","0","no","SYCL"
5088-
"SYCL0","COL2IM_1D","type=bf16,K=8,OC=2,T_in=3,s0=2,p0=5","support","0","no","SYCL"
5056+
"SYCL0","COL2IM_1D","type=f32,K=16,OC=32,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5057+
"SYCL0","COL2IM_1D","type=f32,K=4,OC=3,T_in=7,s0=2,p0=0","support","1","yes","SYCL"
5058+
"SYCL0","COL2IM_1D","type=f32,K=1,OC=5,T_in=13,s0=1,p0=0","support","1","yes","SYCL"
5059+
"SYCL0","COL2IM_1D","type=f32,K=6,OC=4,T_in=11,s0=3,p0=1","support","1","yes","SYCL"
5060+
"SYCL0","COL2IM_1D","type=f32,K=2,OC=3,T_in=9,s0=3,p0=0","support","1","yes","SYCL"
5061+
"SYCL0","COL2IM_1D","type=f32,K=5,OC=4,T_in=11,s0=2,p0=0","support","1","yes","SYCL"
5062+
"SYCL0","COL2IM_1D","type=f32,K=8,OC=4,T_in=13,s0=4,p0=2","support","1","yes","SYCL"
5063+
"SYCL0","COL2IM_1D","type=f32,K=4,OC=3,T_in=1,s0=2,p0=0","support","1","yes","SYCL"
5064+
"SYCL0","COL2IM_1D","type=f32,K=16,OC=1,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5065+
"SYCL0","COL2IM_1D","type=f32,K=1,OC=5,T_in=13,s0=3,p0=0","support","1","yes","SYCL"
5066+
"SYCL0","COL2IM_1D","type=f32,K=8,OC=2,T_in=3,s0=2,p0=5","support","1","yes","SYCL"
5067+
"SYCL0","COL2IM_1D","type=f16,K=16,OC=32,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5068+
"SYCL0","COL2IM_1D","type=f16,K=4,OC=3,T_in=7,s0=2,p0=0","support","1","yes","SYCL"
5069+
"SYCL0","COL2IM_1D","type=f16,K=1,OC=5,T_in=13,s0=1,p0=0","support","1","yes","SYCL"
5070+
"SYCL0","COL2IM_1D","type=f16,K=6,OC=4,T_in=11,s0=3,p0=1","support","1","yes","SYCL"
5071+
"SYCL0","COL2IM_1D","type=f16,K=2,OC=3,T_in=9,s0=3,p0=0","support","1","yes","SYCL"
5072+
"SYCL0","COL2IM_1D","type=f16,K=5,OC=4,T_in=11,s0=2,p0=0","support","1","yes","SYCL"
5073+
"SYCL0","COL2IM_1D","type=f16,K=8,OC=4,T_in=13,s0=4,p0=2","support","1","yes","SYCL"
5074+
"SYCL0","COL2IM_1D","type=f16,K=4,OC=3,T_in=1,s0=2,p0=0","support","1","yes","SYCL"
5075+
"SYCL0","COL2IM_1D","type=f16,K=16,OC=1,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5076+
"SYCL0","COL2IM_1D","type=f16,K=1,OC=5,T_in=13,s0=3,p0=0","support","1","yes","SYCL"
5077+
"SYCL0","COL2IM_1D","type=f16,K=8,OC=2,T_in=3,s0=2,p0=5","support","1","yes","SYCL"
5078+
"SYCL0","COL2IM_1D","type=bf16,K=16,OC=32,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5079+
"SYCL0","COL2IM_1D","type=bf16,K=4,OC=3,T_in=7,s0=2,p0=0","support","1","yes","SYCL"
5080+
"SYCL0","COL2IM_1D","type=bf16,K=1,OC=5,T_in=13,s0=1,p0=0","support","1","yes","SYCL"
5081+
"SYCL0","COL2IM_1D","type=bf16,K=6,OC=4,T_in=11,s0=3,p0=1","support","1","yes","SYCL"
5082+
"SYCL0","COL2IM_1D","type=bf16,K=2,OC=3,T_in=9,s0=3,p0=0","support","1","yes","SYCL"
5083+
"SYCL0","COL2IM_1D","type=bf16,K=5,OC=4,T_in=11,s0=2,p0=0","support","1","yes","SYCL"
5084+
"SYCL0","COL2IM_1D","type=bf16,K=8,OC=4,T_in=13,s0=4,p0=2","support","1","yes","SYCL"
5085+
"SYCL0","COL2IM_1D","type=bf16,K=4,OC=3,T_in=1,s0=2,p0=0","support","1","yes","SYCL"
5086+
"SYCL0","COL2IM_1D","type=bf16,K=16,OC=1,T_in=197,s0=8,p0=0","support","1","yes","SYCL"
5087+
"SYCL0","COL2IM_1D","type=bf16,K=1,OC=5,T_in=13,s0=3,p0=0","support","1","yes","SYCL"
5088+
"SYCL0","COL2IM_1D","type=bf16,K=8,OC=2,T_in=3,s0=2,p0=5","support","1","yes","SYCL"
50895089
"SYCL0","CONV_TRANSPOSE_2D","kernel_type=f32,ne_input=[3,2,3,1],ne_kernel=[2,2,1,3],stride=1","support","1","yes","SYCL"
50905090
"SYCL0","CONV_TRANSPOSE_2D","kernel_type=f32,ne_input=[10,10,9,1],ne_kernel=[3,3,1,9],stride=2","support","1","yes","SYCL"
50915091
"SYCL0","CONV_TRANSPOSE_2D","kernel_type=f32,ne_input=[129,63,35,1],ne_kernel=[3,3,48,35],stride=1","support","1","yes","SYCL"

ggml/src/ggml-sycl/backend.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define GGML_SYCL_BACKEND_HPP
1515

1616
#include "binbcast.hpp"
17+
#include "col2im-1d.hpp"
1718
#include "common.hpp"
1819
#include "concat.hpp"
1920
#include "conv.hpp"

ggml/src/ggml-sycl/col2im-1d.cpp

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#include "col2im-1d.hpp"
2+
3+
template <typename T>
4+
static void col2im_1d_sycl(
5+
const T * col,
6+
T * dst,
7+
const int T_in,
8+
const sycl::uint3 T_out_fd,
9+
const int K,
10+
const int K_OC,
11+
const int32_t s0,
12+
const int32_t p0,
13+
const int total,
14+
dpct::queue_ptr stream) {
15+
16+
const uint32_t block_size = SYCL_COL2IM_1D_BLOCK_SIZE;
17+
const uint32_t num_blocks = (uint32_t) ((total + block_size - 1) / block_size);
18+
19+
stream->parallel_for(
20+
sycl::nd_range<3>(
21+
sycl::range<3>(1, 1, num_blocks * block_size),
22+
sycl::range<3>(1, 1, block_size)),
23+
[=](sycl::nd_item<3> item_ct1) {
24+
const int idx = (int) item_ct1.get_global_id(2);
25+
if (idx >= total) {
26+
return;
27+
}
28+
29+
const sycl::uint2 qr = fast_div_modulo((uint32_t) idx, T_out_fd);
30+
const int oc = (int) qr.x();
31+
const int t_out = (int) qr.y();
32+
const int t_abs = t_out + p0;
33+
34+
int t_in_min = (t_abs - K + s0) / s0;
35+
if (t_in_min < 0) {
36+
t_in_min = 0;
37+
}
38+
int t_in_max = t_abs / s0;
39+
if (t_in_max >= T_in) {
40+
t_in_max = T_in - 1;
41+
}
42+
43+
float sum = 0.0f;
44+
for (int t_in = t_in_min; t_in <= t_in_max; ++t_in) {
45+
const int k = t_abs - t_in * s0;
46+
sum += static_cast<float>(col[(oc * K + k) + t_in * K_OC]);
47+
}
48+
49+
dst[idx] = static_cast<T>(sum);
50+
});
51+
}
52+
53+
void ggml_sycl_op_col2im_1d(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
54+
const ggml_tensor * src0 = dst->src[0];
55+
56+
GGML_ASSERT(src0 != nullptr);
57+
GGML_ASSERT(ggml_is_contiguous(src0));
58+
GGML_ASSERT(src0->type == dst->type);
59+
60+
const int32_t s0 = ((const int32_t *) dst->op_params)[0];
61+
const int32_t OC = ((const int32_t *) dst->op_params)[1];
62+
const int32_t p0 = ((const int32_t *) dst->op_params)[2];
63+
64+
const int K_OC = (int) src0->ne[0];
65+
const int T_in = (int) src0->ne[1];
66+
const int K = K_OC / OC;
67+
const int T_out = (int) dst->ne[0];
68+
69+
GGML_ASSERT(OC > 0);
70+
GGML_ASSERT(K_OC % OC == 0);
71+
72+
const sycl::uint3 T_out_fd = init_fastdiv_values((uint32_t) T_out);
73+
74+
const int total = T_out * OC;
75+
76+
dpct::queue_ptr stream = ctx.stream();
77+
78+
switch (src0->type) {
79+
case GGML_TYPE_F32:
80+
col2im_1d_sycl<float>(
81+
(const float *) src0->data,
82+
(float *) dst->data,
83+
T_in, T_out_fd, K, K_OC, s0, p0, total, stream);
84+
break;
85+
case GGML_TYPE_F16:
86+
col2im_1d_sycl<sycl::half>(
87+
(const sycl::half *) src0->data,
88+
(sycl::half *) dst->data,
89+
T_in, T_out_fd, K, K_OC, s0, p0, total, stream);
90+
break;
91+
#ifdef GGML_SYCL_HAS_BF16
92+
case GGML_TYPE_BF16:
93+
col2im_1d_sycl<sycl::ext::oneapi::bfloat16>(
94+
(const sycl::ext::oneapi::bfloat16 *) src0->data,
95+
(sycl::ext::oneapi::bfloat16 *) dst->data,
96+
T_in, T_out_fd, K, K_OC, s0, p0, total, stream);
97+
break;
98+
#endif
99+
default:
100+
GGML_ABORT("col2im_1d: unsupported type %d", src0->type);
101+
}
102+
}

ggml/src/ggml-sycl/col2im-1d.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef GGML_SYCL_COL2IM_1D_HPP
2+
#define GGML_SYCL_COL2IM_1D_HPP
3+
4+
#include "common.hpp"
5+
6+
void ggml_sycl_op_col2im_1d(ggml_backend_sycl_context & ctx, ggml_tensor * dst);
7+
8+
#endif // GGML_SYCL_COL2IM_1D_HPP

ggml/src/ggml-sycl/ggml-sycl.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4771,6 +4771,11 @@ static void ggml_sycl_im2col_3d(ggml_backend_sycl_context & ctx, ggml_tensor * d
47714771
ggml_sycl_op_im2col_3d(ctx, dst);
47724772
}
47734773

4774+
static void ggml_sycl_col2im_1d(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
4775+
scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/1);
4776+
ggml_sycl_op_col2im_1d(ctx, dst);
4777+
}
4778+
47744779
static void ggml_sycl_conv_3d(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
47754780
scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2);
47764781
ggml_sycl_op_conv_3d(ctx, dst);
@@ -5097,6 +5102,9 @@ static bool ggml_sycl_compute_forward(ggml_backend_sycl_context & ctx, struct gg
50975102
case GGML_OP_IM2COL_3D:
50985103
ggml_sycl_im2col_3d(ctx, dst);
50995104
break;
5105+
case GGML_OP_COL2IM_1D:
5106+
ggml_sycl_col2im_1d(ctx, dst);
5107+
break;
51005108
case GGML_OP_POOL_2D:
51015109
ggml_sycl_pool2d(ctx, dst);
51025110
break;
@@ -5646,7 +5654,6 @@ static bool do_ggml_backend_sycl_device_supports_op(ggml_backend_dev_t dev, cons
56465654
// TODO: This specific configuration can fail with oneDNN and needs more debugging
56475655
if (!ggml_is_permuted(a) && ggml_is_permuted(b) && b->ne[2] > 1 && b->ne[3] > 1 &&
56485656
a->ne[0] > 128 && a->ne[2] == 1 && src0_type == GGML_TYPE_F16) {
5649-
printf("zjy 2\n");
56505657
return false;
56515658
}
56525659
return true;
@@ -5842,6 +5849,14 @@ static bool do_ggml_backend_sycl_device_supports_op(ggml_backend_dev_t dev, cons
58425849
case GGML_OP_IM2COL_3D:
58435850
case GGML_OP_UPSCALE:
58445851
return true;
5852+
case GGML_OP_COL2IM_1D:
5853+
return ggml_is_contiguous(op->src[0]) &&
5854+
(op->type == GGML_TYPE_F32 || op->type == GGML_TYPE_F16
5855+
#ifdef GGML_SYCL_HAS_BF16
5856+
|| op->type == GGML_TYPE_BF16
5857+
#endif
5858+
) &&
5859+
op->src[0]->type == op->type;
58455860
case GGML_OP_CONV_3D:
58465861
return op->type == GGML_TYPE_F32 &&
58475862
(op->src[0]->type == GGML_TYPE_F32 || op->src[0]->type == GGML_TYPE_F16) &&

ggml/src/ggml-sycl/presets.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define WARP_SIZE GGML_SYCL_WARP_SIZE
2020
#define MATRIX_ROW_PADDING 512 // last row of quant. matrices is a multiple of this to avoid out-of-bounds memory accesses
2121

22+
#define SYCL_COL2IM_1D_BLOCK_SIZE 256
2223
#define SYCL_GELU_BLOCK_SIZE 256
2324
#define SYCL_SILU_BLOCK_SIZE 256
2425
#define SYCL_TANH_BLOCK_SIZE 256

0 commit comments

Comments
 (0)