/** * \file dnn/test/cuda/correlation.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/cuda/fixture.h" #include "test/common/checker.h" #include "test/common/correlation.h" namespace megdnn { namespace test { TEST_F(CUDA, CORRELATION_FORWARD) { using namespace correlation; std::vector args = get_args(); Checker checker(handle_cuda()); for (auto&& arg : args) { checker.set_param(arg.param) .set_dtype(0, dtype::Float32()) .set_dtype(1, dtype::Float32()) .execs({arg.data1, arg.data2, {}}); } } TEST_F(CUDA, CORRELATION_BACKWARDDATA1) { ConstValue const_0{0}; using Param = CorrelationBackwardData1::Param; Param param; param.is_multiply = true; param.format = Param::Format::NCHW; param.stride1 = 2; param.stride2 = 2; param.kernel_size = 3; param.pad_size = 4; Checker checker(handle_cuda()); checker.set_epsilon(1e-2); uint32_t pad_size = param.pad_size; uint32_t kernel_size = param.kernel_size; uint32_t stride1 = param.stride1; uint32_t stride2 = param.stride2; uint32_t max_displacement = param.max_displacement; auto run = [&](DType dtype) { for (size_t N : {1, 3}) for (size_t C : {1, 3}) for (size_t OH : {10, 100}) for (size_t OW : {10, 100}) { int paddedbottomheight = OH + 2 * pad_size; int paddedbottomwidth = OW + 2 * pad_size; uint32_t kernel_radius = (kernel_size - 1) / 2; uint32_t border_size = max_displacement + kernel_radius; uint32_t top_width = ceil(static_cast(paddedbottomwidth - border_size * 2) / static_cast(stride1)); uint32_t top_height = ceil(static_cast(paddedbottomheight - border_size * 2) / static_cast(stride1)); uint32_t neighborhood_grid_radius = max_displacement / stride2; uint32_t neighborhood_grid_width = neighborhood_grid_radius * 2 + 1; uint32_t top_channels = neighborhood_grid_width * neighborhood_grid_width; checker.set_param(param) .set_dtype(0, dtype) .set_dtype(1, dtype) .set_dtype(2, dtype) .set_dtype(3, dtype) .execs({{N, top_channels, top_height, top_width}, {N, C, OH, OW}, {N, C, OH, OW}, {N, C, OH, OW}}); } }; run(dtype::Float32()); run(dtype::Float16()); checker.set_epsilon(5e-2); run(dtype::BFloat16()); } TEST_F(CUDA, CORRELATION_BACKWARDDATA2) { ConstValue const_0{0}; using Param = CorrelationBackwardData2::Param; Param param; param.is_multiply = true; param.format = Param::Format::NCHW; param.stride1 = 2; param.stride2 = 2; param.kernel_size = 3; param.pad_size = 4; Checker checker(handle_cuda()); checker.set_epsilon(1e-2); uint32_t pad_size = param.pad_size; uint32_t kernel_size = param.kernel_size; uint32_t stride1 = param.stride1; uint32_t stride2 = param.stride2; uint32_t max_displacement = param.max_displacement; auto run = [&](DType dtype) { for (size_t N : {1, 3}) for (size_t C : {1, 3}) for (size_t OH : {10, 100}) for (size_t OW : {10, 100}) { int paddedbottomheight = OH + 2 * pad_size; int paddedbottomwidth = OW + 2 * pad_size; uint32_t kernel_radius = (kernel_size - 1) / 2; uint32_t border_size = max_displacement + kernel_radius; uint32_t top_width = ceil(static_cast(paddedbottomwidth - border_size * 2) / static_cast(stride1)); uint32_t top_height = ceil(static_cast(paddedbottomheight - border_size * 2) / static_cast(stride1)); uint32_t neighborhood_grid_radius = max_displacement / stride2; uint32_t neighborhood_grid_width = neighborhood_grid_radius * 2 + 1; uint32_t top_channels = neighborhood_grid_width * neighborhood_grid_width; checker.set_param(param) .set_dtype(0, dtype) .set_dtype(1, dtype) .set_dtype(2, dtype) .set_dtype(3, dtype) .execs({{N, top_channels, top_height, top_width}, {N, C, OH, OW}, {N, C, OH, OW}, {N, C, OH, OW}}); } }; run(dtype::Float32()); run(dtype::Float16()); checker.set_epsilon(5e-2); run(dtype::BFloat16()); } } // namespace test } // namespace megdnn // vim: syntax=cpp.doxygen