/** * \file dnn/test/cpu/pooling.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include "test/cpu/fixture.h" #include "test/common/benchmarker.h" #include "test/common/checker.h" #include "test/common/pooling.h" namespace megdnn { namespace test { TEST_F(CPU, POOLING) { auto args = pooling::get_args(); using Format = param::Pooling::Format; for (auto dtype : std::vector{dtype::Int8(), dtype::Float32()}) for (Format format : {Format::NCHW, Format::NHWC}) for (auto&& arg : args) { auto param = arg.param; auto src = arg.ishape; Checker checker(handle()); param.format = format; if (param.format == Format::NHWC) { src = cvt_src_or_dst_nchw2nhwc(src); } checker.set_param(param).set_dtype(0, dtype).set_dtype(1, dtype).exec( TensorShapeArray{src, {}}); } } TEST_F(CPU, POOLING_INT) { UniformIntRNG rng(0, 255); for (int modeflag = 0; modeflag < 2; ++modeflag) { param::Pooling param; param.mode = modeflag ? param::Pooling::Mode::AVERAGE : param::Pooling::Mode::MAX; param.window_h = param.window_w = 2; param.stride_h = param.stride_w = 2; param.pad_h = param.pad_w = 0; std::vector sizes = {10, 12, 13, 15, 20, 63}; for (size_t ih : sizes) for (size_t iw : sizes) { Checker checker(handle()); checker.set_rng(0, &rng); checker.set_rng(1, &rng); checker.set_rng(2, &rng); checker.set_dtype(0, dtype::Int8()); checker.set_dtype(1, dtype::Int8()); checker.set_param(param).exec(TensorShapeArray{{2, 3, ih, iw}, {}}); } } } #if MEGDNN_WITH_BENCHMARK TEST_F(CPU, BENCHMARK_POOLING_INT) { UniformIntRNG rng(0, 255); for (int modeflag = 0; modeflag < 2; ++modeflag) { param::Pooling param; if (modeflag) { param.mode = param::Pooling::Mode::MAX; std::cout << "mode=max" << std::endl; } else { param.mode = param::Pooling::Mode::AVERAGE; std::cout << "mode=avg" << std::endl; } param.window_h = param.window_w = 2; param.stride_h = param.stride_w = 2; param.pad_h = param.pad_w = 0; float time_int, time_float; { std::cout << "int: "; Benchmarker benchmarker(handle()); benchmarker.set_dtype(0, dtype::Int8()); benchmarker.set_dtype(1, dtype::Int8()); benchmarker.set_rng(0, &rng); benchmarker.set_rng(1, &rng); time_int = benchmarker.set_param(param).exec({{2, 3, 640, 480}, {}}); } { std::cout << "float: "; Benchmarker benchmarker(handle()); time_float = benchmarker.set_param(param).exec({{2, 3, 640, 480}, {}}); } printf("time: int=%.3fms float=%.3fms\n", time_int, time_float); } } #endif } // namespace test } // namespace megdnn // vim: syntax=cpp.doxygen