@@ -644,7 +644,7 @@ struct test_case {
644644 fflush (stdout);
645645
646646 // check if backends support op
647- if (!ggml_backend_supports_op (backend, out)) {
647+ if (!ggml_backend_supports_op (backend, out) && strcmp (op_name, " CONV2D " ) ) {
648648 printf (" not supported\n " );
649649 ggml_free (ctx);
650650 return true ;
@@ -2246,7 +2246,7 @@ struct test_im2col : public test_case {
22462246 }
22472247};
22482248
2249- // GGML_Conv2D
2249+
22502250struct test_conv2d : public test_case {
22512251 const ggml_type type_input;
22522252 const ggml_type type_kernel;
@@ -2263,12 +2263,63 @@ struct test_conv2d : public test_case {
22632263 const int d0;
22642264 const int d1;
22652265 // mode
2266+ const bool is_2D;
22662267
22672268 std::string vars () override {
22682269 return VARS_TO_STR11 (type_input, type_kernel, dst_type, ne_input, ne_kernel, s0, s1, p0, p1, d0, d1);
22692270 }
22702271
2272+ std::string op_desc (ggml_tensor * t) override {
2273+ return std::string (" CONV2D" );
2274+ }
2275+
2276+
22712277 test_conv2d (ggml_type type_input = GGML_TYPE_F32, ggml_type type_kernel = GGML_TYPE_F16, ggml_type dst_type = GGML_TYPE_F32,
2278+ std::array<int64_t , 4 > ne_input = {10 , 10 , 3 , 1 }, // [input_width, input_height, input_channels, 1]
2279+ std::array<int64_t , 4 > ne_kernel = {3 , 3 , 3 , 1 }, // [kernel_width, kernel_height, input_channels, 1]
2280+ int s0 = 1 , int s1 = 1 ,
2281+ int p0 = 1 , int p1 = 1 ,
2282+ int d0 = 1 , int d1 = 1 ,
2283+ bool is_2D = true )
2284+ : type_input(type_input), type_kernel(type_kernel), dst_type(dst_type), ne_input(ne_input), ne_kernel(ne_kernel), s0(s0), s1(s1), p0(p0), p1(p1), d0(d0), d1(d1)
2285+ , is_2D(is_2D){}
2286+
2287+ ggml_tensor * build_graph (ggml_context * ctx) override {
2288+ ggml_tensor * input = ggml_new_tensor (ctx, type_input, 4 , ne_input.data ());
2289+ ggml_set_name (input, " input" );
2290+
2291+ ggml_tensor * kernel = ggml_new_tensor (ctx, type_kernel, 4 , ne_kernel.data ());
2292+ ggml_set_name (kernel, " kernel" );
2293+
2294+ ggml_tensor * out = ggml_conv_2d (ctx, kernel, input, 1 , 1 , 1 , 1 , 1 , 1 );
2295+ ggml_set_name (out, " out" );
2296+
2297+ return out;
2298+ }
2299+ };
2300+ // GGML_Conv2D
2301+ struct test_conv2d_wino : public test_case {
2302+ const ggml_type type_input;
2303+ const ggml_type type_kernel;
2304+ const ggml_type dst_type;
2305+ const std::array<int64_t , 4 > ne_input;
2306+ const std::array<int64_t , 4 > ne_kernel;
2307+ // stride
2308+ const int s0;
2309+ const int s1;
2310+ // padding
2311+ const int p0;
2312+ const int p1;
2313+ // dilation
2314+ const int d0;
2315+ const int d1;
2316+ // mode
2317+
2318+ std::string vars () override {
2319+ return VARS_TO_STR11 (type_input, type_kernel, dst_type, ne_input, ne_kernel, s0, s1, p0, p1, d0, d1);
2320+ }
2321+
2322+ test_conv2d_wino (ggml_type type_input = GGML_TYPE_F32, ggml_type type_kernel = GGML_TYPE_F16, ggml_type dst_type = GGML_TYPE_F32,
22722323 std::array<int64_t , 4 > ne_input = {10 , 10 , 3 , 1 }, // [input_width, input_height, input_channels, 1]
22732324 std::array<int64_t , 4 > ne_kernel = {3 , 3 , 3 , 1 }, // [kernel_width, kernel_height, input_channels, 1]
22742325 int s0 = 1 , int s1 = 1 ,
@@ -3296,10 +3347,20 @@ static bool test_backend(ggml_backend_t backend, test_mode mode, const char * op
32963347 test_cases.emplace_back (new test_im2col (GGML_TYPE_F32, GGML_TYPE_F32, GGML_TYPE_F32, {3000 , 128 , 1 , 1 }, {3 , 128 , 1280 , 1 }, 1 , 0 , 1 , 0 , 1 , 0 , false ));
32973348 test_cases.emplace_back (new test_im2col (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {3000 , 128 , 1 , 1 }, {3 , 128 , 1280 , 1 }, 1 , 0 , 1 , 0 , 1 , 0 , false ));
32983349 test_cases.emplace_back (new test_im2col (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F16, {3000 , 128 , 1 , 1 }, {3 , 128 , 1280 , 1 }, 1 , 0 , 1 , 0 , 1 , 0 , false ));
3299-
3300- test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 640 , 1 }, {3 , 3 , 640 , 960 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3301- test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 1280 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3302- test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 2560 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3350+ test_cases.emplace_back (new test_im2col (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 2560 }, 1 , 1 , 1 , 1 , 1 , 1 ,true ));
3351+
3352+ test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 640 , 1 }, {3 , 3 , 640 , 960 }, 1 , 1 , 1 , 1 , 1 , 1 , true ));
3353+ test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 1280 }, 1 , 1 , 1 , 1 , 1 , 1 ,true ));
3354+ test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 2560 }, 1 , 1 , 1 , 1 , 1 , 1 ,true ));
3355+ test_cases.emplace_back (new test_conv2d (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {512 , 512 , 512 , 1 }, {3 , 3 , 512 , 256 }, 1 , 1 , 1 , 1 , 1 , 1 ,true ));
3356+ // test_cases.emplace_back(new test_conv2d(GGML_TYPE_F32, GGML_TYPE_F32, GGML_TYPE_F32, {56, 80, 1280, 1}, {3, 3, 1280, 2560}, 1, 1, 1, 1, 1, 1,true));
3357+
3358+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 640 , 1 }, {3 , 3 , 640 , 960 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3359+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 1280 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3360+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 320 , 1 }, {3 , 3 , 320 , 640 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3361+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 2560 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3362+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F32, GGML_TYPE_F32, {56 , 80 , 1280 , 1 }, {3 , 3 , 1280 , 2560 }, 1 , 1 , 1 , 1 , 1 , 1 ));
3363+ test_cases.emplace_back (new test_conv2d_wino (GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_F32, {512 , 512 , 512 , 1 }, {3 , 3 , 512 , 256 }, 1 , 1 , 1 , 1 , 1 , 1 ));
33033364
33043365 // sycl backend will limit task global_range < MAX_INT
33053366 // test cases for 2D im2col with large input W and H (occurs in stable-diffusion)
0 commit comments