diff --git a/mace/kernels/opencl/cl/pooling.cl b/mace/kernels/opencl/cl/pooling.cl index b55202d330985629e5edb57f59fe0f7ac08f35d3..bd2763fc8c7eb68c06e09b4822ccc5025807a151 100644 --- a/mace/kernels/opencl/cl/pooling.cl +++ b/mace/kernels/opencl/cl/pooling.cl @@ -1,7 +1,7 @@ #include #ifdef FP16 -#define MIN_VALUE -HALF_MAX +#define MIN_VALUE -USHRT_MAX #else #define MIN_VALUE -FLT_MAX #endif diff --git a/mace/ops/pooling.cc b/mace/ops/pooling.cc index dc058d71e85bcfdd286922fccd58e5d6fef8bc1f..17031378f7e93ac6924f794ec352d3009181179d 100644 --- a/mace/ops/pooling.cc +++ b/mace/ops/pooling.cc @@ -10,6 +10,10 @@ REGISTER_CPU_OPERATOR(OpKeyBuilder("Pooling") .TypeConstraint("T") .Build(), PoolingOp); +REGISTER_CPU_OPERATOR(OpKeyBuilder("Pooling") + .TypeConstraint("T") + .Build(), + PoolingOp); #if __ARM_NEON REGISTER_NEON_OPERATOR(OpKeyBuilder("Pooling") @@ -22,5 +26,9 @@ REGISTER_OPENCL_OPERATOR(OpKeyBuilder("Pooling") .TypeConstraint("T") .Build(), PoolingOp); +REGISTER_OPENCL_OPERATOR(OpKeyBuilder("Pooling") + .TypeConstraint("T") + .Build(), + PoolingOp); } // namespace mace diff --git a/mace/ops/pooling_test.cc b/mace/ops/pooling_test.cc index c02c976fafb9bf75af7319828d56553814dd498e..dcda06b75483e6e0e01cfe16594991d72171d2bf 100644 --- a/mace/ops/pooling_test.cc +++ b/mace/ops/pooling_test.cc @@ -174,7 +174,7 @@ TEST_F(PoolingOpTest, OPENCLSimpleMaxPooling3S2) { SimpleMaxPooling3S2(); } -template +template static void MaxPooling3S2(const std::vector &input_shape, const std::vector strides, Padding padding) { @@ -188,17 +188,18 @@ static void MaxPooling3S2(const std::vector &input_shape, .AddIntsArg("strides", strides) .AddIntArg("padding", padding) .AddIntsArg("dilations", {1, 1}) + .AddIntArg("T", static_cast(DataTypeToEnum::value)) .Finalize(net.NewOperatorDef()); // Add input data - net.AddRandomInput("Input", input_shape); + net.AddRandomInput("Input", input_shape); // run on cpu net.RunOp(); Tensor expected; expected.Copy(*net.GetOutput("Output")); - BufferToImage(net, "Input", "InputImage", kernels::BufferType::IN_OUT); + BufferToImage(net, "Input", "InputImage", kernels::BufferType::IN_OUT); OpDefBuilder("Pooling", "PoolingTest") .Input("InputImage") .Output("OutputImage") @@ -207,11 +208,12 @@ static void MaxPooling3S2(const std::vector &input_shape, .AddIntsArg("strides", strides) .AddIntArg("padding", padding) .AddIntsArg("dilations", {1, 1}) + .AddIntArg("T", static_cast(DataTypeToEnum::value)) .Finalize(net.NewOperatorDef()); net.RunOp(D); - ImageToBuffer(net, "OutputImage", "OPENCLOutput", kernels::BufferType::IN_OUT); + ImageToBuffer(net, "OutputImage", "OPENCLOutput", kernels::BufferType::IN_OUT); - ExpectTensorNear(expected, *net.GetOutput("OPENCLOutput"), 0.001); + ExpectTensorNear(expected, *net.GetOutput("OPENCLOutput"), 0.001); } // TODO(chenghui) : there is a bug. @@ -221,17 +223,24 @@ static void MaxPooling3S2(const std::vector &input_shape, //} TEST_F(PoolingOpTest, OPENCLAlignedMaxPooling3S2) { - MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::VALID); - MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::VALID); - MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::SAME); - MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::SAME); + MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::VALID); + MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::VALID); + MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::SAME); + MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::SAME); +} + +TEST_F(PoolingOpTest, OPENCLHalfAlignedMaxPooling3S2) { + MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::VALID); + MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::VALID); + MaxPooling3S2({3, 64, 32, 32}, {1, 1}, Padding::SAME); + MaxPooling3S2({3, 64, 32, 32}, {2, 2}, Padding::SAME); } TEST_F(PoolingOpTest, OPENCLUnalignedMaxPooling3S2) { - MaxPooling3S2({3, 41, 43, 47}, {1, 1}, Padding::VALID); - MaxPooling3S2({3, 41, 43, 47}, {2, 2}, Padding::VALID); - MaxPooling3S2({3, 41, 43, 47}, {1, 1}, Padding::SAME); - MaxPooling3S2({3, 41, 43, 47}, {2, 2}, Padding::SAME); + MaxPooling3S2({3, 41, 43, 47}, {1, 1}, Padding::VALID); + MaxPooling3S2({3, 41, 43, 47}, {2, 2}, Padding::VALID); + MaxPooling3S2({3, 41, 43, 47}, {1, 1}, Padding::SAME); + MaxPooling3S2({3, 41, 43, 47}, {2, 2}, Padding::SAME); } TEST_F(PoolingOpTest, AVG_VALID) { @@ -297,7 +306,7 @@ TEST_F(PoolingOpTest, OPENCLSimpleAvgPooling) { SimpleAvgPoolingTest(); } -template +template static void AvgPoolingTest(const std::vector &shape, const std::vector &kernels, const std::vector &strides, @@ -322,7 +331,7 @@ static void AvgPoolingTest(const std::vector &shape, Tensor expected; expected.Copy(*net.GetOutput("Output")); - BufferToImage(net, "Input", "InputImage", kernels::BufferType::IN_OUT); + BufferToImage(net, "Input", "InputImage", kernels::BufferType::IN_OUT); OpDefBuilder("Pooling", "PoolingTest") .Input("InputImage") .Output("OutputImage") @@ -331,30 +340,41 @@ static void AvgPoolingTest(const std::vector &shape, .AddIntsArg("strides", strides) .AddIntArg("padding", padding) .AddIntsArg("dilations", {1, 1}) + .AddIntArg("T", static_cast(DataTypeToEnum::value)) .Finalize(net.NewOperatorDef()); net.RunOp(D); - ImageToBuffer(net, "OutputImage", "OPENCLOutput", kernels::BufferType::IN_OUT); + ImageToBuffer(net, "OutputImage", "OPENCLOutput", kernels::BufferType::IN_OUT); - ExpectTensorNear(expected, *net.GetOutput("OPENCLOutput"), 0.001); + ExpectTensorNear(expected, *net.GetOutput("OPENCLOutput"), 0.01); } TEST_F(PoolingOpTest, OPENCLAlignedAvgPooling) { - AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::VALID); - AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::SAME); + AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::VALID); + AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::SAME); +} + +TEST_F(PoolingOpTest, OPENCLHalfAlignedAvgPooling) { + AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::VALID); + AvgPoolingTest({3, 15, 15, 128}, {4, 4}, {4, 4}, Padding::SAME); } TEST_F(PoolingOpTest, OPENCLAlignedLargeKernelAvgPooling) { - AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::VALID); - AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::SAME); + AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::VALID); + AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::SAME); +} + +TEST_F(PoolingOpTest, OPENCLHalfAlignedLargeKernelAvgPooling) { + AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::VALID); + AvgPoolingTest({3, 64, 64, 128}, {16, 16}, {16, 16}, Padding::SAME); } TEST_F(PoolingOpTest, OPENCLUnAlignedAvgPooling) { - AvgPoolingTest({3, 31, 37, 128}, {2, 2}, {2, 2}, Padding::VALID); - AvgPoolingTest({3, 31, 37, 128}, {2, 2}, {2, 2}, Padding::SAME); + AvgPoolingTest({3, 31, 37, 128}, {2, 2}, {2, 2}, Padding::VALID); + AvgPoolingTest({3, 31, 37, 128}, {2, 2}, {2, 2}, Padding::SAME); } TEST_F(PoolingOpTest, OPENCLUnAlignedLargeKernelAvgPooling) { - AvgPoolingTest({3, 31, 37, 128}, {8, 8}, {8, 8}, Padding::VALID); - AvgPoolingTest({3, 31, 37, 128}, {8, 8}, {8, 8}, Padding::SAME); + AvgPoolingTest({3, 31, 37, 128}, {8, 8}, {8, 8}, Padding::VALID); + AvgPoolingTest({3, 31, 37, 128}, {8, 8}, {8, 8}, Padding::SAME); }