/** * \file dnn/src/common/add_update.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 "megdnn/oprs.h" #include "src/common/add_update_helper.h" #include "src/common/utils.h" namespace megdnn { void AddUpdateForward::check_exec(const TensorLayout& dst, const TensorLayout& delta) { // delta can not be broadcasted to dst if dst.total_nr_elems() < // delta.total_nr_elems() megdnn_assert(dst.dtype == delta.dtype && dst.total_nr_elems() >= delta.total_nr_elems() && dst.is_non_overlapping_strong()); if (dst.dtype.category() == DTypeCategory::INT) { auto check_fv = [](float fv) { int iv = fv; megdnn_assert( float(iv) == fv && float(iv + 1) == fv + 1.f && float(iv - 1) == fv - 1.f, "bad arg value in AddUpdate: dtype is int, but value is %g " "which can not be precisely converted to int", fv); }; check_fv(m_param.alpha); check_fv(m_param.beta); check_fv(m_param.bias); } } ElemwiseOpParamN<2> AddUpdateForwardHelper::make_param( _megdnn_tensor_inout dst, _megdnn_tensor_in delta) { ElemwiseOpParamN<2> src; src[0] = dst; src[1] = delta; src[1].layout = src[1].layout.broadcast(dst.layout); src.init_from_given_tensor(); return src; } } // namespace megdnn // vim: syntax=cpp.doxygen