diff --git a/mace/ops/BUILD b/mace/ops/BUILD index a35e9cc3da4b9ac2a10cea7d971213e76b3dc9c7..ed251b51884016e01f8cc0dd56821bed3005a3ec 100644 --- a/mace/ops/BUILD +++ b/mace/ops/BUILD @@ -59,6 +59,7 @@ cc_test( srcs = glob(["*_benchmark.cc"]), deps = [ ":ops", + ":test", "//mace/core:core", "//mace/core:test_benchmark_main", ], diff --git a/mace/ops/conv_2d_benchmark.cc b/mace/ops/conv_2d_benchmark.cc index 49c80b67c9b969c0e9f3f3f733d63af9a0611395..8148c02df5800933b9c45be8ef5f827313c01e95 100644 --- a/mace/ops/conv_2d_benchmark.cc +++ b/mace/ops/conv_2d_benchmark.cc @@ -4,12 +4,12 @@ #include +#include "mace/core/operator.h" #include "mace/core/testing/test_benchmark.h" -#include "mace/kernels/conv_2d.h" -#include "mace/kernels/conv_pool_2d_util.h" +#include "mace/ops/conv_2d.h" +#include "mace/ops/ops_test_util.h" namespace mace { -namespace kernels { template static void Conv2d(int iters, int batch, int channels, int height, int width, @@ -17,8 +17,32 @@ static void Conv2d(int iters, int batch, int channels, int height, int width, Padding padding, int output_channels) { mace::testing::StopTiming(); + OpsTestNet net; + OpDefBuilder("Conv2d", "Conv2dTest") + .Input("Input") + .Input("Filter") + .Input("Bias") + .Output("Output") + .Finalize(net.operator_def()); + + // Add args + net.AddIntsArg("strides", {stride, stride}); + net.AddIntArg("padding", padding); + net.AddIntsArg("dilations", {1, 1}); + + // Add input data + net.AddRandomInput("Input", {batch, channels, height, width}); + net.AddRandomInput("Filter", {output_channels, channels, kernel_h, kernel_w}); + net.AddRandomInput("Bias", {output_channels}); + + // Worm-up + for (int i = 0; i < 5; ++i) { + net.RunOp(D); + } + mace::testing::StartTiming(); while(iters--) { + net.RunOp(D); } } @@ -36,7 +60,7 @@ static void Conv2d(int iters, int batch, int channels, int height, int width, BM_CONV_2D_MACRO(N, C, H, W, KH, KW, S, P, OC, TYPE, CPU); \ BM_CONV_2D_MACRO(N, C, H, W, KH, KW, S, P, OC, TYPE, NEON); +BM_CONV_2D(1, 3, 256, 256, 1, 1, 1, VALID, 64, float); BM_CONV_2D(1, 64, 32, 32, 1, 1, 1, VALID, 128, float); -} // namespace kernels } // namespace mace diff --git a/mace/ops/conv_2d_test.cc b/mace/ops/conv_2d_test.cc index 1aec07f84bbd2ddf2c8488c4e5dcabf6ab91016c..b8af88ae1f1e8deb79d8e3058cea45a702a1d34d 100644 --- a/mace/ops/conv_2d_test.cc +++ b/mace/ops/conv_2d_test.cc @@ -3,8 +3,8 @@ // #include "mace/core/operator.h" -#include "mace/ops/ops_test_util.h" #include "mace/ops/conv_2d.h" +#include "mace/ops/ops_test_util.h" using namespace mace; diff --git a/mace/ops/ops_test_util.h b/mace/ops/ops_test_util.h index 14ec485ce583447b1f91a22544b616621dfba7c7..dbec589db8fb54cee3b19fc935232be7a603d0c0 100644 --- a/mace/ops/ops_test_util.h +++ b/mace/ops/ops_test_util.h @@ -37,17 +37,33 @@ class OpDefBuilder { class OpsTestNet { public: + OpsTestNet() {} + template void AddInputFromArray(const char* name, const std::vector& shape, const std::vector& data) { Tensor* input = ws_.CreateTensor(name, cpu_allocator(), DataTypeToEnum::v()); input->Resize(shape); - float* input_data = input->mutable_data(); - // TODO check the dims + T* input_data = input->mutable_data(); + MACE_CHECK(input->size() == data.size()); memcpy(input_data, data.data(), data.size() * sizeof(T)); } + template + void AddRandomInput(const char* name, const std::vector& shape) { + Tensor* input = ws_.CreateTensor(name, cpu_allocator(), DataTypeToEnum::v()); + input->Resize(shape); + float* input_data = input->mutable_data(); + + std::random_device rd; + std::mt19937 gen(rd()); + std::normal_distribution nd(0, 1); + + std::generate(input_data, input_data + input->size(), + [&gen, &nd]{ return nd(gen); }); + } + void AddIntArg(const char* name, const int value) { auto arg = op_def_.add_arg(); arg->set_name(name); @@ -98,7 +114,7 @@ class OpsTestNet { if (!net_) { NetDef net_def; net_def.add_op()->CopyFrom(op_def_); - VLOG(0) << net_def.DebugString(); + VLOG(3) << net_def.DebugString(); net_ = CreateNet(net_def, &ws_, device); } return net_->Run();