@@ -945,6 +945,7 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = {
945945    "CONV_TRANSPOSE_1D" ,
946946    "IM2COL" ,
947947    "IM2COL_BACK" ,
948+     "CONV_2D" ,
948949    "CONV_2D_DW" ,
949950    "CONV_TRANSPOSE_2D" ,
950951    "POOL_1D" ,
@@ -986,7 +987,7 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = {
986987    "GLU" ,
987988};
988989
989- static_assert (GGML_OP_COUNT  ==  85 , "GGML_OP_COUNT != 85 " );
990+ static_assert (GGML_OP_COUNT  ==  86 , "GGML_OP_COUNT != 86 " );
990991
991992static  const  char  *  GGML_OP_SYMBOL [GGML_OP_COUNT ] =  {
992993    "none" ,
@@ -1044,6 +1045,7 @@ static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = {
10441045    "conv_transpose_1d(x)" ,
10451046    "im2col(x)" ,
10461047    "im2col_back(x)" ,
1048+     "conv_2d(x)" ,
10471049    "conv_2d_dw(x)" ,
10481050    "conv_transpose_2d(x)" ,
10491051    "pool_1d(x)" ,
@@ -1085,7 +1087,7 @@ static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = {
10851087    "glu(x)" ,
10861088};
10871089
1088- static_assert (GGML_OP_COUNT  ==  85 , "GGML_OP_COUNT != 85 " );
1090+ static_assert (GGML_OP_COUNT  ==  86 , "GGML_OP_COUNT != 86 " );
10891091
10901092static_assert (GGML_OP_POOL_COUNT  ==  2 , "GGML_OP_POOL_COUNT != 2" );
10911093
@@ -4291,6 +4293,44 @@ struct ggml_tensor * ggml_conv_2d_dw_direct(
42914293    return  result ;
42924294}
42934295
4296+ // ggml_conv_2d_direct 
4297+ 
4298+ struct  ggml_tensor  *  ggml_conv_2d_direct (
4299+         struct  ggml_context  *  ctx ,
4300+         struct  ggml_tensor   *  a ,   // convolution kernel [KW, KH, IC, OC] 
4301+         struct  ggml_tensor   *  b ,   // input data [W, H, C, N] 
4302+         int                    s0 ,  // stride dimension 0 
4303+         int                    s1 ,  // stride dimension 1 
4304+         int                    p0 ,  // padding dimension 0 
4305+         int                    p1 ,  // padding dimension 1 
4306+         int                    d0 ,  // dilation dimension 0 
4307+         int                    d1 ) {// dilation dimension 1 
4308+ 
4309+     GGML_ASSERT (a -> ne [2 ] ==  b -> ne [2 ]);
4310+     //GGML_ASSERT(a->type == b->type); 
4311+ 
4312+     int64_t  ne [4 ];
4313+     ne [0 ] =  ggml_calc_conv_output_size (b -> ne [0 ], a -> ne [0 ], s0 , p0 , d0 );
4314+     ne [1 ] =  ggml_calc_conv_output_size (b -> ne [1 ], a -> ne [1 ], s1 , p1 , d1 );
4315+     ne [2 ] =  a -> ne [3 ];
4316+     ne [3 ] =  b -> ne [3 ];
4317+ 
4318+     struct  ggml_tensor  *  result  =  ggml_new_tensor (ctx , b -> type , 4 , ne );
4319+ 
4320+     ggml_set_op_params_i32 (result , 0 , s0 );
4321+     ggml_set_op_params_i32 (result , 1 , s1 );
4322+     ggml_set_op_params_i32 (result , 2 , p0 );
4323+     ggml_set_op_params_i32 (result , 3 , p1 );
4324+     ggml_set_op_params_i32 (result , 4 , d0 );
4325+     ggml_set_op_params_i32 (result , 5 , d1 );
4326+ 
4327+     result -> op  =  GGML_OP_CONV_2D ;
4328+     result -> src [0 ] =  a ;
4329+     result -> src [1 ] =  b ;
4330+ 
4331+     return  result ;
4332+ }
4333+ 
42944334// ggml_conv_transpose_2d_p0 
42954335
42964336static  int64_t  ggml_calc_conv_transpose_output_size (int64_t  ins , int64_t  ks , int  s , int  p ) {
0 commit comments