diff --git a/dnn/include/megdnn/common.h b/dnn/include/megdnn/common.h index 13e39ced..aa23912f 100644 --- a/dnn/include/megdnn/common.h +++ b/dnn/include/megdnn/common.h @@ -24,5 +24,24 @@ #define setenv(name,value,overwrite) _putenv_s(name,value) #endif +namespace megdnn { + +/*! + * \brief whether there is an algorithm from algo_pack() that is available for + * current size + */ +template +bool has_available_algo(Opr* opr, Args&&... args) { + const typename Opr::AlgoBase::SizeArgs size_args( + opr, std::forward(args)...); + for (auto i : Opr::algo_pack().all_algos) { + if (i->is_available(size_args)) { + return true; + } + } + return false; +} + +} // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/dnn/src/common/algo_chooser.h b/dnn/src/common/algo_chooser.h index 24a6c100..bc5dda09 100644 --- a/dnn/src/common/algo_chooser.h +++ b/dnn/src/common/algo_chooser.h @@ -16,6 +16,7 @@ #include #include +#include "megdnn/common.h" #include "utils.h" namespace megdnn { @@ -75,21 +76,6 @@ std::vector get_all_algorithms( } /*! - * \brief whether there is an algorithm from algo_pack() that is available for - * current size - */ -template -bool has_available_algo( - const typename Opr::AlgoBase::SizeArgs& args) { - for (auto i : Opr::algo_pack().all_algos) { - if (i->is_available(args)) { - return true; - } - } - return false; -} - -/*! * \brief a helper function to get an algorithm match attribute. If require a * algorithm with specified attribute, and the given algorithm match that * attribute, return the given algorithm. Otherwise return nullptr diff --git a/dnn/src/cuda/conv_bias/conv_nchwqs8.cpp b/dnn/src/cuda/conv_bias/conv_nchwqs8.cpp index adfa97ed..03c7aec4 100644 --- a/dnn/src/cuda/conv_bias/conv_nchwqs8.cpp +++ b/dnn/src/cuda/conv_bias/conv_nchwqs8.cpp @@ -134,13 +134,6 @@ bool ConvBiasForwardImpl::AlgoFallbackNCHWQS8::is_available( auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], - config.first[1], - config.first[2], - config.first[3], - config.first[4]}; bool is_relayout_ok = true; if (args.dst_layout->dtype.enumv() != DTypeEnum::Float32) { is_relayout_ok = relayout_format::RelayoutFormatFast::usable( @@ -148,7 +141,11 @@ bool ConvBiasForwardImpl::AlgoFallbackNCHWQS8::is_available( RelayoutFormat::Param::Mode::NCHW4_NCHW); } - return is_relayout_ok && has_available_algo(sub_args); + return is_relayout_ok && + has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2], + config.first[3], config.first[4]); } WorkspaceBundle ConvBiasForwardImpl::AlgoFallbackNCHWQS8::get_workspace_bundle( diff --git a/dnn/src/cuda/conv_bias/group_conv.cpp b/dnn/src/cuda/conv_bias/group_conv.cpp index 65b7b6aa..51c78a74 100644 --- a/dnn/src/cuda/conv_bias/group_conv.cpp +++ b/dnn/src/cuda/conv_bias/group_conv.cpp @@ -107,16 +107,12 @@ bool ConvBiasForwardImpl::AlgoGroupConvGeneral::is_available( auto conv_args = args; conv_args.dst_layout = &dst_layout; auto config = prepare_sub_opr(conv_args); - AlgoBase::SizeArgs sub_args{ + + bool ret = has_available_algo( static_cast(config.second.get()), - config.first[0], - config.first[1], - config.first[2], - config.first[3], - config.first[4]}; - - bool ret = has_available_algo(sub_args); - return ret; + config.first[0], config.first[1], config.first[2], config.first[3], + config.first[4]); + return ret; } WorkspaceBundle ConvBiasForwardImpl::AlgoGroupConvGeneral::get_workspace_bundle( diff --git a/dnn/src/cuda/convolution/backward_data/group_conv.cpp b/dnn/src/cuda/convolution/backward_data/group_conv.cpp index 6bfdced6..a87b01ec 100644 --- a/dnn/src/cuda/convolution/backward_data/group_conv.cpp +++ b/dnn/src/cuda/convolution/backward_data/group_conv.cpp @@ -82,11 +82,10 @@ bool ConvolutionBackwardDataImpl::AlgoGroupConvGeneral::is_available( } auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], config.first[1], config.first[2]}; - return has_available_algo(sub_args); + return has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2]); } WorkspaceBundle diff --git a/dnn/src/cuda/convolution/backward_filter/group_conv.cpp b/dnn/src/cuda/convolution/backward_filter/group_conv.cpp index 8d80ae1e..548e54b4 100644 --- a/dnn/src/cuda/convolution/backward_filter/group_conv.cpp +++ b/dnn/src/cuda/convolution/backward_filter/group_conv.cpp @@ -78,11 +78,10 @@ bool ConvolutionBackwardFilterImpl::AlgoGroupConvGeneral::is_available( } auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], config.first[1], config.first[2]}; - return has_available_algo(sub_args); + return has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2]); } WorkspaceBundle diff --git a/dnn/src/cuda/convolution3d/backward_data/group_conv.cpp b/dnn/src/cuda/convolution3d/backward_data/group_conv.cpp index 73b673ac..d76da0f0 100644 --- a/dnn/src/cuda/convolution3d/backward_data/group_conv.cpp +++ b/dnn/src/cuda/convolution3d/backward_data/group_conv.cpp @@ -73,11 +73,10 @@ bool Convolution3DBackwardDataImpl::AlgoGroupConvGeneral::is_available( } auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], config.first[1], config.first[2]}; - return has_available_algo(sub_args); + return has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2]); } WorkspaceBundle diff --git a/dnn/src/cuda/convolution3d/backward_filter/group_conv.cpp b/dnn/src/cuda/convolution3d/backward_filter/group_conv.cpp index a0adc7bd..3875d922 100644 --- a/dnn/src/cuda/convolution3d/backward_filter/group_conv.cpp +++ b/dnn/src/cuda/convolution3d/backward_filter/group_conv.cpp @@ -77,11 +77,10 @@ bool Convolution3DBackwardFilterImpl::AlgoGroupConvGeneral::is_available( } auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], config.first[1], config.first[2]}; - return has_available_algo(sub_args); + return has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2]); } WorkspaceBundle diff --git a/dnn/src/cuda/convolution3d/forward/group_conv.cpp b/dnn/src/cuda/convolution3d/forward/group_conv.cpp index 1c702148..c8d65f9e 100644 --- a/dnn/src/cuda/convolution3d/forward/group_conv.cpp +++ b/dnn/src/cuda/convolution3d/forward/group_conv.cpp @@ -80,11 +80,10 @@ bool Convolution3DForwardImpl::AlgoGroupConvGeneral::is_available( } auto config = prepare_sub_opr(args); - AlgoBase::SizeArgs sub_args{ - static_cast(config.second.get()), - config.first[0], config.first[1], config.first[2]}; - return has_available_algo(sub_args); + return has_available_algo( + static_cast(config.second.get()), + config.first[0], config.first[1], config.first[2]); } WorkspaceBundle