@@ -624,97 +624,95 @@ TEST_CASE("Test tensor operation with first touch: unary (zero, relu, copy) & ma
624624 * =================================================================================================
625625 * =================================================================================================
626626 */
627- // TEST_CASE("Test tensor operation with outer loop with main kernel: unary (zero, relu, copy)", "[tensor_operation][unary][correctness]")
628- // {
629- // using namespace mini_jit;
630627
631- // auto type = GENERATE(TensorOperation::prim_t::zero, TensorOperation::prim_t::relu, TensorOperation::prim_t::copy);
628+ TEST_CASE (" Test tensor operation with outer loop with main kernel: unary (zero, relu, copy)" , " [tensor_operation][unary][correctness]" )
629+ {
630+ using namespace mini_jit ;
632631
633- // CAPTURE( type);
632+ auto type = GENERATE (TensorOperation:: prim_t ::zero, TensorOperation:: prim_t ::relu, TensorOperation:: prim_t ::copy );
634633
635- // constexpr TensorOperation::dim_t dim_types[]{TensorOperation::dim_t::n, TensorOperation::dim_t::k, TensorOperation::dim_t::c,
636- // TensorOperation::dim_t::m, TensorOperation::dim_t::k, TensorOperation::dim_t::m,
637- // TensorOperation::dim_t::m, TensorOperation::dim_t::n};
638- // constexpr TensorOperation::exec_t exec_types[]{TensorOperation::exec_t::seq, TensorOperation::exec_t::seq,
639- // TensorOperation::exec_t::seq,
640- // TensorOperation::exec_t::seq, TensorOperation::exec_t::seq,
641- // TensorOperation::exec_t::seq, TensorOperation::exec_t::prim,
642- // TensorOperation::exec_t::prim};
643- // constexpr int64_t dim_sizes[]{2, 3, 5, 8, 13, 21, 64, 64};
644- // constexpr int64_t strides_in0[]{64 * 64 * 21 * 13 * 8 * 5 * 3 * 2,
645- // 64 * 64 * 21 * 13 * 8 * 5 * 1,
646- // 64 * 64 * 21 * 13 * 8 * 5,
647- // 64 * 64 * 21 * 13 * 8,
648- // 64 * 64 * 21 * 13,
649- // 64 * 64 * 21,
650- // 64 * 64,
651- // 1,
652- // 64};
653- // constexpr int64_t strides_in1[]{0, 0, 0, 0, 0, 0, 0, 0};
654- // constexpr int64_t strides_out[]{64 * 64 * 21 * 13 * 8 * 5 * 3 * 2,
655- // 64 * 64 * 21 * 13 * 8 * 5 * 1,
656- // 64 * 64 * 21 * 13 * 8 * 5,
657- // 64 * 64 * 21 * 13 * 8,
658- // 64 * 64 * 21 * 1,
659- // 64 * 64 * 21,
660- // 64 * 64,
661- // 1,
662- // 64};
663-
664- // GenerationTest test(64, 64, 64, 1, 64 * 64 * 21 * 13 * 8 * 5 * 3 * 2, 0, 64 * 64 * 21 * 13 * 8 * 5 * 3 * 2);
634+ CAPTURE (type);
665635
666- // mini_jit::TensorOperation tensor_op;
667- // TensorOperation::error_t err = tensor_op.setup(
668- // TensorOperation::dtype_t::fp32, TensorOperation::prim_t::none, type, TensorOperation::prim_t::none, std::span{dim_types},
669- // std::span{exec_types}, std::span{dim_sizes}, std::span{strides_in0}, std::span{strides_in1}, std::span{strides_out});
636+ constexpr TensorOperation::dim_t dim_types[]{TensorOperation::dim_t ::n, TensorOperation::dim_t ::k, TensorOperation::dim_t ::c,
637+ TensorOperation::dim_t ::m, TensorOperation::dim_t ::k, TensorOperation::dim_t ::m,
638+ TensorOperation::dim_t ::m, TensorOperation::dim_t ::n};
639+ constexpr TensorOperation::exec_t exec_types[]{TensorOperation::exec_t ::seq, TensorOperation::exec_t ::seq, TensorOperation::exec_t ::seq,
640+ TensorOperation::exec_t ::seq, TensorOperation::exec_t ::seq, TensorOperation::exec_t ::seq,
641+ TensorOperation::exec_t ::prim, TensorOperation::exec_t ::prim};
642+ constexpr int64_t dim_sizes[]{2 , 3 , 5 , 8 , 13 , 21 , 16 , 16 };
643+ constexpr int64_t strides_in0[]{16 * 16 * 1 * 13 * 8 * 1 * 3 ,
644+ 0 , // k-dim
645+ 16 * 16 * 1 * 13 * 8 ,
646+ 16 * 16 * 1 * 13 ,
647+ 0 , // k-dim
648+ 16 * 16 ,
649+ 1 ,
650+ 16 };
651+ constexpr int64_t strides_in1[]{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
652+ constexpr int64_t strides_out[]{16 * 16 * 1 * 13 * 8 * 1 * 3 ,
653+ 0 , // k-dim
654+ 16 * 16 * 1 * 13 * 8 ,
655+ 16 * 16 * 1 * 13 ,
656+ 0 , // k-dim
657+ 16 * 16 ,
658+ 1 ,
659+ 16 };
670660
671- // REQUIRE(err == TensorOperation::error_t::success);
661+ GenerationTest test (16 , 16 , 16 , 1 , 16 * 16 * 21 * 13 * 8 * 5 * 3 * 2 , 0 , 16 * 16 * 21 * 13 * 8 * 5 * 3 * 2 );
662+ test.SetUp (TestInfill::Random);
672663
673- // tensor_op.execute(test.matrix_a.data(), nullptr, test.matrix_c.data());
664+ mini_jit::TensorOperation tensor_op;
665+ TensorOperation::error_t err = tensor_op.setup (
666+ TensorOperation::dtype_t ::fp32, TensorOperation::prim_t ::none, type, TensorOperation::prim_t ::none, std::span{dim_types},
667+ std::span{exec_types}, std::span{dim_sizes}, std::span{strides_in0}, std::span{strides_in1}, std::span{strides_out});
674668
675- // UnaryType test_type = UnaryType::None;
676- // switch (type)
677- // {
678- // case TensorOperation::prim_t::zero:
679- // test_type = UnaryType::Zero;
680- // break;
681- // case TensorOperation::prim_t::copy:
682- // test_type = UnaryType::Identity;
683- // break;
684- // case TensorOperation::prim_t::relu:
685- // test_type = UnaryType::ReLu;
686- // break;
687- // default:
688- // FAIL("Could not parse the unary type!");
689- // break;
690- // }
669+ REQUIRE (err == TensorOperation::error_t ::success);
691670
692- // for (size_t i0 = 0; i0 < dim_sizes[0]; i0++)
693- // {
694- // for (size_t i1 = 0; i1 < dim_sizes[1]; i1++)
695- // {
696- // for (size_t i2 = 0; i2 < dim_sizes[2]; i2++)
697- // {
698- // for (size_t i3 = 0; i3 < dim_sizes[3]; i3++)
699- // {
700- // for (size_t i4 = 0; i4 < dim_sizes[4]; i4++)
701- // {
702- // for (size_t i5 = 0; i5 < dim_sizes[5]; i5++)
703- // {
704- // uint64_t offset_a = i0 * strides_in0[0] + i1 * strides_in0[1] + i2 * strides_in0[2] + i3 * strides_in0[3] +
705- // i4 * strides_in0[4] + i5 * strides_in0[5];
706- // uint64_t offset_c = i0 * strides_out[0] + i1 * strides_out[1] + i2 * strides_out[2] + i3 * strides_out[3] +
707- // i4 * strides_out[4] + i5 * strides_out[5];
708- // test.naive_unary_M_N(test.matrix_a.data() + offset_a, test.matrix_c_verify.data() + offset_c, 64, 64, false, test_type);
709- // }
710- // }
711- // }
712- // }
713- // }
714- // }
671+ tensor_op.execute (test.matrix_a .data (), nullptr , test.matrix_c .data ());
715672
716- // test.verify_matmul(test.matrix_c_verify.data(), test.matrix_c.data(), test.matrix_c.size());
717- // }
673+ UnaryType test_type = UnaryType::None;
674+ switch (type)
675+ {
676+ case TensorOperation::prim_t ::zero:
677+ test_type = UnaryType::Zero;
678+ break ;
679+ case TensorOperation::prim_t ::copy:
680+ test_type = UnaryType::Identity;
681+ break ;
682+ case TensorOperation::prim_t ::relu:
683+ test_type = UnaryType::ReLu;
684+ break ;
685+ default :
686+ FAIL (" Could not parse the unary type!" );
687+ break ;
688+ }
689+
690+ for (size_t i0 = 0 ; i0 < dim_sizes[0 ]; i0++)
691+ {
692+ for (size_t i1 = 0 ; i1 < dim_sizes[1 ]; i1++)
693+ {
694+ for (size_t i2 = 0 ; i2 < dim_sizes[2 ]; i2++)
695+ {
696+ for (size_t i3 = 0 ; i3 < dim_sizes[3 ]; i3++)
697+ {
698+ for (size_t i4 = 0 ; i4 < dim_sizes[4 ]; i4++)
699+ {
700+ for (size_t i5 = 0 ; i5 < dim_sizes[5 ]; i5++)
701+ {
702+ uint64_t offset_a = i0 * strides_in0[0 ] + i1 * strides_in0[1 ] + i2 * strides_in0[2 ] + i3 * strides_in0[3 ] +
703+ i4 * strides_in0[4 ] + i5 * strides_in0[5 ];
704+ uint64_t offset_c = i0 * strides_out[0 ] + i1 * strides_out[1 ] + i2 * strides_out[2 ] + i3 * strides_out[3 ] +
705+ i4 * strides_out[4 ] + i5 * strides_out[5 ];
706+ test.naive_unary_M_N (test.matrix_a .data () + offset_a, test.matrix_c_verify .data () + offset_c, 16 , 16 , false , test_type);
707+ }
708+ }
709+ }
710+ }
711+ }
712+ }
713+
714+ test.verify_matmul (test.matrix_c_verify .data (), test.matrix_c .data (), test.matrix_c .size ());
715+ }
718716
719717TEST_CASE (" Test tensor operation with outer loop with main kernel: gemm" , " [tensor_operation][gemm][correctness]" )
720718{
0 commit comments